|
|
发表于 2015-1-14 14:44:57
|
显示全部楼层
毒师老白 发表于 2015-1-14 14:10 
嗯嗯,测试发现arduino一次是可以接收到那么多信息的,但必须是delay(2),如果改为delay(4)或delay(8)就都 ...
這就是時間上的問題.
你用的是 9600 bps, 發放一個 Byte, 在沒有 overhead 情況下, 大約是 8/9600 約 1 ms.
在接收了一個 byte 後加入 delay, 就是想把連續送來的資料一次過接收, 等待時間略比所需時間長一點就最好. 避免因為下一個 byte 未送到, 而出現 Serial.available() 為 false.
細看一次你的程式, 原來已用了 "signal=-" 作完成碼判斷, 資料可以分段接收, 而非要一次性接收. 基本上 buffer 的問題可解決, 只是每次接收的長度可以會不同.
但另一個問題是 "signal=-" 並非資料的最尾, 當已接收了 "signal=-" 的一句後, 除非處理速度接近發送時間, 否則資料會被分斷, 未完全接收好就會嘗試放出來. 不過, 你又用了最少 2ms 的 delay, 會變成分段接收的機會不大.
至於 delay(4) 及 delay(8), 有可能是處理速度太慢了, 每讀取一個 byte 就要等一段長時間, 幾乎是發送三個才處理一個. 同一個 while loop 內已可以令 buffer 滿了.
由於你已用了 完成碼的判斷 (只是選擇的不太好), 反正不需要一次過完全讀取, 當中的 delay 意義就不大了, 太長反而令接收太慢而出問題.
而 delay(2) 也存在處理太慢的隱憂, 我也不太肯定, 為何你可以沒事. 試想想, 每 1ms 發一個 byte, 你每接一個就等 2ms. 你將用了 200 ms 等待時間 去接收 100 個 byte, 但 200ms 的時間, 對方已可以發送出 200 個 byte 了, 當中 100 個 byte 要放進 buffer, 我也不明白為何你可以沒問題, 難道是發送的時間也有 1ms 的 overhead?
建議改為 delay(1) (本來可以甚至取消 delay, 但又怕會出現使用 string function 太頻密的問題, comdata.substring 有一定的 overhead, 所以 delay(1) 可能更理想), 而 完成碼改為 "XM.5.5.6#" (這看似是最後結束的資料吧). 可能會更有效率.
|
|