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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 用單片機實現(xiàn)無線通信中數(shù)據(jù)的編解碼

          用單片機實現(xiàn)無線通信中數(shù)據(jù)的編解碼

          作者: 時間:2012-05-25 來源:網(wǎng)絡 收藏

          利用和無線數(shù)傳模塊來完成無線數(shù)據(jù)通信在石油、電力、水文、冶金等行業(yè)的無線控制、數(shù)據(jù)采集、報警諸多領域中有著廣泛的應用前景。通常采用的辦法是用的串行I/ O 口來完成數(shù)據(jù)通信,但是該方法有許多不足之處:第一、在利用的串口進行發(fā)送和接收數(shù)據(jù)時,對傳輸?shù)臄?shù)據(jù)只能進行奇偶校驗,然而在場合,被傳輸?shù)臄?shù)據(jù)極易受到電磁、靜電等的干擾,奇偶校驗一般不能檢測出這類干擾所引起的突發(fā)性錯誤,所以該方法無法滿足差錯檢測要求較高的場合;第二、由于單片機一般采用異步通信方式,接受器通常不能很快的接收到有效數(shù)據(jù),因而該方法也不能滿足要求多路進行快速切換的場合;第三、單片機的串口通信在傳輸速率和每幀的有效數(shù)據(jù)位數(shù)等方面都受到了嚴格的限制,缺乏靈活性。本文針對低速的場合,提出了一種通過單片機用軟件實現(xiàn)的方案,該方案可以有效克服上述單片機串口通信的不足之處, 在中得到了令人滿意的效果[1 - 4 ] 。

          1  編碼原理及程序流程

          1. 1  編碼原理

          假設傳輸?shù)臄?shù)據(jù)精度為12 位,以A8BH 為例,其幀格式如圖1 所示,高位在先,低位在后[5 ] 。數(shù)據(jù)的編碼采用了曼徹斯特編碼格式,每幀數(shù)據(jù)由同步頭、有效數(shù)據(jù)位和校驗位三部分組成。其中數(shù)據(jù)位“1”由高到低的跳變表示,數(shù)據(jù)位“0”由低到高的跳變表示,而且數(shù)據(jù)位“1”和“0”高低電平周期各為0. 5 T (設T 為一個數(shù)據(jù)位寬度) 。根據(jù)曼徹斯特碼的特點,每個數(shù)據(jù)位都由高低電平組成,因而在連續(xù)傳輸?shù)挠行?shù)據(jù)位中不會存在超過一個數(shù)據(jù)位寬度的高電平或低電平,因此在每個數(shù)據(jù)的前面設一個同步頭,高低電平各為1. 5 T 。這樣在進行接收數(shù)據(jù)時,只要采樣得到的電平滿足1. 5 T ,則認為該電平是同步頭,開始接收數(shù)據(jù)。因為尋找同步頭的時間最長不會超過一個數(shù)據(jù)的長度,所以此編碼方式非常適合于要求多路進行快速切換的場合。為了簡化電路和節(jié)省功耗,本文采用了單極性曼徹斯特碼。

          本文采用了循環(huán)冗余校驗,即后四位為循環(huán)冗余校驗碼。循環(huán)冗余校驗碼簡稱為CRC ( CyclicRedundancy Code) 。循環(huán)冗余校驗的指導思想是發(fā)送端將被傳輸?shù)臄?shù)據(jù)流多項式除以生成多項式得到冗余位,接收端將被傳輸?shù)臄?shù)據(jù)(包括冗余位) 除以事先確定的生成多項式,如果余數(shù)為零,則認為沒有錯誤發(fā)生,不為零則表示有錯。由于使用這種方法獲得冗余位具有很強的信息覆蓋能力,它善于發(fā)現(xiàn)各種類型的錯誤,特別是一些突發(fā)性錯誤,所以它是一種效率極高的差錯校驗法[6 ] 。

          根據(jù)CRC 碼的編碼思想[7 ] ,對(16 ,12) 碼,由x 16 + 1 確定生成多項式為G ( x ) = x 4 + 1 ,該多項式也可表示成(10001) 。對被傳輸?shù)?2 位數(shù)據(jù)和生成多項式采用模2 運算便可以得到每個數(shù)據(jù)的四位循環(huán)冗余位。

          1. 2  編碼子程序流程圖及說明

          曼徹斯特編碼子程序包括計算冗余位和曼徹斯特編碼發(fā)送兩部分,首先調(diào)用CRC 求余子程序(流程圖略) ,將得到的冗余校驗位作為待發(fā)送16 位數(shù)據(jù)的低四位,然后對該16 位,并通過無線數(shù)傳模塊調(diào)制成模擬信號發(fā)射出去(單片機的TXD 端與無線數(shù)傳模塊發(fā)的DATA IN 端相連) 。同步頭及數(shù)據(jù)位發(fā)送是通過對單片機的TXD 端( P3. 1) 置“1”和清“0”并進行軟件延時來實現(xiàn)。TIME1 和TIME2 為軟件延時,以滿足同步頭高低電平寬度的要求。值得注意的是,在編寫編碼子程序時,應確保P3. 1 置“1”和清“0”時間間隔滿足數(shù)據(jù)位或同步頭寬度的要求。

          2  解碼原理及程序流程

          2. 1  解碼原理

          解碼的思想是:首先進行同步頭的判定,然后采用“測三取二”的法判斷數(shù)據(jù)位,得到每幀的16 位數(shù)據(jù),最后對得到的數(shù)據(jù)進行CRC 校驗。

          (1) 同步頭的判定

          首先對單片機的RXD 端( P3. 0) 進行連續(xù)采樣,從P3. 0 引腳變低時開始計時,若低電平的時間達到1. 3 T ,則認為該電平為同步頭。因為用無線數(shù)傳模塊得到的信號波形一般為梯形,所以接收到的實際高低電平寬度可能變小,因此若接收到低電平寬度達到1. 3 T ,則可近似認為該電平為某數(shù)據(jù)的同步頭。

          (2) 數(shù)據(jù)位的判定

          對每個數(shù)據(jù)位的判定采用“測三取二”的方法,既將每個數(shù)據(jù)位的前半部分成16 個狀態(tài),在第7 、8 、9 狀態(tài)檢測P3. 0 引腳上的電平,取其大于等于2的相同值作為測得值,如表1 所示(表中l(wèi)dquo; x ”表示“0”或“1”) 。此檢測方法是在高電平或低電平的中間位置進行采樣,既提高了采樣準確度又有一定的濾波功能。

          (3) 循環(huán)冗余校驗

          對解碼得到的16 位數(shù)據(jù)進行循環(huán)冗余校驗,若余數(shù)為零,則認為傳輸正確,否則進行出錯處理。

          2. 2  解碼子程序流程圖及說明

          解碼子程序包括曼徹斯特解碼和差錯校驗兩部分,其流程圖如圖3 所示。首先進行同步頭的判定,從RXD 端( P3. 0) 為低電平時開始計時(單片機的RXD 端與無線數(shù)傳模塊收的DATA OU T 端相連) ,并對P3. 0 引腳進行連續(xù)采樣,采樣時間間隔可自行設定,若P3. 0 引腳的低電平時間達到1. 3 T ,則認為該低電平為某數(shù)據(jù)的同步頭,然后對同步頭后面的數(shù)據(jù)位的前半位采用“測三取二”的方法進行數(shù)據(jù)位的判定,最后對采樣得到的16 位數(shù)據(jù)進行循環(huán)冗余校驗,若余數(shù)為0 ,則置錯誤標志,若不為0 ,則去掉冗余位, 得到12 位有效數(shù)據(jù)。TIME1~TIME3 是湊采樣的時間間隔。

          3  結論

          實驗證明,與單片機串口通信相比,使用該方案來進行無線數(shù)據(jù)通信抗干擾能力強,數(shù)據(jù)傳輸格式靈活。同時從軟件中可以發(fā)現(xiàn),如果改變軟件延時時間則可以改變系統(tǒng)的通信速率,設計者可以根據(jù)數(shù)據(jù)通信的實際需要自行設定。而且該方案適合任何種類的單片機。因此該方案適合各種無線數(shù)據(jù)通信的場合。盡管軟件編解碼的最大缺點是系統(tǒng)獨占主機,在有中斷任務的系統(tǒng)中,將無法保證編解碼程序運行時獨占主機,但是可以使用上述方案用專門單片機作為編譯碼器,將其嵌入系統(tǒng)中,這樣既克服了軟件編解碼程序獨占主機的缺點,又充分利用了軟件編解碼的優(yōu)點, 因此該方案也具有一定的通用性 。



          評論


          相關推薦

          技術專區(qū)

          關閉
          看屁屁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); })();