STM32
直播中

李娜

7年用户 1614经验值
私信 关注
[问答]

如何根据通信协议GetInterUARTMessage()函数对数据帧进行判断获取?

如何根据通信协议GetinterUARTMessage()函数对数据帧进行判断获取?
如何根据通信协议AnalyzeInterUARTMessage()函数对数据帧进行分类处理?

回帖(1)

刘文明

2021-12-9 10:46:14
算法流程:


  • 串口中断函数接收数据到FIFO。
  • 根据通信协议GetInterUARTMessage()函数对数据帧进行判断获取。
  • 根据通信协议AnalyzeInterUARTMessage()函数对数据帧进行分类处理。

重点分析:
memcmp()函数:
对数据帧类别进行判断,并做后续处理。
变量ucInterHead 和 usInterPos :
对数据帧帧头和帧尾位置进行定位。
串口FIFO中的InterRxBufferRead():
读取FIFO中一个字节数据。

void GetInterUARTMessage(void)
{
        uint8_t ucData;
        static uint8_t         ucInterHead = 0;
        static uint8_t         ucaInterBuf[512];
        static uint16_t  usInterPos = 0; //数据帧长度位置标志位
        while (1)
        {               
                if(InterRxBufferRead(&ucData)) //判断串口FIFO数据使用为空
                {
                        if (ucInterHead == 0) //判断帧头位置是否找到
                        {
                                if (ucData == '$')
                                {
                                        ucInterHead = 1;
                                        usInterPos = 0;
                                }
                        }
                        else
                        {
                                if (usInterPos < sizeof(ucaInterBuf)) //判断数据读取是否越界
                                {
                                        ucaInterBuf[usInterPos++] = ucData; //数据赋值
                                        if (ucData == '@') //判断是否找到帧尾
                                        {
                                                //数据帧接收成功,进入数据帧处理函数
                                                AnalyzeInterUARTMessage(ucaInterBuf, usInterPos-1);
                                                ucInterHead = 0;
                                        }
                                }
                                else
                                {
                                        ucInterHead = 0;
                                }
                        }
                        continue;
                }
                break;       
        }
}
void AnalyzeInterUARTMessage(uint8_t *ucaBuf, uint16_t usLen)
{
         //根据帧头后的数据标识,对数据帧进行分类处理
        if(memcmp(ucaBuf, "SetSleepTime", 12) == 0)
        {               
                #if 1                       
                        char string[20];
                        memcpy(string,ucaBuf,usLen);
                        string[usLen] = '';                       
                        printf("%srn",string);
                #endif
        }       
        if(memcmp(ucaBuf, "SaveData", 6) == 0)
        {               
                #if 1       
                        char string[20];
                        memcpy(string,ucaBuf,usLen);
                        string[usLen] = '';                       
                        printf("%srn",string);
                #endif
        }
}
举报

更多回帖

发帖
×
20
完善资料,
赚取积分