实验环境:
<1> FreeModbus 1.5版本.
<2> ModbusPool 作为主机, (stm32f1)单片机作为从机.
<3> 使用RS485作为媒介进行通信.
<4> 使用9600波特率.
<5> 不管上位机还是下位机, 都不使用奇偶校验.
实验缘由:
如下图所示:
协议要求如果不使用奇偶校验位的话, 必须使用2位停止位.
我之前还没有在意这个, 赶紧实验下看看, 结果更没想到...
000.png (105.25 KB, 下载次数: 0)
下载附件
2017-7-26 14:47 上传
实验现象:
<1> 上位机(Modbus Pool)配置使用1位停止, 下位机(单片机)配置使用1位停止位.
<2> 上位机(Modbus Pool)配置使用1位停止, 下位机(单片机)配置使用2位停止位.
<3> 上位机(Modbus Pool)配置使用2位停止, 下位机(单片机)配置使用1位停止位.
<4> 上位机(Modbus Pool)配置使用2位停止, 下位机(单片机)配置使用2位停止位.
实验疑问:
上述4种情况经过验证, 数据都能正常通信, 并且不出现乱码. 请问大神, 该如何解释???
如果标准确实严格要求 11 位的长度的话,
那么你这样的情况,我只能说,设备是不符合标准的。
如果要 100% 符合标准的话,那么就是要 11 位。
但为什么这样也行,你还没看清串口传输的本质:
1、串口 line 默认是高电平,这也是 stop 位的逻辑。
2、当 line 由高到低跳变,就是 start 位,此时接收设备意识到一个新的 char 即将到来,这是第 1 个 bit 的传输单元。
3、紧接着按照波特率,分 8 个 bit 的传输单元,分别接收一个 char。
4、最后,在第 10 个 bit 的传输单元,line 要回到高电平,也就是 stop 位需要的逻辑
其中 char 数据,跟 start 位和 stop 位无关,而协议所谓的帧校验,校验的是这部分 char 数据。
stop 位需要回到高电平,后续数据的传输,才有可能重新触发 start 信号,即高到低的跳变。
也只有检测到 start,才会认为有 char 数据需要接收。所以你一个、两个停止位,line 线都是高电平,接收设备压根就不关心这个,只有下一个 char 要发送时,接收设备才会检测到 start 信号,才会开始接收。
一周热门 更多>