下位机双串口转发数据缓存处理

背景

下位机有两个串口,串口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
记录地点:江苏淮安

转载于:https://www.cnblogs.com/ChYQ/p/6991398.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值