UART如何接收不定长度的数据
如果要接收不定长度的数据,诸位有什么好的建议,有参考代码最好,谢谢!那你的定义最大数组处理吧。和普通的一样,只是没法检验数据正确与否。 不定长数据接收需要靠判定串口接收超时。比如连续20ms没有接收到数据判定数据接收完成。数据可以根据需要添加数据头和数据尾以及校验。建议代码如下
void TI_1MS_OnInterrupt(void)
{
//RS485接收命令超时判断,由于串口数据没有固定格式,这里采用时间分割,
//假设9600波特率,接收一字节用时约为1ms,如果连续10毫秒都没有新数据,说明本次交易命令接收完成
if(usTimeCntOf485<10){ //如果接收到了485串口数据
usTimeCntOf485++; //计时开始
}else if(usTimeCntOf485==10){//如果等待达到10毫秒
RS485Recv.ucStatFlg=1; //数据传送完成,交给主程序去轮训处理。
//AS_485_ClearRxBuf(); //清空缓冲
usTimeCntOf485=1001; //重置计时变量
}
}
void AS_485_OnRxChar(void)
{
/* Write your code here ... */
AS_485_TComData ch;
usTimeCntOf485=0;//给接收计时变量清零
if(AS_485_RecvChar(&ch) == ERR_OK)//如果接收到串口字符
//AS_485_SendChar(ch);//发送回去,只在调试时使用
if(RS485Recv.ucStatFlg==0){//如果当前数据缓冲允许接收
if(RS485Recv.ucDataLen<MSGBUFFERMAXLEN){ //如果接收到的数据不足32字节,继续接收,直到超时
RS485Recv.ucMsgBuffer=ch;//把接收到的字符保存到结构体的缓冲区中。
RS485Recv.ucDataLen++;//更改接收到字符的长度变量,这里保存的是接收到了多少字节数据。
}else//如果一次性连续接收超过32字节,数据丢弃,防止缓冲区溢出。
{
RS485Recv.ucDataLen=MSGBUFFERMAXLEN+1; //标记字符长度为最大长度+1,通过这个值可以判断是否接收溢出了。
}
}else{//如果当前数据缓冲不允许接收,例如主线程还没有处理完,此时只能丢弃
RS485Recv.ucStatFlg=2; //发生了丢弃
}
}
空闲总线中断,我封装的串口驱动
页:
[1]