作者MetalChao (饅頭)
看板AndroidDev
標題Re: [問題] Arduino藍牙快速傳值,造成數值錯亂
時間Fri Mar 8 14:02:41 2013
試著在你的Main受值程式碼裡面, 把 buffer 的 allocation 移到 loop 裡面
while (true) {
try {
byte[] buffer = new byte[1024]; ==> 從外面移進來
// Read from the InputStream
bytes = mmInStream.read(buffer);
....
雖然無法確定這是不是你這個問題的主因 (很有可能)
但原來的code可能有潛在的問題
因為你只有一份 buffer
當你收到第一筆資料, 透過 message 叫 UI thread 來處理同一個 buffer
而在同一個時間(可能還沒處理完), 有可能第二筆資料剛好來,
就會把 buffer 的內容覆蓋掉 (而 UI thread 可能還沒處理完舊的資料)
※ 引述《xezct1213 (xezct)》之銘言:
: 板上前輩大家好
: 使用Arduino延遲10ms為間距
: 透過藍牙傳值給手機
: 手機受值會出現數值錯亂的現象
: 例如:
: Arduino傳61.62.63.64
: 手機端顯示61.62.63.63.63.61
: 程式碼的部分是用BluetoothChat修改
: BluetoothChatService受值程式碼
: http://pastebin.com/hTjvskXr
: Main受值顯示程式碼
: http://pastebin.com/AsNqREnm
: ※給Arduino電壓是夠的
: 麻煩前輩解,感謝閱讀與回覆,謝謝您。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 210.80.67.18
※ 編輯: MetalChao 來自: 210.80.67.18 (03/08 14:03)
※ 編輯: MetalChao 來自: 210.80.67.18 (03/08 14:11)
1F:推 xezct1213:移進來還是有相同的狀況 QQ 03/08 23:27
2F:推 ChonPiggy:這個時候 buffer 不是已經丟去 Handler 了嗎? 03/09 02:40
3F:→ ChonPiggy:還是他實際上還是指向同一個 buffer array ? 03/09 02:40
4F:→ ChonPiggy:我倒是很想先檢查 Handler 實際上收到的 buffer 內容 03/09 02:41
5F:→ ChonPiggy:先不做處理單純先印出來比對看看 03/09 02:41
6F:→ MetalChao:原來的code實際 byte array 只有一份,全部人都共用那一 03/09 13:33
7F:→ MetalChao:份 buffer; 只要 UI thread 來不及處理完,就可能出問題 03/09 13:34
8F:→ MetalChao:如果這個潛在問題改了還是不行,我也看不出來哪裡有問題 03/09 13:38
9F:→ MetalChao:了; 你可以照樓上的方式, 收到一段資料後, 先把全部內容 03/09 13:39
10F:→ MetalChao:印到 log 或 console 看看 03/09 13:40
11F:→ MetalChao:看是不是收到的資料就有錯 03/09 13:40
12F:推 CHOUWILL:如果讓while迴圈sleep直到case read處理完呢? 03/10 00:03
13F:推 xezct1213:C大的方法看不懂(〒︿〒) 03/11 18:58
14F:→ xezct1213:可以麻煩c大敘述詳細一點嗎?謝謝 03/11 18:58
15F:→ MetalChao:現在每次都重新 new 一個 buffer, 有沒有等就沒差了 03/11 19:10
16F:→ MetalChao:要的話就變成反過來UI thread要讓 receiving thread 知 03/11 19:11
17F:→ MetalChao:道, 便要做額外的溝通 (可利用 wait/notify) 03/11 19:11
18F:→ MetalChao:可以試試, 但我覺得如果在 loop 裡 new buffer 沒辦法 03/11 19:12
19F:→ MetalChao:解決, 等待做完這個方法可能也無法解決 03/11 19:12
20F:→ MetalChao:因為那表示我說的可能原因並不是原PO問題的主因 03/11 19:14
21F:→ MetalChao:另外要問原PO的是,如果每10ms送一筆資料, 然後你的UI 03/11 19:31
22F:→ MetalChao:又只有2個,那麼如果連續兩個 byte 都要寫到同一個 UI 03/11 19:32
23F:→ MetalChao:view 的話? 不是很快(0.01秒)就蓋掉原來的那個值了嗎? 03/11 19:33
24F:推 xezct1213:M大,我是利用ListView做顯示,用來即時顯示Arduino傳 03/12 02:18
25F:→ xezct1213:來的時間訊息 03/12 02:18