免费国产网站_秋霞午夜一区二区三区视频_99热在线看_日韩精品久久一区二区_午夜看一级毛片_天天鲁在视频在线观看

  • 串口數(shù)據(jù)包解析代碼分析

    2019/1/10??????點擊:
    這里以串口作為傳輸媒介,介紹下怎樣來發(fā)送接收一個完整的數(shù)據(jù)包。過程涉及到封包與解包。設(shè)計一個良好的包傳輸機(jī)制很有利于數(shù)據(jù)傳輸?shù)姆€(wěn)定性以及正確性。串口只是一種傳輸媒介,這種包機(jī)制同時也可以用于SPI,I2C的總線下的數(shù)據(jù)傳輸。在單片機(jī)通信系統(tǒng)(多機(jī)通信以及PC與單片機(jī)通信)中,是很常見的問題。
    一、根據(jù)幀頭幀尾或者幀長檢測一個數(shù)據(jù)幀
    1、幀頭+數(shù)據(jù)+校驗+幀尾
    這是一個典型的方案,但是對幀頭與幀尾在設(shè)計的時候都要注意,也就是說幀頭、幀尾不能在所傳輸?shù)臄?shù)據(jù)域中出現(xiàn),一旦出現(xiàn)可能就被誤判。如果用中斷來接收的話,程序基本可以這么實現(xiàn):
    unsigned char recstatu;//表示是否處于一個正在接收數(shù)據(jù)包的狀態(tài)
    unsigned char ccnt;      //計數(shù)
    unsigned char packerflag;//是否接收到一個完整的數(shù)據(jù)包標(biāo)志
    unsigned char rxbuf[100];//接收數(shù)據(jù)的緩沖區(qū)
    void UartHandler()
    {
           unsigned char tmpch;
           tmpch = UARTRBR;
           if(tmpch 是包頭)                          //檢測是否是包頭
          {  
                recstatu = 1;
                ccnt   = 0 ;
                packerflag = 0;
                return ;
           }
           if(tmpch是包尾)                          //檢測是否是包尾
           {
                recstatu = 0;
                packerflag = 1;                      //用于告知系統(tǒng)已經(jīng)接收到一個完整的數(shù)據(jù)包
                return ;
           }
          if(recstatu ==1)                           //是否處于接收數(shù)據(jù)包狀態(tài)
          {
                rxbuf[ccnt++] = tmpch; 
          }
    }
    上面也就是接收一個數(shù)據(jù)包,但是再次提醒,包頭和包尾不能在數(shù)據(jù)域中出現(xiàn),一旦出現(xiàn)將會出現(xiàn)誤判。另外一個。數(shù)據(jù)的校驗算法是很必要的,在數(shù)據(jù)傳輸中,由于受到干擾,很難免有時出現(xiàn)數(shù)據(jù)錯誤,加上校驗碼可在發(fā)現(xiàn)數(shù)據(jù)傳輸錯誤時,可以要求數(shù)據(jù)的另一方重新發(fā)送,或是進(jìn)行簡單的丟棄處理。校驗算法不一定要很復(fù)雜,普通的加和,異或,以及循環(huán)冗余都是可以的。我上面的接收程序在接收數(shù)據(jù)時,已經(jīng)將包頭和包尾去掉,這些可以根據(jù)自己的需求加上,關(guān)鍵是要理解原理。
    上述包協(xié)議出現(xiàn)了以下的幾種變種:
    1.1 幀頭+數(shù)據(jù)長度+數(shù)據(jù)+校驗值
    1.2包長+校驗值
    上面兩種其實都是知道了數(shù)據(jù)包的長度,然后根據(jù)接收字節(jié)的長度來判斷一個完整的數(shù)據(jù)包。例如,定義一個數(shù)據(jù)包的長度為256字節(jié),那我們就可以一直接收,直到接收到256個字節(jié),就認(rèn)為是一個數(shù)據(jù)包。但是,會不會存在問題呢?比如說從機(jī)向主機(jī)發(fā)送數(shù)據(jù),發(fā)送了一半,掉電,重啟,開機(jī)后繼續(xù)發(fā)送,這很明顯接收到的數(shù)據(jù)就不對了,所以此時很有必要定義一個超限時間,比如我們可以維護(hù)下面這樣的一個結(jié)構(gòu)體。
    struct  uartrd{
    char  rd[ 256];
    unsigned int timeout;
    }
    成員變量rd用來存放接收到的數(shù)據(jù)字節(jié);成員變量timeout用來維護(hù)超時值,這里主要討論這個。這個數(shù)值怎么維護(hù)呢,可以用一個定時器來維護(hù),以可以放在普通的滴答中斷里面來維護(hù),也可以根據(jù)系統(tǒng)運(yùn)行一條指令的周期,在自己的循環(huán)中來維護(hù),給其設(shè)置個初值,比如說100,當(dāng)有第一個數(shù)據(jù)到來以后,timeout在指定的時間就會減少1,減少到0時,就認(rèn)為超時,不論是否接收到足夠的數(shù)據(jù),都應(yīng)該拋棄。
    二、根據(jù)接收超時來判斷一個數(shù)據(jù)包
    2.1  數(shù)據(jù)+校驗
    核心思想是如果在達(dá)到一定的時間沒有接受到數(shù)據(jù),就認(rèn)為數(shù)據(jù)包接收完成。modbus協(xié)議里就有通過時間間隔來判斷幀結(jié)束的。具體實現(xiàn)是要使用一個定時器,在接收到第一個數(shù)據(jù)時候,開啟定時器,在接收到一個數(shù)據(jù)時候,就將定時器清零,讓定時器重新開始計時,如果設(shè)定的超時時間到(超時時間長度可以設(shè)置為5個正常接收的周期),則認(rèn)為在這一段時間內(nèi)沒有接受到新的數(shù)據(jù),就認(rèn)為接收到一個完整的數(shù)據(jù)包了。

    簡單的小的總結(jié),上述幾種方法都還是較為常用的,在具體的實現(xiàn)上,可以根據(jù)具體的實際情況,設(shè)計出具體的通訊協(xié)議。數(shù)據(jù)校驗位,有時候感覺不出來其重要性,但是一定要加上,對數(shù)據(jù)進(jìn)行一個相關(guān)的驗證還是必要的。現(xiàn)在很在MCU都帶有FIFO,DMA等功能,所以有時候利用上這些特性,可以設(shè)計出更好的通訊方式。有的人問在接受串口數(shù)據(jù)時候是應(yīng)該中斷一次接收一個,還是進(jìn)入中斷后接收一段數(shù)據(jù)呢,我認(rèn)為應(yīng)該中斷接收一個,因為CPU是很快的,至少對于串口是這樣,在接受每個數(shù)據(jù)的間隔期間,處理器還是可以做些其他工作的。這是在裸機(jī)下的模型。在多線程中,那就可以直接建立一個數(shù)據(jù)接收線程。


    主站蜘蛛池模板: 91在线视频在线观看_国产午夜毛片v一区二区三区_惊弦45集全免费看_极品人妻少妇一区二区三区_欧美黄色视屏_免费看国产操逼视频 | 伊人小视频_少妇精品一区二区三区在线观看_91在线视频精品_精品国产乱码aaa一区二区_伊人avav_日本天堂一区 | 狠狠亚洲婷婷综合色香五月_日本爱爱视频_3d动漫无码av禁在线无码_日韩精品无码久久久久久_国产专区在线_中文字幕在线免费观看 | 欧美日韩视频在线第一区_中文字幕第2页不卡_久久9999免费视频_久久久久久一级_久久久综_亚洲永久字幕 | 中国女人内谢69XXXXXA片_欧美疯狂xxxx大交乱88av_日韩中文综合_国产成人愉拍精品久久_亚洲在线视频免费观看_色综合夜夜嗨亚洲一二区 | 日日夜夜狠狠操_欧美视频免费播放_涩涩视频免费_网站大全免费网站_久久亚洲愉拍国产自367391_亚洲爆乳无码一区二区三区 | 亚洲а∨天堂久久精品9966_免费久久视频_亚洲丁香五月激情综合_狠狠躁夜夜躁人人爽天天天天_亚洲美免无码中文字幕在线_国产三级麻豆 | 精品国产一区二区三区久久久蜜月_一本大道大臿蕉香蕉网站_www.youjizz.com在线_久久综合给久久狠狠97色_国产亚洲一区二区三区_国色天香精品一卡2卡3卡4 | 中国老太婆野外xxxx_逼特逼视频在线观看_国产成人久久精品二区三区_免费男女乱淫真视频_久久免费看少妇a片特黄_伊人狠狠色丁香综合尤物 | ww.久久_亚洲最大的免费观影网站_国产女大学生av_极品熟女一区二区三区_久久久久成人精品无码_97se狠狠狠狼鲁亚洲综合网 | 精品无码国产拍自产拍在线观看_久久久国产高清_亚洲一区资源_麻豆com_好男人www社区_欧美黄色一级毛片 | 欧美一卡一卡二卡四卡仙踪林_蜜桃久久精品成人无码AV_欧美精品二区三区_国产精品国产三级国产专区55_欧美两根一起进3p做受视频_欧美黑人巨大videos精品 | 成年在线播放小视频_中国极品少妇xxxx_野花视频在线观看最新免费_日本入室强伦姧BD在线观看_国产日韩av一区二区_19sex性高清播放 | 久热精品免费_日韩av福利_欧美午夜片欧美片在线观看_天天操夜夜操夜夜操_无码中文字幕人妻在线一区_一区二区三区免费看 | 特级毛片免费播放_91久久一区二区偷怕_久久精品免费在线_色婷婷一级片_热久久网站_成人a在线 | 亚洲一av_少妇的丰满人妻HD高清_老师喂我乳我脱她胸罩_国产成人自产拍免费视频_中日韩三级视频_国产精品1区二区 | 全程露脸3p在线观看91_亚洲精品国产成人片在线观看_中文字幕一区二_国模大尺度福利视频在线_精品国偷自产在线_xxxxhd69日本hd | 超碰精品在线观看_误杀2在线观看_久久精品无码一区二区无码_好紧好爽好湿别拔出来动态图_国内不卡一区二区三区_丝袜人妻一区二区三区 | 三级日本_好男人好视频好资源在线观看_国产老肥熟一区二区三区_国产线播放免费人成视频播放_亚洲视频2_国产无遮挡A片又黄又爽软件 | 久在线播放_课中坏事在线看_欧美熟妇bbbbbb搡bbbb_黄色一级性片_亚洲国产精品二区_欧美一区二区三区人妻熟妇 国产精品成人观看视频国产奇米_欧美日韩中文视频_五月丁香五月伦理_亚洲国产精品成人综合久久久久久久_69式高清视频在线观看_四虎com | 国产精品视频在线观看免费_欧美黑人群一交_国产欧美一区在线_久久性视频_麻豆成人久久精品二区三区免费_无码日韩精品国产av | 久操青青_成人做爰高潮片免费视频美国_国产在线拍偷自拍观看视频网站_亚洲色大成网站www永久网站_一区二区日本_欧美在线日本 | 国产精品成人无码久久久_久久国产精品久久久久久电车_剑来动漫高清视频在线观看_污污网站免费看_亚洲午夜天堂精品福利天堂_成人国产精品久久久 | 成人激情久久_性生交大片xx_免费网站啪啪_精品视频首页_国产伦精品一区二区三区免费观看_超碰人人做人人爱 | 黄色免费网站在线看_欧洲精品久久_啪啪午夜视频_国产成人综合亚洲色就色_国产超污视频在线观看_三个黑人上我一个 | 99视频在线免费播放_午夜a级理论片在线播放717_色网站视频在线观看_超碰在线免费观看97_亚洲男人天堂网_狠狠网站 | 水蜜桃亚洲精品_欧美精品V欧洲精品_欧美又粗又猛又爽又黄A片_好男人好资源在线影视官网_国产精品一区一区_欧美成人高清视频 | 欧美在线一区二区三区四区_免费国产人成网站_老司机福利在线播放_在线看片一区_人妻无码视频一区二区三区_亚洲区和欧洲区一二 | 中文字幕亚洲欧美日韩在线不卡_久久精品亚洲国产_亚洲国产成人影院在线播放_亚洲一区二区色_亚洲一a_狠狠色综合日日 | 国产日产精品一区四区介绍_欧美国产日本在线_午夜老司机剧场_我们的秘密免费观看_午夜免费AV不卡一二三区_91久操网 | 午夜男人网_国产乱码精品一区二区三区亚洲人_久久视频在线播放_超碰人人射_久久一av_人鲁交YAZHONGHUCXX | www.久久久久久久久_caopro超碰国产高清_91视频com_91色视频在线_亚洲成人涩涩_无码人妻丝袜在线视频 | 国产精品7m凸凹视频分类_国产午夜福利伦理300_久久久久无码精品国产不卡_青青草99_久久久国产91_一级a毛片免费观看久久精品 | 国内外成人免费视频_久久免费大视频_夜夜女人国产香蕉久久精品_国产东北露脸熟妇_a级片久久_成人免费视频91 | 奇米影视狠888_亚洲国产日韩欧美高清片_国内精品久久久久久中文字幕_亚洲成av人片在线观看无_99精品视频网站_国产制服丝袜亚洲日本在线 | 91日韩在线视频_色人阁视频_国外成人在线视频_一级片在线视频_国产一二三区av_91国精品 | 午夜爽爽久久久毛片_韩国美女三级_欧美国产一二区_欧美日韩国产一区精品一区_91福利视频网_蜜桃传媒AV免费观看麻豆 | 国产成人综合亚洲欧美丁香花_国产免费bxbx人网站视频_久久久成人av毛片免费观看_被猛男伦流澡到高潮H视频网站_丰满少妇高潮在线播放不卡_婷婷在线视频免费播放 | 99在线免费视频_国产特黄特级AAAAA片_国产精品色婷婷久久58_一区二区在线视频观看_欧美精品久久久久久久久久久_午夜成人1000部免费视频 | 亚洲一区视频观看_亚洲国产AV一区二区三区丶_免费黄色激情视频_欧美激情综合_国产三级_成人福利在线看 欧美黑人成人www在线观看_91污版_日韩一区二区三区免费看_中国丰满少妇xxxxx高潮_美日韩中文字幕_免费无码成人片在线观看 | 欧美日韩国产一区二区三区_9l久久午夜精品一区二区_20岁一级毛片_色999国产_久久精品一卡二卡_久久久国产亚洲精品AV快乐8 |