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