基于未知上位機(jī)串行通信波特率檢測(cè)
1 串口通信
串口通信是以幀為單位。幀由4部分組成:起始位,停止位,數(shù)據(jù)位及校驗(yàn)位。其校驗(yàn)位可有可無(wú),通常終端設(shè)置為無(wú)。如回車(chē)符的發(fā)送,回車(chē)符的ASC II值為0x0D。串行通信時(shí)附加一個(gè)起始位和終止位,位的傳輸順序一般是先傳低位再傳高位。此時(shí)回車(chē)符的二進(jìn)制表示方式如圖1所示。
本文引用地址:http://m.butianyuan.cn/article/201706/353789.htm利用單片機(jī)的串口或串口調(diào)試工具接收數(shù)據(jù)時(shí),如果幀格式不正確,通常只會(huì)將此幀數(shù)據(jù)丟棄,不報(bào)告出錯(cuò),并且不允許單片機(jī)做其他的工作,同樣,不能同時(shí)用不同的波特率接收數(shù)據(jù)。若在電平跳變時(shí)采樣,則采樣其前一時(shí)刻的電平,當(dāng)停止位是0時(shí),等待一個(gè)其1/2波特率是電平應(yīng)持續(xù)的時(shí)間后再判斷起始位。本方案基于此方法利用軟件實(shí)現(xiàn)普通管腳的串口使用。
串行通信是終端和主機(jī)之間的主要通信方式,通信波特率一般選擇110 b/s,300×2n(n=0,…,7)b/s,利用串口協(xié)議及接收數(shù)據(jù)的特點(diǎn),采用高速接收的方法進(jìn)行波特率的自動(dòng)識(shí)別與檢測(cè)。
2 基于波特率串口通訊分析
串行通信中一個(gè)二進(jìn)制位的傳輸時(shí)間T取決于通信的波特率,如9 600 b/s時(shí)一個(gè)二進(jìn)制位的傳輸時(shí)間是19 200 b/s時(shí)一個(gè)二進(jìn)制位傳輸時(shí)間的兩倍,即2×T19200=T9600。在串行通信中,若主機(jī)設(shè)定接收波特率為9 600 b/s,終端只能以9 600 b/s發(fā)送數(shù)據(jù),只有這樣才能保證主機(jī)正確地接收數(shù)據(jù)。表1中列舉不同發(fā)送、接收波特率情況下接收的數(shù)據(jù)。
以n b/s發(fā)送序列m:Ox1x2x3x4x5x6x7x81,則2n b/s接收到的序列mm:00 x1x1x2x2x3x3x4x4x5x5x6x6x7x7x8x811。若n b/s接到的數(shù)是oxf0~oxf8的字節(jié), 即序列m是0x1x2x3x411111, 則mm是00x1x1x2x2x3x3x4x1111111111。
以n/2 b/s發(fā)送序列m:0x1x2x3x4x5x6x7x81,n b/s接到的序列mm:00 x1x1x2x2x3x3x4x4x5x5x6x6x7x7x8x811,2π b/s接到韻第一個(gè)字符序列:x2x1x1x1x1000,欲使幀結(jié)構(gòu)正確,x2須是1。同樣欲使x4x4 x3x3x2x2 x1x1 0不小于oxf0且?guī)Y(jié)構(gòu)正確,x4,x3,x2必須是1時(shí)收到的數(shù)才不大于oxf8。假設(shè)x5,x6,x7,x8有一個(gè)是0,則還能接收數(shù)據(jù),例如x6是0,則還能收到一個(gè)字節(jié),此字節(jié)是11x8x8x7x7x6x60,在保證接收到的數(shù)據(jù)不小于oxf0的情況下,必須使x8x7是1,此數(shù)據(jù)大于oxf8。若x5是1,x6是0,收到的第二個(gè)字節(jié)是1111x8x8 x7x70,若使其不小于oxf0,則x8須是1,測(cè)試仍大于oxf8。若x5,x6是1,x7是0,此時(shí)收到的字符是11111x8x80,不大于oxf8。若x5,x6,x7是1,x8是0,收到的字符是11111110,是oxfe。
以同樣的分析方法,可以得出n/3 b/s,n/4 b/s,3n b/s發(fā)送序列情況下,所接收的序列及數(shù)據(jù)。
3 算法設(shè)計(jì)
由上面分析可設(shè)計(jì)出檢測(cè)算法:首先,從高的波特率逐個(gè)嘗試,判斷波特率是不是發(fā)送的波特率,若不是嘗試其二分之一的波特率,重復(fù)上面的過(guò)程。其次57 600 b/s與38 400 b/s不是相差一倍,需要單獨(dú)測(cè)試。最后,115 200 b/s與57 600 b/s單獨(dú)測(cè)試,若均被排除,從38 400 b/s開(kāi)始新一輪的測(cè)試。若57 600 b/s不能被排除,多次則比較是57 600 b/s與38 400 b/s,以確定其中一個(gè)。若能排除57 600 b/s,從38 400 b/s開(kāi)始測(cè)試。若均被排除,從19 200 b/s開(kāi)始測(cè)試。檢測(cè)算法示意圖如圖2所示。
若接收波特率是發(fā)送波特率的16倍或16倍以上,因起始位是0,將會(huì)接到10個(gè)以上的連續(xù)0,幀格式不正確,只需接收一個(gè)字符就可否定當(dāng)前波特率。若接收波特率是發(fā)送波特率的8倍,若想使其發(fā)送的波特率的4倍與8倍波特接收的字符合法,不能有兩個(gè)或兩個(gè)以上的連續(xù)的0出現(xiàn),且最低位為1又要使4倍波特接收的數(shù)不小于f0,可能發(fā)送的字節(jié)只有DB BB 7B B7 776F FB F7 EF DF BF 7F FF這13種。即接收一個(gè)字節(jié)不能排除當(dāng)前波特率的概率約為5%。接收波特率分別是發(fā)送波特率的2倍與4倍時(shí),若使2倍波特接收的字節(jié)不小于f8,則發(fā)送的格式須為0x111,故有13種情況,與上輪相同。若接收波特率分別為發(fā)送的2倍與相同時(shí),符合條件的字符有F8 F9 FA FB FC FD FE FF8種,接收一個(gè)字符不拋棄2倍波特率的概率為1/32。若是38 400 b/s,接收一個(gè)字符就可排除57 600 b/s的概率:(ff-eo)/2560.125。故通常情況下,很快就可鎖定波特率。對(duì)于相差一倍的情況,只要發(fā)送一個(gè)小于80的字符就可確定了,即接收一個(gè)字符就可確定波特率的概率是50%。若是57 600 b/s,接收到flag_count合法的字符后就可認(rèn)為是57 600 b/s,理論上flagcount越大越可靠。
評(píng)論