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


    背景

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

  • 相关阅读:
    Mybatis(二)入门程序通过id查找用户、模糊查找用户、添加用户、删除用户
    excel测试数据导入
    (转)接口自动化测试之http请求实践总结
    (转)TestNG框架提供两种传入参数的方法:
    Jmeter 集成Excel读写接口参数返回值
    优化问题
    redux
    clientHeight offsetTop scrollTop
    antddesign
    ACMICPC实验室周赛2020.3.6
  • 原文地址:https://www.cnblogs.com/ChYQ/p/6991398.html
Copyright © 2020-2023  润新知