• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      串口通訊數(shù)據(jù)處理算法分析與實(shí)現(xiàn)

      2014-04-29 17:33:17姚海濤吳永剛
      電子世界 2014年13期

      姚海濤 吳永剛

      【摘要】本文介紹了串口通訊數(shù)據(jù)接收處理的一般方法。該方法利用循環(huán)FIFO緩沖區(qū),獲取串口數(shù)據(jù),并根據(jù)狀態(tài)轉(zhuǎn)移法對(duì)通訊報(bào)文進(jìn)行分析,從而獲得符合協(xié)議要求的有效報(bào)文。文章通過(guò)實(shí)例驗(yàn)證了狀態(tài)轉(zhuǎn)移法分析串口通訊數(shù)據(jù)的有效性,為實(shí)際的工程應(yīng)用提供了一定的指導(dǎo)。

      【關(guān)鍵詞】循環(huán)緩沖區(qū);串口通訊數(shù)據(jù)處理;狀態(tài)轉(zhuǎn)移法

      1.應(yīng)用背景

      在目前很多的工程化控制應(yīng)用中,大部分采用了PC機(jī)和多臺(tái)單片機(jī)構(gòu)成的主從系統(tǒng)。單片機(jī)主要進(jìn)行數(shù)據(jù)采集,處理現(xiàn)場(chǎng)信號(hào),驅(qū)動(dòng)執(zhí)行機(jī)構(gòu);PC機(jī)則通過(guò)對(duì)單片機(jī)進(jìn)行集中管理,完成信息顯示,數(shù)據(jù)運(yùn)算并做出決策以分配任務(wù)。PC機(jī)與單片機(jī)之間則需通過(guò)通訊方式完成數(shù)據(jù)交互,在眾多通訊接口中,串口通訊應(yīng)用比較普遍。

      串口通訊方式有三種:RS232、RS422和RS485;RS-232是串行數(shù)據(jù)接口標(biāo)準(zhǔn),最初都是由電子工業(yè)協(xié)會(huì)(EIA)制訂并發(fā)布的,RS-232在1962年發(fā)布,命名為EIA-232-E,作為工業(yè)標(biāo)準(zhǔn),以保證不同廠家產(chǎn)品之間的兼容。RS-422由RS-232發(fā)展而來(lái),它是為彌補(bǔ)RS-232的不足而提出的。為改進(jìn)RS-232通信距離短、速率低的缺點(diǎn),RS-422定義了一種平衡通信接口,將傳輸速率提高到10Mb/s,傳輸距離延長(zhǎng)到4000英尺(速率低于100kb/s時(shí)),并允許在一條平衡總線上連接最多10個(gè)接收器。RS-422是一種單機(jī)發(fā)送、多機(jī)接收的單向、平衡傳輸規(guī)范,被命名為T(mén)IA/EIA-422-A標(biāo)準(zhǔn)。為擴(kuò)展應(yīng)用范圍,EIA又于1983年在RS-422基礎(chǔ)上制定了RS-485標(biāo)準(zhǔn),增加了多點(diǎn)、雙向通信能力,即允許多個(gè)發(fā)送器連接到同一條總線上,同時(shí)增加了發(fā)送器的驅(qū)動(dòng)能力和沖突保護(hù)特性,擴(kuò)展了總線共模范圍,后命名為T(mén)IA/EIA-485-A標(biāo)準(zhǔn)。由于EIA提出的建議標(biāo)準(zhǔn)都是以“RS”作為前綴,所以在通訊工業(yè)領(lǐng)域,仍然習(xí)慣將上述標(biāo)準(zhǔn)以RS作前綴稱(chēng)謂。

      串口通訊是按照字節(jié)流的方式來(lái)進(jìn)行的,即每中斷一次,表明成功傳送或者接收一個(gè)字節(jié)。

      2.通訊協(xié)議

      要進(jìn)行數(shù)據(jù)通訊,那么通訊雙方必須遵循一定格式的協(xié)議,這樣,通訊雙方才能夠相互理解從對(duì)方所接收過(guò)來(lái)的數(shù)據(jù)。

      串口通訊協(xié)議一般包含這樣幾個(gè)域:幀頭、用戶數(shù)據(jù)和幀尾。為保證數(shù)據(jù)的有效性,一般加強(qiáng)了幀頭和幀尾,幀頭包含前導(dǎo)碼、幀長(zhǎng)度和幀號(hào),有的增加了發(fā)方地址和收方地址,有的通訊協(xié)議將幀長(zhǎng)度放在幀號(hào)的后面;幀尾主要是整個(gè)數(shù)據(jù)域與幀頭校驗(yàn)的結(jié)果,類(lèi)型有CRC檢驗(yàn)、奇偶檢驗(yàn)或異或偶校驗(yàn)等。有的協(xié)議幀尾也采用了固定的數(shù)據(jù),甚至沒(méi)有幀尾。

      表1 串口通訊協(xié)議一般格式

      前導(dǎo)碼 幀長(zhǎng)度 幀號(hào) 數(shù)據(jù)域 校驗(yàn)

      幀頭 用戶數(shù)據(jù) 幀尾

      同時(shí)通訊協(xié)議還需定義各個(gè)域的長(zhǎng)度和每一個(gè)bit的確切的含義。

      3.循環(huán)FIFO緩沖區(qū)

      在通信程序中,經(jīng)常使用環(huán)形緩沖區(qū)作為數(shù)據(jù)結(jié)構(gòu)來(lái)存放通信中發(fā)送和接收的數(shù)據(jù)。環(huán)形緩沖區(qū)是一個(gè)先進(jìn)先出(FIFO)的循環(huán)緩沖區(qū),可以向通信程序提供對(duì)緩沖區(qū)的互斥訪問(wèn)。環(huán)形緩沖區(qū)通常有一個(gè)讀指針和一個(gè)寫(xiě)指針。讀指針指向環(huán)形緩沖區(qū)中可讀的數(shù)據(jù),寫(xiě)指針指向環(huán)形緩沖區(qū)中可寫(xiě)的緩沖區(qū)。通過(guò)移動(dòng)讀指針和寫(xiě)指針就可以實(shí)現(xiàn)緩沖區(qū)的數(shù)據(jù)讀取和寫(xiě)入。在通常情況下,環(huán)形緩沖區(qū)的讀數(shù)據(jù)僅僅會(huì)影響讀指針,而寫(xiě)數(shù)據(jù)僅僅會(huì)影響寫(xiě)指針。

      進(jìn)行串口數(shù)據(jù)接收和發(fā)送一般也采用具有先進(jìn)先出功能的FIFO循環(huán)緩沖區(qū),如圖1所示:

      Tail

      0 1 2 3 4 5 6 7 …… SIZE-1

      Head

      圖1 FIFO循環(huán)緩沖區(qū)示意圖

      從圖中可以看出,先進(jìn)先出功能的FIFO緩沖區(qū)須定義一個(gè)大小為SIZE的緩沖區(qū),存放數(shù)據(jù),Tail指針表示該緩沖區(qū)中接收到的有效數(shù)據(jù)位置,表示寫(xiě)入的數(shù)據(jù)位置;Head指針表示該緩沖區(qū)中已經(jīng)處理的有效數(shù)據(jù)位置,表示讀出的數(shù)據(jù)位置;初始化時(shí),Head指針和Tail指針都指到0的位置;當(dāng)串口接收到數(shù)據(jù)存放到緩沖區(qū)后,Tail就加1,當(dāng)Tail大于SIZE-1時(shí),將Tail等于0,數(shù)據(jù)接收時(shí),線性緩沖區(qū)變成一個(gè)回環(huán);當(dāng)系統(tǒng)從緩沖區(qū)取出一個(gè)數(shù)據(jù)進(jìn)行分析,Head就加1,當(dāng)Head大于SIZE-1時(shí),將Head等于0,數(shù)據(jù)分析時(shí),線性緩沖區(qū)也變成一個(gè)回環(huán);依據(jù)這種方法,可以看出,數(shù)據(jù)先到的,數(shù)據(jù)先分析,建立了先進(jìn)先出功能的FIFO循環(huán)緩沖區(qū)。

      根據(jù)上述說(shuō)明,可以使用如下結(jié)構(gòu)體來(lái)定義FIFO緩沖區(qū):

      Typedef Struct Buffer_t{

      IntHead;

      IntTail;

      Char data[SIZE];

      }Buffer;

      這個(gè)結(jié)構(gòu)體很簡(jiǎn)單,Tail表示寫(xiě)入的數(shù)據(jù)位置,Head表示讀出的數(shù)據(jù)位置,data用來(lái)存放數(shù)據(jù)。在對(duì)Head和Tail修改時(shí),需要對(duì)SIZE取模,防止溢出。SIZE一般根據(jù)串口采用的波特率,數(shù)據(jù)流量和計(jì)算機(jī)的處理速度來(lái)決定大小。

      4.緩沖區(qū)數(shù)據(jù)的操作

      根據(jù)FIFO的方式實(shí)現(xiàn)緩沖區(qū)的初始化、寫(xiě)入和讀出的操作時(shí),需要注意以下幾點(diǎn):

      1)緩沖區(qū)的有效數(shù)據(jù)長(zhǎng)度

      緩沖區(qū)的有效數(shù)據(jù)長(zhǎng)度表示在緩沖區(qū)中存在的沒(méi)有及時(shí)處理的數(shù)據(jù)長(zhǎng)度;可以這樣計(jì)算:(Tail +SIZE- Head)%SIZE。

      2)緩沖區(qū)的可以寫(xiě)入數(shù)據(jù)長(zhǎng)度

      緩沖區(qū)的可以寫(xiě)入數(shù)據(jù)長(zhǎng)度表示在當(dāng)前緩沖區(qū)中還能寫(xiě)入的數(shù)據(jù)長(zhǎng)度;可以這樣計(jì)算:SIZE-(Tail +SIZE- Head)%SIZE。

      3)緩沖區(qū)空和滿的判斷條件

      當(dāng)Head和Tail相等的時(shí)候,緩沖區(qū)空,而當(dāng)緩沖區(qū)中已經(jīng)寫(xiě)入了SIZE-1個(gè)有效數(shù)據(jù)時(shí),緩沖區(qū)滿。

      4)寫(xiě)入和讀出的策略

      當(dāng)讀取或者寫(xiě)入緩沖區(qū)時(shí),需要檢查緩沖區(qū)中的數(shù)據(jù)或者空間是否足夠。在讀取時(shí),如果沒(méi)有足夠的數(shù)據(jù),是讀取已有的數(shù)據(jù)還是不讀取任何數(shù)據(jù),而在寫(xiě)入時(shí),如果空間不夠,是部分寫(xiě)入還是不寫(xiě)入任何數(shù)據(jù),這取決于軟件開(kāi)發(fā)人員的應(yīng)用程序采用的策略。一般情況下,在空間不夠時(shí),可以不做任何操作。當(dāng)出現(xiàn)上述情況,留給上層的程序去處理。在實(shí)際應(yīng)用中,如果讀取和寫(xiě)入的程序設(shè)計(jì)的合理,緩沖區(qū)的大小合適,一般是不會(huì)出現(xiàn)寫(xiě)入失敗的情況的。

      5.串口數(shù)據(jù)的分析

      使用循環(huán)緩沖區(qū),可以非常方便的實(shí)現(xiàn)對(duì)串口數(shù)據(jù)的分析,而要完成協(xié)議的各個(gè)域的嚴(yán)格檢查,實(shí)現(xiàn)對(duì)部分含有錯(cuò)誤域的包和不完整的包的完美過(guò)濾,以及對(duì)混亂數(shù)據(jù)中正確包準(zhǔn)確無(wú)誤的抽取,還須對(duì)FIFO緩沖區(qū)重新定義,具體情況如下:

      Typedef Struct Buffer_t{

      IntHead;

      IntTail;

      IntHeadBak;

      Char data[SIZE];

      }Buffer;

      增加的HeadBak為Head的備份,當(dāng)幀頭分析結(jié)束后,記錄下Head的位置,以防后續(xù)數(shù)據(jù)不符合協(xié)議要求后,根據(jù)HeadBak重新恢復(fù)Head的位置。

      依據(jù)前面制定的協(xié)議,需依次完成前導(dǎo)碼的搜索,數(shù)據(jù)長(zhǎng)度的檢查、校驗(yàn)和的檢查以及錯(cuò)誤包的處理。利用狀態(tài)轉(zhuǎn)移法,程序循環(huán)一次,從數(shù)據(jù)緩沖區(qū)讀出一個(gè)字節(jié),改變狀態(tài),每次分析結(jié)束后,Head++;在進(jìn)行串口數(shù)據(jù)分析之前,必須判斷緩沖區(qū)不空或緩沖區(qū)的有效數(shù)據(jù)長(zhǎng)度不為零時(shí),才讀取數(shù)據(jù)進(jìn)行分析。分析具體流程如下:

      1)判斷前導(dǎo)碼:如果成功,轉(zhuǎn)到2。

      2)幀長(zhǎng)度的檢查:對(duì)照協(xié)議中對(duì)長(zhǎng)度域可能出現(xiàn)的最大和最小包長(zhǎng)檢查,如果正常,則轉(zhuǎn)到3,否則若不是前導(dǎo)碼,轉(zhuǎn)到1。

      3)幀號(hào)的檢查:檢查幀號(hào)是否為有效的幀號(hào),有效,則轉(zhuǎn)到4,HeadBak等于Head,否則若不是前導(dǎo)碼,轉(zhuǎn)到1,若是前導(dǎo)碼,轉(zhuǎn)到2。

      4)數(shù)據(jù)域的接收:根據(jù)幀長(zhǎng)度判斷包是否完整,若完整,轉(zhuǎn)5。

      5)校驗(yàn)和的檢查:根據(jù)協(xié)議算出校驗(yàn)和,檢查校驗(yàn)和是否正確,錯(cuò)誤則Head=HeadBak,轉(zhuǎn)到1。如果正確,則讀取(Head-HeadBak+SIZE)%SIZE的長(zhǎng)度數(shù)據(jù),根據(jù)幀號(hào),執(zhí)行相應(yīng)的操作。

      根據(jù)上述的處理流程,完成了協(xié)議的各個(gè)域的嚴(yán)格檢查,實(shí)現(xiàn)了對(duì)部分含有錯(cuò)誤域的包和不完整的包的完美過(guò)濾,以及對(duì)混亂數(shù)據(jù)中正確包準(zhǔn)確無(wú)誤的抽取。

      6.實(shí)例驗(yàn)證

      假如一幀正確數(shù)據(jù)如表2所示:

      表2 一幀正確數(shù)據(jù)格式

      前導(dǎo)碼 幀長(zhǎng)度 幀號(hào) 數(shù)據(jù)域 校驗(yàn)

      0x55 0x01 0x02 0x03 0x50

      幀長(zhǎng)度表示數(shù)據(jù)域的長(zhǎng)度,數(shù)據(jù)長(zhǎng)度在0~32之間,幀號(hào)在0x00~0x0F之間,校驗(yàn)采用異或檢驗(yàn)。

      為驗(yàn)證上述流程的正確性,我們采取了各種案例進(jìn)行驗(yàn)證,具體情況如下:

      表3 串口數(shù)據(jù)處理流程正確性案例驗(yàn)證結(jié)果

      通過(guò)表3中各種案例進(jìn)行驗(yàn)證,都可以得到正確結(jié)果,每次取出的數(shù)據(jù)都符合協(xié)議,證明串口數(shù)據(jù)分析的狀態(tài)轉(zhuǎn)移法流程滿足要求。

      7.結(jié)束語(yǔ)

      以上給出的是根據(jù)一個(gè)簡(jiǎn)單的協(xié)議,構(gòu)造了一個(gè)串口接收數(shù)據(jù)緩沖區(qū),根據(jù)緩沖區(qū)如何得到正確包的基本思路。我們根據(jù)這個(gè)思路,在多個(gè)產(chǎn)品上已經(jīng)得到了成功的運(yùn)用。但實(shí)際的通信系統(tǒng)中協(xié)議遠(yuǎn)比這個(gè)要復(fù)雜,而且涉及到數(shù)據(jù)包響應(yīng)、命令錯(cuò)誤、延時(shí)等等一系列的問(wèn)題,不過(guò)有了這樣的一個(gè)基礎(chǔ),通過(guò)克服這些困難我們就可以實(shí)現(xiàn)較為穩(wěn)定可靠的系統(tǒng)。

      參考文獻(xiàn)

      [1]李現(xiàn)勇.Visual C++串口通信技術(shù)與工程實(shí)踐(第二版)[M].人民郵電出版社,2004.

      [2]周立功,張華等.深入淺出ARM7-LPC213x/214x(上冊(cè)) [M].北京航空航天大學(xué)出版社,2005.

      作者簡(jiǎn)介:姚海濤(1979—),女,碩士,現(xiàn)供職于宜昌測(cè)試技術(shù)研究所,主要從事電子對(duì)抗技術(shù)研究。

      无锡市| 澄迈县| 广南县| 武安市| 平谷区| 黄山市| 宜宾县| 台前县| 威远县| 浪卡子县| 彭水| 安塞县| 宁晋县| 二连浩特市| 彭山县| 建宁县| 县级市| 晋宁县| 丽江市| 手游| 博湖县| 宁南县| 冷水江市| 岑溪市| 竹山县| 凤阳县| 呼和浩特市| 桦甸市| 乌鲁木齐市| 玛多县| 宕昌县| 绵阳市| 寿宁县| 吕梁市| 泸西县| 彭泽县| 惠水县| 泰来县| 宿州市| 铜川市| 丰城市|