wwwxxx国产_337p日本欧洲亚洲大胆张筱雨_免费在线看成人av_日本黄色不卡视频_国产精品成熟老女人_99视频一区_亚洲精品97久久中文字幕_免费精品视频在线_亚洲色图欧美视频_欧美一区二三区

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

單片機通信協議處理

作者:佚名   來源:本站原創   點擊數:  更新時間:2013年10月20日   【字體:

現在大部分的儀器設備都要求能過通過上位機軟件來操作,這樣方便調試,利于操作。其中就涉及到通信的過程。在實際制作的幾個設備中,筆者總結出了通信程序的通用寫法,包括上位機端和下位機端等
1. 自定義數據通信協議
這里所說的數據協議是建立在物理層之上的通信數據包格式。所謂通信的物理層就是指我們通常所用到的RS232、RS485、紅外、光纖、無線等等通信方式。在這個層面上,底層軟件提供兩個基本的操作函數:發送一個字節數據、接收一個字節數據。所有的數據協議全部建立在這兩個操作方法之上。
通信中的數據往往以數據包的形式進行傳送的,我們把這樣的一個數據包稱作為一幀數據。類似于網絡通信中的TCPIP協議一般,比較可靠的通信協議往往包含有以下幾個組成部分:幀頭、地址信息、數據類型、數據長度、數據塊、校驗碼、幀尾。
幀頭和幀尾用于數據包完整性的判別,通常選擇一定長度的固定字節組成,要求是在整個數據鏈中判別數據包的誤碼率越低越好。減小固定字節數據的匹配機會,也就是說使幀頭和幀尾的特征字節在整個數據鏈中能夠匹配的機會最小。通常有兩種做法,一、減小特征字節的匹配幾率。二、增加特征字節的長度。通常選取第一種方法的情況是整個數據鏈路中的數據不具有隨即性,數據可預測,可以通過人為選擇幀頭和幀尾的特征字來避開,從而減小特征字節的匹配幾率。使用第二種方法的情況更加通用,適合于數據隨即的場合。通過增加特征字節的長度減小匹配幾率,雖然不能夠完全的避免匹配的情況,但可以使匹配幾率大大減小,如果碰到匹配的情況也可以由校驗碼來進行檢測,因此這種情況在絕大多說情況下比較可靠。
地址信息主要用于多機通信中,通過地址信息的不同來識別不同的通信終端。在一對多的通信系統中,可以只包含目的地址信息。同時包含源地址和目的地址則適用于多對多的通信系統。
數據類型、數據長度和數據塊是主要的數據部分。數據類型可以標識后面緊接著的是命令還是數據。數據長度用于指示有效數據的個數。
校驗碼則用來檢驗數據的完整性和正確性。通常對數據類型、數據長度和數據塊三個部分進行相關的運算得到。最簡單的做法可是對數據段作累加和,復雜的也可以對數據進行CRC運算等等,可以根據運算速度、容錯度等要求來選取。
2. 上位機和下位機中的數據發送
物理通信層中提供了兩個基本的操作函數,發送一個字節數據則為數據發送的基礎。數據包的發送即把數據包中的左右字節按照順序一個一個的發送數據而已。當然發送的方法也有不同。
在單片機系統中,比較常用的方法是直接調用串口發送單個字節數據的函數。這種方法的缺點是需要處理器在發送過程中全程參與,優點是所要發送的數據能夠立即的出現在通信線路上,能夠立即被接收端接收到。另外一種方法是采用中斷發送的方式,所有需要發送的數據被送入一個緩沖區,利用發送中斷將緩沖區中的數據發送出去。這種方法的優點是占用處理器資源小,但是可能出現需要發送的數據不能立即被發送的情況,不過這種時延相當的小。對于51系列單片機,比較傾向于采用直接發送的方式,采用中斷發送的方式比較占用RAM資源,而且對比直接發送來說也沒有太多的優點。以下是51系列單片機中發送單個字節的函數。
void SendByte(unsigned char ch)
{
SBUF = ch;
while(TI == 0);
TI = 0;
}
上位機中關于串口通信的方式也有多種,這種方式不是指數據有沒有緩沖的問題,而是操作串口的方式不同,因為PC上數據發送基本上都會被緩沖后再發送。對于編程來說操作串口有三種方式,一、使用windows系統中自帶的串口通信控件,這種方式使用起來比較簡單,需要注意的是接收時的阻塞處理和線程機制。二、使用系統的API直接進行串口數據的讀取,在windows和linux系統中,設備被虛擬為文件,只需要利用系統提供的API函數即可進行串口數據的發送和讀取。三、使用串口類進行串口操作。在此只介紹windows環境下利用串口類編程的方式。
CSERialport是比較好用的串口類。它提供如下的串口操作方法:
void WriteToPort(char* string, int len);
串口初始化成功后,調用此函數即可向串口發送數據。為了避免串口緩沖所帶來的延時,可以開啟串口的沖刷機制。
3. 下位機中的數據接收和協議解析
下位機接收數據也有兩種方式,一、等待接收,處理器一直查詢串口狀態,來判斷是否接收到數據。二、中斷接收。兩種方法的優缺點在此前的一篇關于串口通信的文章中詳細討論過。得出的結論是采用中斷接收的方法比較好。
數據包的解析過程可以設置到不同的位置。如果協議比較簡單,整個系統只是處理一些簡單的命令,那么可以直接把數據包的解析過程放入到中斷處理函數中,當收到正確的數據包的時候,置位相應的標志,在主程序中再對命令進行處理。如果協議稍微復雜,比較好的方式是將接收的數據存放于緩沖區中,主程序讀取數據后進行解析。也有兩種方式交叉使用的,比如一對多的系統中,首先在接收中斷中解析“連接”命令,連接命令接收到后主程序進入設置狀態,采用查詢的方式來解析其余的協議。
以下給出具體的實例。在這個系統中,串口的命令非常簡單。所有的協議全部在串口中斷中進行。數據包的格式如下:
0x55, 0xAA, 0x7E, 0x12, 0xF0, 0x02, 0x23, 0x45, SUM, XOR, 0x0D
其中0x55, 0xAA, 0x7E為數據幀的幀頭,0x0D為幀尾,0x12為設備的目的地址,0xF0為源地址,0x02為數據長度,后面接著兩個數據0x23, 0x45,從目的地址開始結算累加、異或校驗和,到數據的最后一位結束。
協議解析的目的,首先判斷數據包的完整性,正確性,然后提取數據類型,數據等數據,存放起來用于主程序處理。代碼如下:
if(state_machine == 0) // 協議解析狀態機
{
if(rcvdat == 0x55) // 接收到幀頭第一個數據
state_machine = 1;
else
state_machine = 0; // 狀態機復位
}
else if(state_machine == 1)
{
if(rcvdat == 0xAA) // 接收到幀頭第二個數據
state_machine = 2;
else
state_machine = 0; // 狀態機復位
}
else if(state_machine == 2)
{
if(rcvdat == 0x7E) // 接收到幀頭第三個數據
state_machine = 3;
else
state_machine = 0; // 狀態機復位
}
else if(state_machine == 3)
{
sumchkm = rcvdat; // 開始計算累加、異或校驗和
xorchkm = rcvdat;
if(rcvdat == m_SrcAdr) // 判斷目的地址是否正確
state_machine = 4;
else
state_machine = 0;
}
else if(state_machine == 4)
{
sumchkm += rcvdat;
xorchkm ^= rcvdat;
if(rcvdat == m_DstAdr) // 判斷源地址是否正確
state_machine = 5;
else
state_machine = 0;
}
else if(state_machine == 5)
{
lencnt = 0; // 接收數據計數器
rcvcount = rcvdat; // 接收數據長度
sumchkm += rcvdat;
xorchkm ^= rcvdat;
state_machine = 6;
}
else if(state _machine == 6 || state _machine == 7)
{
m_ucData[lencnt++] = rcvdat; // 數據保存
sumchkm += rcvdat;
xorchkm ^= rcvdat;
if(lencnt == rcvcount) // 判斷數據是否接收完畢
state_machine = 8;
else
state_machine = 7;
}
else if(state_machine == 8)
{
if(sumchkm == rcvdat) // 判斷累加和是否相等
state_machine = 9;
else
state_machine = 0;
}
else if(state_machine == 9)
{
if(xorchkm == rcvdat) // 判斷異或校驗和是否相等
state_machine = 10;
else
state_machine = 0;
}
else if(state_machine == 10)
{
if(0x0D == rcvdat) // 判斷是否接收到幀尾結束符
{
retval = 0xaa; // 置標志,表示一個數據包接收到
}
state_machine = 0; // 復位狀態機
}


此過程中,使用了一個變量state_machine作為協議狀態機的轉換狀態,用于確定當前字節處于一幀數據中的那個部位,同時在接收過程中自動對接收數據進行校驗和處理,在數據包接收完的同時也進行了校驗的比較。因此當幀尾結束符接收到的時候,則表示一幀數據已經接收完畢,并且通過了校驗,關鍵數據也保存到了緩沖去中。主程序即可通過retval的標志位來進行協議的解析處理。
接收過程中,只要哪一步收到的數據不是預期值,則直接將狀態機復位,用于下一幀數據的判斷,因此系統出現狀態死鎖的情況非常少,系統比較穩定,如果出現丟失數據包的情況也可由上位機進行命令的補發,不過這種情況筆者還沒有碰到。
對于主程序中進行協議處理的過程與此類似,主程序循環中不斷的讀取串口緩沖區的數據,此數據即參與到主循環中的協議處理過程中,代碼與上面所述完全一樣。
4. 上位機中的數據接收和命令處理
上位機中數據接收的過程與下位機可以做到完全一致,不過針對不同的串口操作方法有所不同。對于阻賽式的串口讀函數,例如直接進行API操作或者調用windows的串口通信控件,最好能夠開啟一個線程專門用于監視串口的數據接收,每接收到一個數據可以向系統發送一個消息。筆者常用的CSerialPort類中就是這樣的處理過程。CSerialPort打開串口后開啟線程監視串口的數據接收,將接收的數據保存到緩沖區,并向父進程發送接收數據的消息,數據將隨消息一起發送到父進程。父進程中開啟此消息的處理函數,從中獲取串口數據后就可以把以上的代碼拷貝過來使用。

關閉窗口

相關文章

国产色99精品9i| 天堂av在线8| 国产精品日日摸夜夜爽| 免费看毛片网站| 国产精品亚洲综合久久小说 | 成入视频在线观看| 亚洲草久电影| 国产精品久久三区| 在线看日韩欧美| 国内精品二区| 国产真实乱人偷精品| 国产高清视频免费| 伊人春色在线| 四虎5151久久欧美毛片| av亚洲精华国产精华精华| 日韩免费视频线观看| 91精品在线一区| xxxx国产视频| 日日干夜夜操s8| 中文在线观看免费高清| 女生裸体视频网站免费观看| 欧美影院精品| 国产成人综合在线| 欧美精品一区二区在线播放| 国产精品免费一区二区三区观看 | 草莓视频成人appios| 免费亚洲一区| 色噜噜狠狠一区二区三区果冻| 欧美一级淫片播放口| 日本三级免费观看| 一级久久久久久| 91网页版在线登录入口| 久久a级毛片毛片免费观看| 91亚洲精品久久久蜜桃网站| 亚洲图片欧洲图片av| 亚洲精品自在在线观看| 国产精品久久久精品四季影院| 女人被狂躁到高潮视频免费网站| 国产国产一区| 成人晚上爱看视频| 国产一区二区美女视频| 日本免费在线视频观看| 久久久久香蕉视频| 成人短剧在线观看| 都市激情亚洲欧美| 国产欧美日韩三区| 欧美韩国理论所午夜片917电影| 分分操这里只有精品| www.国产毛片| 神马亚洲视频| 欧美二区视频| 在线观看国产日韩| 国产精选在线观看91| 美女洗澡无遮挡| 91九色国产蝌蚪| 一区二区三区日本视频| 91丨九色丨蝌蚪富婆spa| 色哟哟入口国产精品| 久久这里只有精品18| 少妇一级淫片日本| 97人人在线| 免费在线日韩av| 精品国产精品一区二区夜夜嗨| 亚洲高清在线观看一区| 日本少妇bbwbbw精品| gogogo影视剧免费观看在线观看| 成人网18免费网站| 国产欧美日韩亚洲一区二区三区| 欧美日韩人人澡狠狠躁视频| 亚洲最大av网| 欧美一级中文字幕| 黄大色黄女片18第一次| 国产精品444| 成人黄色av网址| 日韩美女黄色片| 高跟丝袜一区二区三区| av一区二区不卡| www.日韩不卡电影av| jizzjizz国产精品喷水| 依依成人在线视频| 国产精品刘玥久久一区| 天堂影院一区二区| 日韩成人中文字幕在线观看| 国产精品av免费观看| 在线播放国产一区| av网站免费在线观看| 美女视频网站久久| 在线电影中文日韩| 中文字幕有码av| 久久精品国产麻豆| 4438全国亚洲精品观看视频| 亚洲人吸女人奶水| 亚洲一区久久久| 五月综合色婷婷| 成人动漫av| 亚洲第一精品影视| 日韩成人激情在线| 日韩亚洲在线视频| 欧美色图影院| 欧美一区二区三区久久| 香蕉成人伊视频在线观看| 国产伦视频一区二区三区| 五月天婷婷综合网| 精品视频在线一区二区| 国产高清视频一区| 91成人国产在线观看| 91国模少妇一区二区三区| 国产免费视频| 亚洲午夜激情在线| 亚洲男人第一av网站| 9久久婷婷国产综合精品性色| 国产天堂视频| 啦啦啦啦免费高清视频在线观看1| 成人羞羞动漫| 欧美不卡一区二区三区四区| 女人扒开屁股爽桶30分钟| 青草青青国产| 男男gay无套免费视频欧美| 精品视频全国免费看| 六月婷婷激情综合| 欧美日本黄色片| 国产成人3p视频免费观看| 欧美三级韩国三级日本三斤| 亚洲高潮无码久久| 欧美精品videossex变态| 秋霞蜜臀av久久电影网免费| 欧美疯狂做受xxxx富婆| 国产精品少妇在线视频| 97久精品国产片一区二区三区| 欧美日韩一二| 亚洲福利精品在线| 国产大片一区二区三区| 99热在线免费观看| 亚洲欧美视频| 欧美国产第一页| 中文字幕第69页| av中文资源在线| 91香蕉国产在线观看软件| 亚洲a成v人在线观看| 波多野结衣一区二区三区在线| 成人免费影院| 天天av天天翘天天综合网色鬼国产 | 国产l精品国产亚洲区在线观看| 日韩精品欧美| 亚洲精品一区二区久| 大尺度在线观看| 在线一二三区| 国产91丝袜在线18| 91久久精品国产91久久性色tv| 这里只有久久精品视频| 日韩护士脚交太爽了| 色美美综合视频| 免费男同深夜夜行网站| 天天操夜夜操免费视频| 免费在线看成人av| 国产精品视频区1| 中文字幕在线观看你懂的| 欧美影院精品| 亚洲激情 国产| 好吊色欧美一区二区三区 | 亚洲人体偷拍| 久久人人爽人人爽人人片av高请| 五月天av网站| 国产高清中文字幕在线| 黑丝美女久久久| 日本精品www| 久久.com| 91网站在线播放| 美媛馆国产精品一区二区| 美女把腿扒开让男人桶免费| 久久福利影院| 久久久久国产一区二区三区| 日韩xxxxxxxxx| 粉嫩91精品久久久久久久99蜜桃| 在线观看欧美日本| 在线观看视频在线观看| 国产原创av在线| 136国产福利精品导航| 国产黄色激情视频| 成人免费观看在线网址| 国产精品一区在线| 免费精品视频一区二区三区| 欧美一区二区三区久久综合| 亚洲一区欧美激情| 国产日韩中文字幕| 深爱激情五月婷婷| 国产一区二区三区自拍| 五月天色婷婷丁香| 一区三区三区不卡| 中文字幕中文字幕在线中高清免费版 | 伊甸园精品99久久久久久| 青青青视频在线免费观看| 国产亚洲精品久久久久久移动网络| 最近中文字幕免费mv2018在线| 黄色综合网站| 91久久一区二区| 国产日产欧美a一级在线| 亚洲第一天堂久久| 午夜在线视频免费| 蜜桃成人365av| 天堂成人国产精品一区| 日韩一区二区在线看| 精品麻豆av| 奇米网一区二区| 俺去啦在线观看| 911精品国产| 国产精品国产三级国产三级人妇| 国产经典av| 国产精品三级视频| 日韩av播放器| av影片在线看| 日韩欧亚中文在线| 亚洲av成人片无码| 忘忧草在线日韩www影院| 精品久久久久久久久久久久包黑料| 你懂得视频在线观看| 国产精品国产亚洲精品| 日韩中文字幕在线精品| 亚洲中文字幕在线一区| 欧美不卡在线| 97视频资源在线观看| 91看片免费版| 久久综合久久99| 欧美黄色一级片视频| 午夜在线小视频| 欧美日韩中文国产| 精品人妻伦九区久久aaa片| 97一区二区国产好的精华液| 欧美多人爱爱视频网站| www.色亚洲| 天堂一区二区在线| 日韩免费av一区二区三区| 九色在线91| 亚洲日本韩国一区| 精品伦一区二区三区| av一区在线播放| 中文字幕综合在线| 99久久国产免费| 日韩不卡一二三区| 亚洲一区二区在线观| 日本视频在线观看免费| 97精品一区| 99久久精品无码一区二区毛片| 中国女人内谢25xxxxx| 91论坛在线播放| 国产又大又黄又粗的视频| 久久香蕉一区| 亚洲欧美日韩国产中文| 伊人免费在线观看高清版| 久久成人亚洲| 色乱码一区二区三区熟女| 青青青手机在线视频观看| 欧美日韩一区不卡| 精品无码人妻一区二区三| 91精品国产自产拍在线观看蜜| 不卡一区二区三区视频| 成人黄18免费网站| 欧美日韩亚洲91| 国产又粗又猛又爽又黄的视频小说| 亚洲激情播播| 91中文字幕在线| 小次郎av收藏家| 五月婷婷激情综合| 日韩欧美123区| 亚洲成人三区| 欧美亚洲另类在线一区二区三区| 在线观看视频色潮| 在线成人免费视频| 7799精品视频天天看| 亚洲一区亚洲| 最新av在线免费观看| 日本中文字幕视频在线| 日韩av在线免费播放| 国产婷婷一区二区三区久久| 国产一区二三区| 亚洲av成人无码久久精品老人 | 一本久道久久综合中文字幕| 综合视频免费看| 四虎影院免费在线| 精品免费视频| 亚洲黄一区二区| 在线播放第一页| 在线免费视频你懂得| 国产精品99久久久久久有的能看| 国产97在线视频| 老司机精品视频导航| 丁香婷婷综合激情| 国精一区二区三区| 久久99精品国产99久久6尤物| 性欧美videos粗暴| 国产精品女人毛片| 女人十八毛片嫩草av| 色天天久久综合婷婷女18| 欧美性色黄大片人与善| 久热国产在线| xxx欧美精品| 精品国产一区二区三区久久久狼牙| 国产精品久久夜| 波多野结衣久久久久| 欧美日韩一区二区高清| 大桥未久一区二区三区| brazzers在线观看| 国内精品久久久久久久久| 软萌小仙自慰喷白浆| 欧美午夜xxx| 无码一区二区三区| 国产福利一区二区三区在线视频| 亚洲综合123| 欧美尿孔扩张虐视频| 含羞草久久爱69一区| av网页在线| 播播国产欧美激情| 日本dhxxxxxdh14日本| 日本高清视频一区二区| 老熟妇一区二区三区啪啪| 福利一区二区在线| 亚洲一区二区三区四区五区六区| 精品国产乱码久久久| 国产亚洲欧洲高清| 亚洲国产精品久久久久婷婷软件| 亚洲精选视频免费看| 国产在线拍揄自揄拍| 久久精品国产一区二区三| 国产精品自在自线| 国产a久久精品一区二区三区| 日韩欧美一区二区三区久久婷婷| 牛牛在线精品视频| 青青草原成人在线视频| 超碰在线首页| 国产亚洲在线播放| 猛性xxxxx| 日韩片之四级片| 影音先锋在线中文字幕| 午夜精品福利在线| 一本到在线视频| 国产欧美一区二区三区在线老狼| 最新av电影网站| 精品一区二区在线播放| 性农村xxxxx小树林| 欧美福利影院| 污污的视频免费| 日韩a一区二区| 久激情内射婷内射蜜桃| av动漫精品一区二区| 亚洲7777| 亚洲成人高清| 蜜桃av噜噜一区二区三区| а√天堂8资源在线| 成人av番号网| 黄色在线免费| 国产精品国产三级国产aⅴ9色| 免费理论片在线观看播放老| 欧美插天视频在线播放| www 四虎| 尤物tv国产一区| 成人淫片免费视频95视频| 亚洲欧美综合图区| japonensisjava老师可播放| 日韩成人av一区| 九九热在线免费视频| 亚洲成人xxx| 色视频线观看在线播放| 亚洲精品一区在线观看| 国产精品yjizz视频网一二区| 欧美酷刑日本凌虐凌虐| 欧美成人禁片在线观看网址| 欧美放荡的少妇| 久热国产视频| 日韩一区二区三| 国产成人精品免费视频大全软件| 日韩一本二本av| 91美剧网在线播放| 亚洲精品美女久久久久| 草草浮力影院| 一区二区三区视频免费在线观看| 午夜爽爽爽男女免费观看影院| 中国日韩欧美久久久久久久久| 116极品美女视频在线观看| 搡老女人一区二区三区视频tv| 美女一级全黄| 欧美国产日产韩国视频| 欧洲天堂在线观看| 国产不卡视频在线| av网站在线免费看推荐| 成人自拍爱视频| 写真福利精品福利在线观看| 日本a级片久久久| 日韩激情欧美| www..com日韩| 久久美女精品| 国产伦精品一区二区三区妓女下载 | 青青色青青操| 中文字幕精品在线视频| 能在线观看av网站| 国内精品久久久久伊人av| 欧美成年黄网站色视频| αv一区二区三区| crdy在线观看欧美| 六月婷婷在线视频| 婷婷亚洲图片|