串口数据接收的常用处理方式

在这里插入图片描述

串口接收常用方式

串口数据接收的常用方式有三种:

  1. 使用状态机机制
  2. 通过判断结束字符的方式
  3. 通过数据接收超时的方式

三种方式的优缺点

使用状态机机制,这种方式常用于接收16进制数据的情况,比较典型的例子是modbus-rtu数据的接收。这种方式能够及时的处理接收到的数据,但是写程序太繁琐,而且通用性差,不同的协议状态机就不一样。使用状态机机制接收数据,可以参考libmodbus的代码。

通过判断结束字符的方式,这种机制常用于接收字符型数据的情况,典型的例子有:AT指令的接收,网络数据的接收等。通过判断\r\n来确定一帧数据。这种方式通常不用于16进制数据的接收,因为无论选择什么数作为结束字符,都有可能出现在数据域中。

通过数据接收超时的方式,这种方式通过接收一个数据之后若干时间没有再接收到新的数据,就认为这一帧的数据接收完成。这种方式最简单,但是有个弊端,就是不能对接收到的数据进行及时的处理,而且不能处理数据帧连续发送的情况,这种情况很容易造成缓冲区的溢出。

总结

总结一下,如果是接收16进制数据组成的数据帧,通常使用状态机的方式。使用字符组成的数据帧,通常通过"判断结束字符"完成一帧数据的接收。但是要注意,**无论是使用状态机机制还是"判断结束字符"的方式,都要进行超时判断。**这是因为当使用状态机机制接收到错误数据时,会进入错误的状态,这就有可能永远无法恢复到正常状态。这时可以通过接收超时的方式,将状态机的状态重置。判断结束字符的情况也一样,在接收出错的时候可以通过接收超时的方式,对错误进行处理。当追求简单的时候可以只使用"数据接收超时"的方式对数据进行处理,但是要注意这种方式的局限性。

代码参考

libmodbus的github库

https://github.com/stephane/libmodbus
其中接收函数是modbus.c中的函数int _modbus_receive_msg(modbus_t *ctx, uint8_t *msg, msg_type_t msg_type)

ESP8266的AT指令处理github库

https://github.com/espressif/ESP8266_AT
其中接收函数是at_port.c中的函数static void ICACHE_FLASH_ATTR at_recvTask(os_event_t *events)

我写的通过数据接收超时的方式的github库

https://github.com/xiaoLBGitHub/get_uart_data_with_frame

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值