新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 串行通信波特率的一種自動檢測方法

        串行通信波特率的一種自動檢測方法

        作者: 時間:2012-06-06 來源:網絡 收藏

          串行通信是終端和主機之間的主要通信方式,通信一般選擇1800、4800、9600和 19200等。終端的類型有很多種,其通信速率也有很多種選擇。主機怎樣確定終端的通信速率呢?本文給出了一種簡單、易行的方法:設定主機的接收(以9600波特為例),終端發送一個特定的字符(以回車符為例),主機根據接收到的字符信息就可以確定終端的通信。本文對這種方法予以詳述。

        1 基本方法
          回車符的ASCII值為0x0D。串行通信時附加一個起始位和終止位,位的傳輸順序一般是 先傳低位再傳高位。此時回車符的二進制表示方式為:

        串行通信波特率的一種自動檢測方法

        圖1 回車符的位序列

          串行通信中一個二進制位的傳輸時間(記為T)取決于通信的波特率,9600波特時一個 二進制位的傳輸時間是19200波特時一個二進制位傳輸時間的兩倍,即:2*T19200=T 9600。因此,9600波特時一個位的傳輸時間,19200波特時可以傳輸兩個位。同樣地 ,9600波特傳輸兩個位的時間在4800波特時只能傳送一個位。主機設定接收波特率為9600, 終端只有也以9600波特發送的字符,主機才能正確地接收。發送波特率高于或低于9600都會 使主機接收到的字符發生錯誤。接收波特率為9600,終端以不同的波特率發送回車符時,主 機接收到的二進制序列如表1所示。
          從表1中可以看出,除了19200和1800波特時兩種特例情況,其他情形的二進制序列都是 9600波特時二進制序列的變換。取前十個二進制位與9600波特時的二進制位相對應。忽略缺 少停止位‘1’引發的數據幀錯誤,把接收到的字符表示成字節方式(如表1的最右列所示) 。例如:在為1200波特,接收速率為9600波特時,主機得到的字節是0x80,而不 是正確的回車符0x0D。因為在不同的下(9600,4800,2400,1200)得到的字節 不同,所以通過接收字符的判定就可以確定發送波特率。
          發送波特率為19200時,其發送速度正好是接收速度(9600波特)的兩倍,因此發送端 的兩個二進制位會被接收端看作一個。取決于不同的串行接口硬件,‘01’和‘10’這兩種 二進制位組合可能被認為是‘1’或者‘0’。幸運的是,只有0~4位存在這樣的歧義問題, 后面的位因為都是停止位,所以都是‘1’。因此,為19200波特時接收到的字符其高半個字節為0xF。低半個字節可能是多個值中的一個,但不會是0x0,因為0x0D中有相鄰 的兩個‘1’,這就會至少在低半個字節中產生一個‘1’。因此,整個字節的形式為0xF?, 且低半個字節不為0。

        表1  不同波特率下的二進制序列

        波特率

        接收到的二進制位序列

        字節表示

        19200

        0 1 0 1 1 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1

        0xF?

        9600

        0 1  0 1  1 0  0  0 0  1 

        0x0D

        4800

        0 0 1 1 0 0 1 1 1 1 0 0 0 0 0 0 0 0 1 1

        0xE6

        2400

        0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 1 1 1 1

        0x78

        1800

        0 0 0 0 0 x 1 1 1 1 x 0 0 0 0 0 1 1 1 1

        0xE0

        1800

        0 0 0 0 0 x 1 1 1 1 x 0 0 0 0 0 1 1 1 1

        0xF0

        1200

        0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0

        0x80

        600

        0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1

        0x00

        300

        0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

        0x00

        150

        0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

        0x00

        110

        0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

        0x00

          發送速率為1800波特時,因為
          T1800=T9600*16/3,
        而16/3不是整數,接收端二進制位的狀態轉換時刻和9600波特不一一對應,引起在接收端 的一個位接收周期內有狀態發生變化的可能。表1中給出的第六個位(表示為x)就是這種情 況。因為x有可能被看作‘1’,也有可能被看作‘0’,所以發送速率為1800波特時接收到 的字節可能是0xE0或者0xF0。波特率為3600和7200時也有同樣的問題,也可以采用同樣的方 法,但不確定的位數會增加,需要檢測的字節種類也會更多。3600波特和7200波特的傳輸速 率幾乎不采用,因此這個問題并不嚴重。只要發送波特率在1200~19200之間,我們都可以 通過接收到的一個字符對此波特率進行唯一的判定。


        上一頁 1 2 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 永清县| 灵武市| 石城县| 西藏| 郓城县| 清丰县| 博客| 蓝山县| 上蔡县| 高雄县| 涿鹿县| 营口市| 泰州市| 庄河市| 金寨县| 宝应县| 枣庄市| 闸北区| 友谊县| 卓资县| 陇西县| 天全县| 湘阴县| 乾安县| 平昌县| 汉川市| 沁水县| 绥江县| 巴东县| 荃湾区| 长丰县| 花莲县| 威海市| 黔南| 安义县| 商城县| 大埔县| 炎陵县| 贺州市| 苍山县| 天等县|