📄
字号:
<P align=center>接收到的二进制位序列</P></TD>
<TD align=middle width=70>
<P align=center>字节表示</P></TD></TR>
<TR>
<TD align=middle width=71>
<P align=center>19200</P></TD></CENTER>
<TD align=middle width=288>
<P align=center>0 1 0 1 1 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1</P></TD>
<CENTER>
<TD align=middle width=70>
<P align=center>0xF?</P></TD></TR>
<TR>
<TD align=middle width=71>
<P align=center>9600</P></TD></CENTER>
<TD align=middle width=288>
<P align=center>0 1 0 1 1 0 0 0 0 1 </P></TD>
<CENTER>
<TD align=middle width=70>
<P align=center>0x0D</P></TD></TR>
<TR>
<TD align=middle width=71>
<P align=center>4800</P></TD></CENTER>
<TD align=middle width=288>
<P align=center>0 0 1 1 0 0 1 1 1 1 0 0 0 0 0 0 0 0 1 1</P></TD>
<CENTER>
<TD align=middle width=70>
<P align=center>0xE6</P></TD></TR>
<TR>
<TD align=middle width=71>
<P align=center>2400</P></TD></CENTER>
<TD align=middle width=288>
<P align=center>0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 1 1 1 1</P></TD>
<CENTER>
<TD align=middle width=70>
<P align=center>0x78</P></TD></TR>
<TR>
<TD align=middle width=71>
<P align=center>1800</P></TD></CENTER>
<TD align=middle width=288>
<P align=center>0 0 0 0 0 x 1 1 1 1 x 0 0 0 0 0 1 1 1 1</P></TD>
<CENTER>
<TD align=middle width=70>
<P align=center>0xE0</P></TD></TR>
<TR>
<TD align=middle width=71>
<P align=center>1800</P></TD></CENTER>
<TD align=middle width=288>
<P align=center>0 0 0 0 0 x 1 1 1 1 x 0 0 0 0 0 1 1 1 1</P></TD>
<CENTER>
<TD align=middle width=70>
<P align=center>0xF0</P></TD></TR>
<TR>
<TD align=middle width=71>
<P align=center>1200</P></TD></CENTER>
<TD align=middle width=288>
<P align=center>0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0</P></TD>
<CENTER>
<TD align=middle width=70>
<P align=center>0x80</P></TD></TR>
<TR>
<TD align=middle width=71>
<P align=center>600</P></TD></CENTER>
<TD align=middle width=288>
<P align=center>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1</P></TD>
<CENTER>
<TD align=middle width=70>
<P align=center>0x00</P></TD></TR>
<TR>
<TD align=middle width=71>
<P align=center>300</P></TD></CENTER>
<TD align=middle width=288>
<P align=center>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</P></TD>
<CENTER>
<TD align=middle width=70>
<P align=center>0x00</P></TD></TR>
<TR>
<TD align=middle width=71>
<P align=center>150</P></TD></CENTER>
<TD align=middle width=288>
<P align=center>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</P></TD>
<CENTER>
<TD align=middle width=70>
<P align=center>0x00</P></TD></TR>
<TR>
<TD align=middle width=71>
<P align=center>110</P></TD></CENTER>
<TD align=middle width=288>
<P align=center>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</P></TD>
<CENTER>
<TD align=middle width=70>
<P align=center>0x00</P></TD></TR></TBODY></TABLE></CENTER></DIV>
<P
align=left> 发送速率为1800波特时,因为<BR> T<SUB>1800</SUB>=T<SUB>9600</SUB>*16/3,<BR>而16/3不是整数,接收端二进制位的状态转换时刻和9600波特不一一对应,引起在接收端
的一个位接收周期内有状态发生变化的可能。表1中给出的第六个位(表示为x)就是这种情
况。因为x有可能被看作‘1’,也有可能被看作‘0’,所以发送速率为1800波特时接收到
的字节可能是0xE0或者0xF0。波特率为3600和7200时也有同样的问题,也可以采用同样的方
法,但不确定的位数会增加,需要检测的字节种类也会更多。3600波特和7200波特的传输速
率几乎不采用,因此这个问题并不严重。只要发送波特率在1200~19200之间,我们都可以 通过接收到的一个字符对此波特率进行唯一的判定。
<P><STRONG>2 低波特率的检测</STRONG><BR> 当发送速率低于1200波特时,接收端收到的字节都是0x00,因此只能确定其速率低于12
00波特,而不可能再得到更多的信息。为了解决这个问题,可以在9600波特的速率下继续接
收下一个字节信息。发送速率为600波特或更低时,一个位的发送时间要大于9600波特时整
个字节的接收时间。因此,发送端每一个从‘1’(终止位)到‘0’(起始位)的跳变都会
让接收端认为一个新的字节开始了。表2所示为600波特或更低的传输速率时接收端回车符的 二进制序列(只给出开始的一些位)。</P>
<P align=center>表2 低波特率回车符的接收方式</P>
<DIV align=center>
<CENTER>
<TABLE borderColor=#808080 height=148 cellSpacing=0 cellPadding=0
width=471 border=1>
<TBODY>
<TR>
<TD align=middle width=62 height=32>
<P align=center>波特率</P></TD>
<TD align=middle width=226 height=32>
<P align=center>9600波特二进制序列</P></TD>
<TD align=middle width=71 height=32>
<P align=center>时间差<BR>(周期)</P></TD>
<TD align=middle width=102 height=32>
<P align=center>时间差<BR>(实时间)</P></TD></TR>
<TR>
<TD align=middle width=62 height=17>
<P align=center>600</P></TD></CENTER>
<TD align=middle width=226 height=17>
<P align=center>16 0's 16 1's 16 0's</P></TD>
<CENTER>
<TD align=middle width=71 height=17>
<P align=center>32</P></TD>
<TD align=middle width=102 height=17>
<P align=center>3.33ms</P></TD></TR>
<TR>
<TD align=middle width=62 height=17>
<P align=center>300</P></TD></CENTER>
<TD align=middle width=226 height=17>
<P align=center>32 0's 32 1's 32 0's</P></TD>
<CENTER>
<TD align=middle width=71 height=17>
<P align=center>64</P></TD>
<TD align=middle width=102 height=17>
<P align=center>6.66ms</P></TD></TR>
<TR>
<TD align=middle width=62 height=17>
<P align=center>150</P></TD></CENTER>
<TD align=middle width=226 height=17>
<P align=center>64 0's 64 1's 64 0's</P></TD>
<CENTER>
<TD align=middle width=71 height=17>
<P align=center>128</P></TD>
<TD align=middle width=102 height=17>
<P align=center>13.33ms</P></TD></TR>
<TR>
<TD align=middle width=62 height=17>
<P align=center>110</P></TD></CENTER>
<TD align=middle width=226 height=17>
<P align=center>87 0's 87 1's 87 0's</P></TD>
<CENTER>
<TD align=middle width=71 height=17>
<P align=center>174</P></TD>
<TD align=middle width=102 height=17>
<P align=center>18.13ms</P></TD></TR>
<TR>
<TD align=middle width=62 height=18>
<P align=center>75</P></TD></CENTER>
<TD align=middle width=226 height=18>
<P align=center>128 0's 128 1's 128 0's</P></TD>
<CENTER>
<TD align=middle width=71 height=18>
<P align=center>256</P></TD>
<TD align=middle width=102 height=18>
<P align=center>26.66ms</P></TD></TR>
<TR>
<TD align=middle width=62 height=16>
<P align=center>50</P></TD></CENTER>
<TD align=middle width=226 height=16>
<P align=center>192 0's 192 1's 192 0's</P></TD>
<CENTER>
<TD align=middle width=71 height=16>
<P align=center>384</P></TD>
<TD align=middle width=102 height=16>
<P align=center>4
0.00ms</P></TD></TR></TBODY></TABLE></CENTER></DIV>
<P align=left> 600波特时,第一个从‘1’到‘0’的跳变在初始化以后即刻发生。这个跳变让接收端
得到字节0x00。第二个跳变在初始化(16+16)*T<SUB>9600</SUB>秒以后发生,这会让接收端认
为另外一个字节开始接收了。一个二进制位的接收时间是T<SUB>9600</SUB>,所以串行接口电路 会在第一个跳变以后10*
T<SUB>9600</SUB>秒提示第一个字节接收完毕,在(16+16+10)* T<SUB>96
00</SUB>秒以后提示第二个字节接收完毕。因此600波特时,第一个字节接收完毕和第二个字节
接收完毕的时间差是(16+16+10-10)* T<SUB>9600</SUB>=32*
T<SUB>9600</SUB>秒。表2的第三列所示
是把这个时间差以T<SUB>9600</SUB>的个数表示。因为T<SUB>9600</SUB>=1/9600秒=104.16毫秒,相
乘可以得到两个字节接收完毕的实时间差。不同发送波特率的时间差如表2的最后一列所示
。有了这个时间差信息,就可以确定低传输速率时的波特率了:测定第一个和第二个字节的
接收时间差,然后在时间差常数表(表2)里查出哪个波特率下的时间差与之最相近,对应
的就是终端发送波特率。即使测定的时间差有些误差,一般也可以正确地确定波特率。
<P><STRONG>3 实现方式</STRONG><BR> 通过以上分析,各种波特率都可以通过回车符的发送和接收信息来测定,算法实现的伪
代码在本文的最后给出。应用实践证明了这种方法的有效性。<BR>; Pseudo code to determine what baud
rate a transmitter is at,</P>
<P align=right>on the b asis of a single</P>
<P align=left>; RETURN (0x0D) character received from
it.<BR><BR>Initialise receive baud rate to 9600<BR>Wait for Byte to
be received<BR>IF Byte = 0x00 THEN<BR> Start
Timer<BR> REPEAT<BR> UNTIL (Timer > 50 ms OR New Byte
Received)<BR> CASE Timer IN<BR> 1 ms-4 ms:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -