久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2512|回復: 0
打印 上一主題 下一主題
收起左側

單片機和DSP等嵌入式系統中串口通信幀的同步方法

[復制鏈接]
跳轉到指定樓層
樓主
ID:107593 發表于 2016-3-11 01:59 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
串口通信是日前單片機和DSP等嵌入式系統之間,以及嵌入式系統與PC機或無線模塊之間的一種非常重要且普遍使用的通信方式在嵌入式系統的硬件結構中,通常只有一個8位或16位的CPU,不僅要完成主流程的工作,同時還要處理隨時發生的各種中斷,因而嵌入式系統中的串口通信程序設計與PC機有很大的不同若嵌入式系統中。中斷服務子程序在系統運行過程中占用了較多的時間,就有可能在中斷眼務子程序正運行時,又產生一個同類型或其他類型的中斷,從而造成主程序得不到執行或后續中斷數據丟失所以,嵌入式系統中的串口通信雖然看似簡單,但其中仍有許多問題值得研究,例如串口通信過程中的幀同步問題本文針對該問題給出了逐次比較、基于FIFO隊列和基于狀態機的3種幀同步方法通過測試、分析和比較得出,基于有限狀態機的方法是嵌入式系統串口通信中很有效的幀同步方法,同時也是一種很不錯的串口通信程序設計結構 。
1 串口通信的數據幀結構
現代工業控制,往往需要由多個獨立的控制模塊來共同完成它們之間通過串口通信完成復雜的控制過程,必須在通信過程中加入必要的通信協議,以提高系統的可靠性和穩定性;而要完成特定的通信協議,就得有一定的同步機制下面介紹一下簡化的串口通信數據幀結構,以便分析說明嵌入式系統串口通信過程中的幀同步方法。
假定串口發送的數據幀結構為:





其中:包頭用于同步,一般是一個或多個ASCII字符,本文中假定數據幀同步頭有2字節(0xAA、0x55);包長表示數據包中除去包頭和包長的字節數,一般用約定好的幾個字節表示;類型為通信協議里規定的命令類型;數據為應發送的主要信息;校驗通常采用單字節“異或”的方法。
2 串口通信中的幀同步方法
2.1 逐次比較的幀同步方法
首先等待串口數據,將接收到的第1個字節數據與約定好的包頭信息的第1個字節進行比較如果不正確,則等待新字節,直到接收的數據與包頭信息的第1個字節相同第1個字節比較正確以后,將收到的第2個字節與包頭信息的第2個字節進行比較如果仍然正確,則說明串口接收已經同步,可以開始接收數據幀中的數據部分;否則,重新開始同步過程其程序流程如圖1所示。






此種方法代碼量小,編程簡單,一般用于在主程序中以非中斷方式接收串口數據、實時性很差、數據幀較短的場合但是,在串口速度過快且包頭字節數比較多的情況下,串口實現同步花費的時間很長或很難實現同步例如,串口接收到序列Ox0O OxAA0xAA 0x55…,當遇到第一個“0xAA”時,該方法認為第1個字節正確開始比較第2個同步頭第2個字節仍是“0xAA”而不是“0x55”,所以必須等待新的字節重新開始比較第1個同步頭而緊隨其后的是“0x55”,因而,此時包頭的第1個字節也沒有同步上事實上,“0x00 OxAA”是干擾字節,“0xAA 0x55”才是通信協議中的同步頭。
2.2 基于FIFO隊列的幀同步方法
根據同步包頭的長度,定義一個相同長度的全局字節數組,把該數組看成是一個如圖2所示的先入先出(FIFO)的隊列程序流程如圖3所示。






本例中定義兩個字節HEADl和HEAD2,都初始化為0xFF同步時,丟棄數組頭字節HEADl,數組中的所有數據向前移動一個字節,串口接收到的新字節存入數組末字節HEAD2中,將整個數組與協議中的包頭信息比較如果正確,則置位已同步標志位,然后開始接收、存儲有用數據;否則,繼續等待同步串口數據接收完后,不僅要清除已同步標志,還要把HEADl和HEAD2兩個字節都賦值0xFF;否則,將會影響下一幀數據的同步和接收用前面提到的序列“0x00 0xAA 0xAA 0x55…”進行測試,隨著串口接收中斷收到新的字節幀同步隊列中的數據依次為:[0xFF,0xFF]→[0x00,0xFF]→[0xAA,0x00]→[0xAA,0xAA]→[0x55,0xAA]此時,該算法檢測出[HEAD2,HEAD2]==[0x55,0xAA],從而實現了同步,置位已同步標志位以便下次進入串口接收中斷服務子程序時開始接收數據包的數據部分。
此種方法與逐次比較的幀同步方法相比,能夠比較快速、正確地檢測出同步包頭;但是如果包頭的字節數很多,同步過程中每次進入串口中斷服務子程序都要進行大量的字節搬移,將必然耗費很長的時間為了使嵌入式系統更健壯,程序設計應把握的基本原則之一就是使中斷處理程序最短所以基于FIFO隊列的幀同步方法也不是最優的。
2.3 基于有限狀態機的幀同步方法
為解決以上問題,可以采用基于有限狀態機的設計方法該方法將數據幀的接收過程分為若干個狀態:接收信息頭HEADl狀態、接收信息頭HEAD2狀態、接收包長狀態、接收數據類型狀態、接收數據狀態及接收校驗和狀態系統的初始狀態為HEADl狀態,各接收狀態間的狀態轉移圖如圖4所示,仍用前面提到的序列“0x00 0xAA 0xAA 0x55…”進行測試隨著串口接收中斷新字節的接收,系統的接收狀態依次為HEAD1→HEAD1→HEAD2→HEAD2→LEN可見此時就是同步狀態該方法也快速、有效地實現了同步;但是需要注意的是,在每一次接收完1幀完整的數據之后,必須把系統的接收狀態重新設置為HEADl,否則將會影響下一幀的數據接收。






此后,程序按照協議開始依次接收數據幀長度、命令類型、數據和校驗位接收完后,重新設置系統接收狀態為HEADl,同時對該數據幀進行校驗校驗正確后,利用消息機制通知主程序根據命令類型對數據幀進行處理或執行相應的命令操作。
下面給出該方法在KeilC5l中的示例程序:














由于采用了狀態機和消息機制的結構,上述設計思路快速有效地實現了串口通信的同步,而且程序結構清晰,便于維護,也易于向其他的串口通信協議移植另外,串口中斷服務子程序中需要處理的工作很少,每個串口接收中斷平均耗時不超過20個機器周期(在單片機AT89C5l中),大大減輕了串口接收中斷服務程序的壓力,緩解了嵌入式系統有限資源與需求之問的矛盾,提高了嵌入式系統的穩定性。
3 結論
從上面的分析和測試可以看出,基于有限狀態機的串口通信幀同步方法是本文中提出的3種幀方法中最優的,結構清晰且系統資源利用率高。
對一個有著完整通信協議的串口中斷來說,因為要比較命令頭、完成校驗、解析數據等需要耗費大量的機器周期,所以嵌入式系統中的串口中斷服務程序設計顯得更為重要在實際的串口通信程序中,可采用狀態機和消息機制相結合的方法,僅在中斷服務程序中設置一個標志,而在主程序中根據相應標志來作處理,這樣就回避了某些中斷可能需要較長處理時間的問題在程序結構上,由于采用狀態機的結構,既提高了可讀性同時又提高了運行速度,因而該方法不僅是一種很好的幀同步方法,還是一種很不錯的串口通信程序設計方法。



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 色综合久久久 | 91电影院| a黄在线观看 | 在线观看亚洲 | 中文字幕亚洲精品 | 秋霞在线一区二区 | 欧美一级欧美三级在线观看 | 国产精品国产精品国产专区不片 | 欧美一区二区三区在线观看 | 免费的av | 久久精品国产a三级三级三级 | 国产精彩视频 | 色天天综合 | 2020天天操| 久久99精品久久 | 天天躁日日躁性色aⅴ电影 免费在线观看成年人视频 国产欧美精品 | 免费一区二区三区 | 国产在线一区二区三区 | 久久高清精品 | 91网站视频在线观看 | 麻豆精品国产91久久久久久 | 国产午夜精品一区二区三区四区 | 日韩欧美电影在线 | 在线播放日韩 | 亚洲人成一区二区三区性色 | 久久久久国产精品 | 人人鲁人人莫人人爱精品 | 国产成人午夜电影网 | 日韩精品一区二区三区中文在线 | 91精品国产91久久久久久最新 | 精品免费国产一区二区三区 | 久在线精品视频 | 日韩一区二区三区在线观看 | 中文字幕亚洲专区 | 成人高清视频在线观看 | 看片91| 国产在线观看一区二区三区 | 五月婷婷色| 欧美福利一区 | 国产精品一区二区在线播放 | 亚洲www啪成人一区二区 |