环境:基于Linux系统,一个网关作为上位机进行周期读取数据操作,下位机设备进行周期性响应,两者通过485串口连接进行通信(波特率等设置是一致的)
问题:开始通信后,前几个小时(大概6小时左右)通信是正常的,之后通信开始持续出现异常,且异常频率逐渐增高,通过重启上位机进程可以恢复通信
定位:日志打印和并联一根额外串口线通过串口工具监听发现,下位机响应的报文是正确的,但上位机通过read函数读取到的数据出现了乱序、缺失,导致了通信出现错误
请问有相关经验的朋友为什么会出现这样的情况呢?
环境:基于Linux系统,一个网关作为上位机进行周期读取数据操作,下位机设备进行周期性响应,两者通过485串口连接进行通信(波特率等设置是一致的)
问题:开始通信后,前几个小时(大概6小时左右)通信是正常的,之后通信开始持续出现异常,且异常频率逐渐增高,通过重启上位机进程可以恢复通信
定位:日志打印和并联一根额外串口线通过串口工具监听发现,下位机响应的报文是正确的,但上位机通过read函数读取到的数据出现了乱序、缺失,导致了通信出现错误
请问有相关经验的朋友为什么会出现这样的情况呢?
在前面我们说了,哈夫曼树是二叉树的一种,那到底是什么是哈夫曼树呢?这里我给出一个定义:给定n个权值作为n个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。
完全不知道这个定义在说什么。
不要急,我们慢慢来。
首先来看几个概念。
所以,当用 n 个结点(都做叶子结点且都有各自的权值)试图构建一棵树时,如果构建的这棵树的带权路径长度最小,称这棵树为“最优二叉树”,也叫“哈夫曼树”。
在构建哈夫曼树时,要使树的带权路径长度最小,只需要遵循一个原则,那就是:权重越大的结点离树根越近。在图 1 中,因为结点 a 的权值最大,所以理应直接作为根结点的孩子结点。
有了这个概念,我们就可以开始构建哈夫曼树了。