背景
下位机有两个串口,串口1会接收到设备大量的GB2312编码数据,每一帧数据以0x0D
结尾,当串口1接收到一帧数据后,由串口2发送到上位机,让上位机显示。本篇就如何缓存串口1发送来的数据,使串口2能正确转发给上位机做个记录。
正文
-
逻辑没问题但实际有问题的做法
由于设备发送到串口1的编码数据显示的是设备当前各种状态,因此每帧数据大小不定,而且什么时候发送也不确定,所以,串口1需要建立一个缓存区,缓存数据,接收到帧尾0x0D
后,将串口1缓存区的数据copy到串口2发送缓存区,主循环随时监测串口2发送状态,并随时准备转发。
实际运行效果却差强人意,会碰到数据被覆盖的情况,即当串口2在主循环发送数据时,此时串口1又来数据了,那么就会覆盖掉串口2发送缓存区内的数据。 -
改进做法
在串口1做两个接收缓存区,串口1收到数据后,将数据保存进缓存区1,主循环串口2开始发送数据串口1缓存区1的数据,并将串口1的接收缓存区切换到缓存区2,发送完串口1缓存区1后,如若串口1接收到完整帧,则主循环会发送串口1缓存区2的数据,并将串口1的接收缓存区切换到缓存区1。
此处需要注意到一点,当串口1的缓存区2接收到帧尾0x0D
时,会置位串口1标志位可以发送,此时如若串口1在接收到帧尾后的第一条数据时,应检测串口1的标志位是否处于可发送状态,并判定接收缓存区是否和上次相同,如若相同,说明主循环还未发送完缓存区1内的数据,此时应将可以发送的标志位置位回FALSE
状态,避免接收缓存区2内接收到一部分数据,接收缓存区1又接收到另外一部数据。 -
源代码
由于这种实现方式标志位会比较多,不太好阅读,因此源代码不再贴出,记录并分享此方法为主。
至此记录完毕。
参考链接
- 无
记录时间:2017-6-12
记录地点:江苏淮安