我們知道,串口的協議數據一般包括 幀頭+地址+功能碼+校驗碼+數據+幀尾 等組成。請教一下,大家平時是怎么處理串口協議的呢,我用過的方法有兩種,第三種方法聽別人說過,但不知道具體是怎么樣的實現思路。第一種:超時判斷,思路就是每在接收到串口數據,進入接收中斷后,保存數據,并賦值一個變量,然后該變量的值在定時器里面自減,若自減到零說明對方數據傳送完成,由此可判斷接收完成,下一步就是在主程序里處理串口數據了。這種辦法現在基本不使用。第二種:在接收中斷里逐級判斷,只有一級一級的數據判斷正確,才進行接收,最后再判斷校驗碼和幀尾,只有整個過程的數據都正確,才能確定數據接收完成,此時置位一個標志位,在主程序里處理通過此標志位執行相應程序?,F在我一直用的就是這種方法,但這種方法很容易有一種限制,就是只能一幀一幀的處理數據,就是說對方發了一幀數據后,下一幀數據要間隔一段時間(如10MS)再發送,如果兩幀或以上的數據一起發送,第二種處理方法就會產生錯誤。第三種:我也是聽人說過,就是可以解決第二種只能一幀一幀接收數據的問題,具體的實現思路我也不清楚,只能分別簡單描述一下,第三種方法也是我上來發帖請教的目的。這種處理方法就是開辟一個相對較大的數組用于存放接收到的數據,接收程序只管接收數據,若接收到的數據到達數組尾端,下一個接收到的數據又會從數組頭開始存放,即會把之前存放的數據覆蓋掉。 在主程序里,不斷掃描數組里面存放的數據,搜索里面的功能協議,每一條協議都要從數組里搜索一遍,每次循環都要這樣做。我的疑問是懷疑自己理解錯了,要是這樣的話,單單搜索協議都要耗費大量的CPU時間,貌似不太現實。
1:第一種方法主要適用于變字長幀接收,缺點是要占用一個定時器(兩字節間隔超過4個字節時間即認為一幀傳輸完畢);2:如果數據幀是定字長,那么你最好使用你的第二種方法3:第三種實際就是以上兩種的延伸,主要適用于通信速率繁忙的狀況下,你可以開辟多個變量記錄每幀的字長,循環處理存放數據即可,內部RAM夠大不怕浪費你可以使用多緩存數組+狀態機處理