【HAL库】串口数据帧接收与分析处理算法

   日期:2020-09-12     浏览:288    评论:0    
核心提示:。。。

基于对串口FIFO的通信数据帧进行接收和分析处理
(关于串口FIFO使用可以参见作者另一篇博文)
算法流程:

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

重点分析:

memcmp()函数:
对数据帧类别进行判断,并做后续处理。

变量ucInterHead 和 usInterPos :
对数据帧帧头和帧尾位置进行定位。

串口FIFO中的InterRxBufferRead():
读取FIFO中一个字节数据。

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] = '\0';			
			printf("%s\r\n",string);
		#endif
	}	
	if(memcmp(ucaBuf, "SaveData", 6) == 0)
	{		
		#if 1	
			char string[20];
			memcpy(string,ucaBuf,usLen);
			string[usLen] = '\0';			
			printf("%s\r\n",string);
		#endif
	}
}
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))
		{
			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;	
	}
}

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服