串行通信波特率的一種自動檢測方法
2 低波特率的檢測
當發(fā)送速率低于1200波特時,接收端收到的字節(jié)都是0x00,因此只能確定其速率低于12 00波特,而不可能再得到更多的信息。為了解決這個問題,可以在9600波特的速率下繼續(xù)接 收下一個字節(jié)信息。發(fā)送速率為600波特或更低時,一個位的發(fā)送時間要大于9600波特時整 個字節(jié)的接收時間。因此,發(fā)送端每一個從‘1’(終止位)到‘0’(起始位)的跳變都會 讓接收端認為一個新的字節(jié)開始了。表2所示為600波特或更低的傳輸速率時接收端回車符的 二進制序列(只給出開始的一些位)。
表2 低波特率回車符的接收方式
9600波特二進制序列 | 時間差 | 時間差 | |
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’的跳變在初始化以后即刻發(fā)生。這個跳變讓接收端 得到字節(jié)0x00。第二個跳變在初始化(16+16)*T9600秒以后發(fā)生,這會讓接收端認 為另外一個字節(jié)開始接收了。一個二進制位的接收時間是T9600,所以串行接口電路 會在第一個跳變以后10* T9600秒提示第一個字節(jié)接收完畢,在(16+16+10)* T96 00秒以后提示第二個字節(jié)接收完畢。因此600波特時,第一個字節(jié)接收完畢和第二個字節(jié) 接收完畢的時間差是(16+16+10-10)* T9600=32* T9600秒。表2的第三列所示 是把這個時間差以T9600的個數(shù)表示。因為T9600=1/9600秒=104.16毫秒,相 乘可以得到兩個字節(jié)接收完畢的實時間差。不同發(fā)送波特率的時間差如表2的最后一列所示 。有了這個時間差信息,就可以確定低傳輸速率時的波特率了:測定第一個和第二個字節(jié)的 接收時間差,然后在時間差常數(shù)表(表2)里查出哪個波特率下的時間差與之最相近,對應(yīng) 的就是終端發(fā)送波特率。即使測定的時間差有些誤差,一般也可以正確地確定波特率。
3 實現(xiàn)方式
通過以上分析,各種波特率都可以通過回車符的發(fā)送和接收信息來測定,算法實現(xiàn)的偽 代碼在本文的最后給出。應(yīng)用實踐證明了這種方法的有效性。
; Pseudo code to determine what baud rate a transmitter is at,
on the b asis of a single
; RETURN (0x0D) character received from it.
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■
參考文獻:
[1]趙依軍等. 單片微機接口技術(shù)[M].北京: 人民郵電出版社,1989.
[2]劉利. 軟硬件技術(shù)參考大全[M].北京: 學(xué)苑出版社,1993.
[3]張世一. 數(shù)字信號處理[M]. 北京:北京工業(yè)學(xué)院出版社,1987
評論