作者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