W801的DEMO裡面,注冊的串口回調,測試了下發送幾十個字節,會進入3次串口回調,每次接收部分長度,如何可以改成根據時間來判斷,超過多少ms未收到新數據,再進入回調,或者這個有查詢啟動時間的API麼?我主任務來判斷數據變化,超過多長時間沒變,才處理數據
因為串口收發數據,沒有開始結束的標志。 因此發送一段命令,是否結束,需要靠解析命令的格式來進行。這也就是為什麼很多 GPS,GPRS,4G 通信模塊 使用 AT+ 指令的接口,AT就是一個命令的開頭,按一定的格式,來判斷是否接收到了完整的命令,這種常使用 ASIC 編碼通信。
還可以通過時隙來判斷,比如,收發端約定,兩個命令間隔必須大於 0.5 秒,那麼只有超過0.5秒時,才去判斷指令是否發送完畢,這種模式一般跟第一種一起用。因為很多鏈路不保證通信速率,因此可能造成通信延遲。
這也就是很多 AT 指令設計了回應口令的機制。即,發送端發送一個命令後,接收端如果接收完整,那麼回應一個OK,發送端如果沒收到這個回應,那麼發送端將嘗試重發....
另外可以通過,在指令前後加一個校驗,比如包格式,內帶長度,CRC, CHEKKSUM 等信息,來校驗指令的完整性,這個一般用在可靠性要求高的通信上,常用二進制數據通信。
這樣,通過通信過程的控制個約定機制,來保證發送數據的完整和可靠。
主要這塊我想用json,我想過用格式校驗,但是一旦發了一個錯誤的json 比如我就發一個{ ,就會導致後面接收的所有JSON都沒法處理,所以必須加個時間校驗,之前習慣的做法是,超過5ms沒有新數據進來就判斷接收到一整包數據,就算用AT指令判斷個rn 發一個錯誤的數據之後 再發AT指令也是會解析失敗,需要下一條指令才能正常處理
你可以在 json 外面加上一個封裝,比如 json:[*]rn ,以 "json:"作為開始的判斷字符串,以 "rn"作為結束的判斷字符串,然後解析取出中間的 "[]" 的內容,脫去方括號,然後再交給 json 的 parser
你可以在 json 外面加上一個封裝,比如 json:[*]\r\n ,以 "json:"作為開始的判斷字符串,以 "\r\n"作為結束的判斷字符串,然後解析取出中間的 "[]" 的內容,脫去方括號,然後再交給 json 的 parser 來解析。
嗯嗯,這個辦法是可以,不過還是想傳輸的格式光是JSON
串口是底層協議,不能用底層協議直接傳輸業務層內容。 如果 TCP,它的底層也是做了封包,在解封包後,再交給上層處理,你看到的純數據是因為底層協議棧給處理好了。
而串口,需要你自己來做這些事。
嗯嗯 另外一個想法就是自己通過間隔判斷,不想間隔任務再去單獨判斷時間,想的有沒有那個接口可以查詢運行時間,通過這個相減去判斷數據間隔,做封包
你可以通過接收字符設定一個最近的收到數據的時間變量,隨時檢查當前時間和最近接收字符的時間變量的差,是否大於一個設定值來判斷,是否停止發送了一段時間。
這樣做,其實效率變低了,用時間等待來控制數據發送的完整性。 不如用包頭尾的協議來檢查完整性效率高。效率高也意味對應用數據的通訊速度快。