亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        串口通訊數(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)移法對通訊報文進(jìn)行分析,從而獲得符合協(xié)議要求的有效報文。文章通過實(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ī)和多臺單片機(jī)構(gòu)成的主從系統(tǒng)。單片機(jī)主要進(jìn)行數(shù)據(jù)采集,處理現(xiàn)場信號,驅(qū)動執(zhí)行機(jī)構(gòu);PC機(jī)則通過對單片機(jī)進(jìn)行集中管理,完成信息顯示,數(shù)據(jù)運(yùn)算并做出決策以分配任務(wù)。PC機(jī)與單片機(jī)之間則需通過通訊方式完成數(shù)據(jù)交互,在眾多通訊接口中,串口通訊應(yīng)用比較普遍。

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

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

        2.通訊協(xié)議

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

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

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

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

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

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

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

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

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

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

        Typedef Struct Buffer_t{

        IntHead;

        IntTail;

        Char data[SIZE];

        }Buffer;

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

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

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

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

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

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

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

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

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

        4)寫入和讀出的策略

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

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

        使用循環(huán)緩沖區(qū),可以非常方便的實(shí)現(xiàn)對串口數(shù)據(jù)的分析,而要完成協(xié)議的各個域的嚴(yán)格檢查,實(shí)現(xiàn)對部分含有錯誤域的包和不完整的包的完美過濾,以及對混亂數(shù)據(jù)中正確包準(zhǔn)確無誤的抽取,還須對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ù)長度的檢查、校驗(yàn)和的檢查以及錯誤包的處理。利用狀態(tài)轉(zhuǎn)移法,程序循環(huán)一次,從數(shù)據(jù)緩沖區(qū)讀出一個字節(jié),改變狀態(tài),每次分析結(jié)束后,Head++;在進(jìn)行串口數(shù)據(jù)分析之前,必須判斷緩沖區(qū)不空或緩沖區(qū)的有效數(shù)據(jù)長度不為零時,才讀取數(shù)據(jù)進(jìn)行分析。分析具體流程如下:

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

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

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

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

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

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

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

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

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

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

        0x55 0x01 0x02 0x03 0x50

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

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

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

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

        7.結(jié)束語

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

        參考文獻(xiàn)

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

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

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

        国内精品国产三级国产| 青青在线精品2022国产| 精品国产av 无码一区二区三区| 青青草国产成人99久久 | 亚洲一区丝袜美腿在线观看| 国产精品又黄又爽又色| 亚洲一区二区三区综合免费在线| 又硬又粗进去好爽免费| 久久国产精品精品国产色婷婷| 欧美成人一区二区三区在线观看| 在线观看精品国产福利片87| 久久亚洲精品国产精品婷婷| 一区二区三区国产黄色| 天天做天天添av国产亚洲| 中文乱码字慕人妻熟女人妻| 国产精品亚洲欧美天海翼| 日本在线中文字幕一区二区| 久久久免费看少妇高潮| 精品亚洲一区二区三区在线观看| 四虎影视在线观看2413| 麻豆国产巨作AV剧情老师| 少妇又紧又色又爽又刺| 欧美精品无码一区二区三区| 中国凸偷窥xxxx自由视频妇科 | 国产精品高潮av有码久久| 亚洲国产精品亚洲高清| 国产三级av在线精品| 隔壁老王国产在线精品| 国产精品久久久久久人妻精品| 狠狠亚洲婷婷综合久久久| 中文字幕一区二区网址| 精品在线观看一区二区视频| 成人性生交大片免费看96| 亚洲日本欧美产综合在线| 国产精品久久熟女吞精| 户外精品一区二区三区 | 中文字幕一区二区人妻性色| 午夜短无码| 日韩精品av在线一区二区| 一区二区三区乱码专区| 给你免费播放的视频|