Linux系统下RS485串口读取数据乱序

环境:基于Linux系统,一个网关作为上位机进行周期读取数据操作,下位机设备进行周期性响应,两者通过485串口连接进行通信(波特率等设置是一致的)
问题:开始通信后,前几个小时(大概6小时左右)通信是正常的,之后通信开始持续出现异常,且异常频率逐渐增高,通过重启上位机进程可以恢复通信
定位:日志打印和并联一根额外串口线通过串口工具监听发现,下位机响应的报文是正确的,但上位机通过read函数读取到的数据出现了乱序、缺失,导致了通信出现错误

请问有相关经验的朋友为什么会出现这样的情况呢?

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/745073
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:论文笔记-理解和解决图卷积网络的性能退化问题
  • 除此之外, 这篇博客: 【数据结构与算法】->数据结构->哈夫曼树->哈夫曼编码&解码中的 Ⅱ 什么是哈夫曼树 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    在前面我们说了,哈夫曼树是二叉树的一种,那到底是什么是哈夫曼树呢?这里我给出一个定义:给定n个权值作为n个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。

    完全不知道这个定义在说什么。

    不要急,我们慢慢来。

    首先来看几个概念。

    • 路径:在一棵树中,一个结点到另一个结点之间的通路,称为路径。比如从根节点到 a ,就是一条路径。
    • 路径长度:在一条路径中,每经过一个结点,路径长度都要加 1 。例如在一棵树中,规定根结点所在层数为1层,那么从根结点到第 i 层结点的路径长度为 i - 1 。比如根节点到 c 和 d 都是 3。
    • 结点的权:给每一个结点赋予一个新的数值,被称为这个结点的权。比如 b 的权是 5。
    • 结点的带权路径长度:指的是从根结点到该结点之间的路径长度与该结点的权的乘积。比如 b 带权路径长度 = 2 * 5 = 10
    • 树的带权路径长度:指树中所有叶子结点的带权路径长度之和。通常记作 “WPL”。比如下图中的树的带权路径长度 WPL = 7 * 1 + 5 * 2 + 2 * 3 + 4 * 3 = 36。

    在这里插入图片描述
    所以,当用 n 个结点(都做叶子结点且都有各自的权值)试图构建一棵树时,如果构建的这棵树的带权路径长度最小,称这棵树为“最优二叉树”,也叫“哈夫曼树”。

    在构建哈夫曼树时,要使树的带权路径长度最小,只需要遵循一个原则,那就是:权重越大的结点离树根越近。在图 1 中,因为结点 a 的权值最大,所以理应直接作为根结点的孩子结点。

    有了这个概念,我们就可以开始构建哈夫曼树了。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

RS485的这个串口对应的上位机从接口多久读取一次数据,数据是放在缓存还是哪里?感觉这个是你缓存设置的问题,时间一长,缓存装不下了,数据就乱了!