<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 手機(jī)與無(wú)線通信 > 設(shè)計(jì)應(yīng)用 > 基于未知上位機(jī)串行通信波特率檢測(cè)

          基于未知上位機(jī)串行通信波特率檢測(cè)

          作者: 時(shí)間:2017-06-12 來(lái)源:網(wǎng)絡(luò) 收藏
          隨著計(jì)算機(jī)應(yīng)用的日益普及,與計(jì)算機(jī)進(jìn)行信息交互的終端也越來(lái)越多,其中是終端與計(jì)算機(jī)之間的主要通信方式。通常情況下,接收方必須知道發(fā)送方的發(fā)送速率,幀結(jié)構(gòu),并采用相同的速率及幀結(jié)構(gòu)進(jìn)行接收,才能保證接收到正確的信息。幀結(jié)構(gòu)信息包括起始位、停止位、數(shù)據(jù)位的個(gè)數(shù),及是否有校驗(yàn)位,若有,是以何種形式校驗(yàn),這樣才能在接收到正確信息的基礎(chǔ)上進(jìn)行校驗(yàn),并把起始位、停止位、校驗(yàn)位剔除掉,將有用信息識(shí)別出來(lái)。在不知道發(fā)送速率的情況下,下位機(jī)無(wú)法采用傳統(tǒng)的方法進(jìn)行通信信號(hào)的正確接收和數(shù)據(jù)提取。很多情況下,終端設(shè)備通信時(shí)都沒有使用校驗(yàn)位。本文提供了一種沒有校驗(yàn)位的情況下的檢測(cè)算法。此方法適用于黑匣子終端的檢測(cè),尤其間斷串口通訊的情況(如果是連續(xù)發(fā)送,只對(duì)最后一個(gè)字節(jié)使用兩個(gè)接收)。

          1 串口通信

          串口通信是以幀為單位。幀由4部分組成:起始位,停止位,數(shù)據(jù)位及校驗(yàn)位。其校驗(yàn)位可有可無(wú),通常終端設(shè)置為無(wú)。如回車符的發(fā)送,回車符的ASC II值為0x0D。時(shí)附加一個(gè)起始位和終止位,位的傳輸順序一般是先傳低位再傳高位。此時(shí)回車符的二進(jìn)制表示方式如圖1所示。

          本文引用地址:http://www.ex-cimer.com/article/201706/353789.htm利用的串口或串口調(diào)試工具接收數(shù)據(jù)時(shí),如果幀格式不正確,通常只會(huì)將此幀數(shù)據(jù)丟棄,不報(bào)告出錯(cuò),并且不允許做其他的工作,同樣,不能同時(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開始新一輪的測(cè)試。若57 600 b/s不能被排除,多次則比較是57 600 b/s與38 400 b/s,以確定其中一個(gè)。若能排除57 600 b/s,從38 400 b/s開始測(cè)試。若均被排除,從19 200 b/s開始測(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)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();