netlhx 发表于 2015-1-8 08:58:48

UART如何接收不定长度的数据

如果要接收不定长度的数据,诸位有什么好的建议,有参考代码最好,谢谢!

AndyYau-268557 发表于 2015-1-8 11:34:19

那你的定义最大数组处理吧。和普通的一样,只是没法检验数据正确与否。

Angel_YY 发表于 2018-3-10 11:00:13

不定长数据接收需要靠判定串口接收超时。比如连续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; //发生了丢弃
      }
}


XinLiYF 发表于 2018-3-10 11:53:23

空闲总线中断,我封装的串口驱动
页: [1]
查看完整版本: UART如何接收不定长度的数据