串口的協(xié)議數(shù)據(jù)一般包括 幀頭+地址+功能碼+校驗(yàn)碼+數(shù)據(jù)+幀尾 等組成。
第一種:超時(shí)判斷,思路就是每在接收到串口數(shù)據(jù),進(jìn)入接收中斷后,保存數(shù)據(jù),并賦值一個(gè)變量,然后該變量的值在定時(shí)器里面自減,若自減到零說明對(duì)方數(shù)據(jù)傳送完成,由此可判斷接收完成,下一步就是在主程序里處理串口數(shù)據(jù)了。
這種辦法現(xiàn)在基本不使用。
第二種:在接收中斷里逐級(jí)判斷,只有一級(jí)一級(jí)的數(shù)據(jù)判斷正確,才進(jìn)行接收,最后再判斷校驗(yàn)碼和幀尾,只有整個(gè)過程的數(shù)據(jù)都正確,才能確定數(shù)據(jù)接收完成,此時(shí)置位一個(gè)標(biāo)志位,在主程序里處理通過此標(biāo)志位執(zhí)行相應(yīng)程序。
現(xiàn)在我一直用的就是這種方法,但這種方法很容易有一種限制,就是只能一幀一幀的處理數(shù)據(jù),就是說對(duì)方發(fā)了一幀數(shù)據(jù)后,下一幀數(shù)據(jù)要間隔一段時(shí)間(如10MS)再發(fā)送,如果兩幀或以上的數(shù)據(jù)一起發(fā)送,第二種處理方法就會(huì)產(chǎn)生錯(cuò)誤。
第三種:我也是聽人說過,就是可以解決第二種只能一幀一幀接收數(shù)據(jù)的問題,具體的實(shí)現(xiàn)思路我也不清楚,只能分別簡(jiǎn)單描述一下,第三種方法也是我上來發(fā)帖請(qǐng)教的目的。
這種處理方法就是開辟一個(gè)相對(duì)較大的數(shù)組用于存放接收到的數(shù)據(jù),接收程序只管接收數(shù)據(jù),若接收到的數(shù)據(jù)到達(dá)數(shù)組尾端,下一個(gè)接收到的數(shù)據(jù)又會(huì)從數(shù)組頭開始存放,即會(huì)把之前存放的數(shù)據(jù)覆蓋掉。
在主程序里,不斷掃描數(shù)組里面存放的數(shù)據(jù),搜索里面的功能協(xié)議,每一條協(xié)議都要從數(shù)組里搜索一遍,每次循環(huán)都要這樣做。我的疑問是懷疑自己理解錯(cuò)了,要是這樣的話,單單搜索協(xié)議都要耗費(fèi)大量的CPU時(shí)間,貌似不太現(xiàn)實(shí)。