串行通信波特率的一种自动检测方法
间差 时间差 600 16 0's 16 1's 16 0's 32 3.33ms 300 32 0's 32 1's 32 0's 64 6.66ms 150 64 0's 64 1's 64 0's 128 13.33ms 110 87 0's 87 1's 87 0's 174 18.13ms 75 128 0's 128 1's 128 0's 256 26.66ms 50 192 0's 192 1's 192 0's 384 4 0.00ms 600波特时,第一个从‘1’到‘0’的跳变在初始化以后即刻发生。这个跳变让接收端 得到字节0x00。第二个跳变在初始化(16+16)*T9600秒以后发生,这会让接收端认 为另外一个字节开始接收了。一个二进制位的接收时间是T9600,所以串行接口电路 会在第一个跳变以后10* T9600秒提示第一个字节接收完毕,在(16+16+10)* T96 00秒以后提示第二个字节接收完毕。因此600波特时,第一个字节接收完毕和第二个字节 接收完毕的时间差是(16+16+10-10)* T9600=32* T9600秒。表2的第三列所示 是把这个时间差以T9600的个数表示。因为T9600=1/9600秒=104.16毫秒,相 乘可以得到两个字节接收完毕的实时间差。不同发送波特率的时间差如表2的最后一列所示 。有了这个时间差信息,就可以确定低传输速率时的波特率了:测定第一个和第二个字节的 接收时间差,然后在时间差常数表(表2)里查出哪个波特率下的时间差与之最相近,对应 的就是终端发送波特率。即使测定的时间差有些误差,一般也可以正确地确定波特率。 3 实现方式 on the b asis of a single ; RETURN (0x0D) character received from it. 参考文献: [1]赵依军等. 单片微机接口技术[M].北京: 人民邮电出版社,1989.
(周期)
(实时间)
通过以上分析,各种波特率都可以通过回车符的发送和接收信息来测定,算法实现的伪 代码在本文的最后给出。应用实践证明了这种方法的有效性。
; Pseudo code to determine what baud rate a transmitter is at,
Initialise receive baud rate to 9600
Wait for Byte to be received
IF Byte = 0x00 THEN
Start Timer
REPEAT
UNTIL (Timer > 50 ms OR New Byte Received)
CASE Timer IN
1 ms-4 ms: 600 Baud
5 ms-10 ms: 300 Baud
11 ms-15 ms: 150 Baud
16 ms-22 ms: 110 Baud
23 ms-32 ms: 75 Baud
33 ms-49 ms: 50 Baud
ELSE: Timed out; reset
END CASE;
ELSIF Byte >= 0xF1 THEN
19200 Baud
ELSE
CASE Byte IN
0x0D: 9600 Baud
0xE6: 4800 Baud
0x78: 2400 Baud
0xE0,0xF0: 1800 Baud
0x80: 1200 Baud
ELSE: Line noise; reset
END CASE
END IF■
[2]刘利. 软硬件技术参考大全[M].北京: 学苑出版社,1993.
[3]张世一. 数字信号处理[M]. 北京:北京工业学院出版社,1987
- 基于比较器自动检测插入附件控制系统的整体功耗设计(12-15)
- 基于51单片机家具门屉耐用性自动检测装置程序设计(11-23)
- 基于单片机空气质量检测系统(10-15)
- 基于AT89S52温度自动控制检测系统设计(08-23)
- 基于51单片机的FIash存储器坏块自动检测(11-26)
- 详解波特率发生器编程/计算/波特率选择(10-14)