我以前一直以为计算机等的信号传输速率都是非常快的,不用计算时间差。
然而在实际应用中发现信息是需要传输时间的,而这些时间somehow是可以计算的。
前提信息
波特率 9600;
控制器和执行器通过RS485通信;
控制器发出同步的命令为sync;
RS485: 1 bit start bit, 8 bits length, 1 bit stop bit, no parity check; 所以传输一次需要 10 bits的时间;
情景
控制器Control Unit 通过RS485与执行器Actuator通信,控制器在SyncTimeMark
这个时间点发出一个命令,说我需要在SkewTime
之后进行某个动作,而这个动作根据实际工况可能200ms就需要做一次。
执行器收到这个命令的时候已经在SyncTimeMark
之后又过了一个信息传输时间,我们称这个传输时间为TransferTime
,开始接到这个信号的时间点为ReceiveTime
。而一条信息可能长这样: 0x00 0x11 0x22 0x33 0x44 0x55 0x7F
。这样起始位为0x00,结束位为0x7F,一条信息总共占7个character,也就是7个bytes, 也就是需要传输7次,因为RS485一个数据帧有效数据只有8个bits。而传输一次需要加上起始位,也就是需要10 bits时间。总共需要70 bits的时间。
time of 1 bit = 1/baud rate = 1/9600 = 0.104 ms;
time of 70 bits = 70 * 0.104 = 7.3 ms;
在一个200ms的动作周期里延迟7ms其实是很大的一个延迟了, 所以我们才需要计算信号延迟时间。
如何计算
BaudSkew = 1/BaudRate;
SkewWidth = SkewWidth + BaudSkew * 10 bits; //从接到信息开始信号就开始计算
SyncTimeMark = ReceiveTime - SkewWidth;
summery
在实际应用里,这个计算肯定会再稍微复杂一些,但是原理就差不多。
这里有一个名词:
“Overrun time" is to represent the additional time that need to process a received character.