实验环境:
<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 信号,才会开始接收。
楼主注意看下RS485的时序 当通信结束后总线被拉高 这个时候检测停止位 所以不管你配置1位还是2位都能被检测出来是停止位 只要不是连续不断的发送破坏总线空闲的状态
请忽略那个标注错误的 TTL电平
time + insight。
如果具备好的 insight,那么 time 会很短。
说到 insight,我再给你说一个问题:
我记得以前跟你说过标点符号的问题,你现在仍是英文模式,只不过有进步,变成:英文 + space。
这仍是不对的。
如果我是你的主管,你的文档这么写,内容都不用看了,直接打回去,整理好格式再来。
你好像一直没意识到这个问题,看看网络上、身边周围的人,多数人是跟你一样?还是不一样呢?
能不能意识到正统、主流的做法,这就是 insight 的一个体现。
你如果要说这样码字快的话,我想说的是:我们不是打字员,我们是程序员!
你可以看下:
阮一峰的这篇文章:「中文技术文档的写作规范」。
一周热门 更多>