作者Y78 (Y78)
看板AndroidDev
标题Re: [问题] 输入流辨别过滤
时间Sun Feb 24 14:48:02 2013
※ 引述《xezct1213 (xezct)》之铭言:
: 大家好,新手发问,请前辈给我意见QQ。
: 问题如题
: 输入流会不断丢值
: 例如:556 88 98 98 555 64 87 84
: 其中555是第一个辨识ID,556是第二个辨识ID
: 侦测到556这个辨识ID,把接下来的值存入对应阵列
: 侦测到555这个辨识ID,把接下来的值存入对应阵列
: 可以麻烦前辈给我关键字搜寻相关应用方法吗?
: 谢谢。
http://pastebin.com/QVb2tM3Z
从程式码看起来 主要的code就分成五个if (IdCheng = {0,1,2,3,4})
可以发现里面都有做一样的事情 所以可以抽出来减少code的长度
byte[] readBuf = (byte[]) msg.obj;
String readMessage = new String(readBuf, 0, msg.arg1);
int ConvertMsg = Integer.parseInt(readMessage);
这三行可以从if里面抽出来 code瞬间少了3*4 = 12行
变成这样
http://pastebin.com/tcvKLFYi
再来每个if里面的判断 皆是在判断ConvertMsg的值
例如说
if (ConvertMsg == 254) {
IdCheng = 2;
}else if (ConvertMsg == 253) {
IdCheng = 3;
}else if (ConvertMsg == 252) {
IdCheng = 4;
}else {
String aaa = readMessage;
id1 = (TextView) findViewById(R.id.view_id1);
id1.setText(aaa);
}
这边有两种情况 第一种是ConvertMsg的值只有252,253,254,255四种情形
这种情形就很好解决 (第二种情况就是不只这些值 再做一些处理即可)
可以宣告一个二维阵列
int map[5][4] = {
{1,2,3,4},
{1,2,3,4},
{1,2,3,4},
{1,2,3,4},
{1,2,3,4}
};
或是可改成用回圈来赋值
for(int i=0;i<5;i++){
for(int j=0;j<4;j++){
map[i][j] = j+1;
}
}
这样你的code就可以很方便的改写为
byte[] readBuf = (byte[]) msg.obj;
String readMessage = new String(readBuf, 0, msg.arg1);
int ConvertMsg = Integer.parseInt(readMessage);
int old_IdCheng = IdCheng;
IdCheng = map[IdCheng][ConvertMsg-252];
if(old_IdCheng == IdCheng){
String aaa = readMessage;
id1 = (TextView) findViewById(R.id.view_id1);
id1.setText(aaa);
}
以上是比较通用的方法
但是如果你资料格式真的长这样的话 连阵列都不需要
因为观察後可得ConvertMsg + IdCheng = 256
直接把IdCheng = map[IdCheng][ConvertMsg-252] 那行改成
IdCheng = 256-ConvertMsg;
最後的code
http://pastebin.com/EgtyGjWY
如果我没想错的话 这段code跟你推文中附上的code应该会跑出一样的结果
(不过我没测试过不敢保证)
希望没有理解错误
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.34.137.127
1F:推 xezct1213:感谢Y大回覆,造福我这种菜逼八的新手QQ 02/24 23:35
2F:推 MetalChao:没错, 基本上原原PO的code里的逻辑可以大幅缩小成Y大写 02/25 18:54
3F:→ MetalChao:的这样, 不过个人觉得跑起来应该会不太一样 02/25 18:55
4F:→ MetalChao:第一点是原原PO的逻辑是,如果是252~255是指定接下来要放 02/25 18:56
5F:→ MetalChao:在哪里, 然後後面的(非252~255)才是要放进的内容 02/25 18:56
6F:→ MetalChao:例外: 连续两个相同的 252~255 的值, 则会被当成资料 02/25 18:57
7F:→ MetalChao:但Y大的code里面 old_IdCheng == IdCheng 02/25 18:59
8F:→ MetalChao:变成只有连续两个值相同, 才会放进去; 而且有些是资料不 02/25 19:00
9F:→ MetalChao:是 IdCheng, 也要先判断, 不能直接减 02/25 19:00
10F:→ MetalChao:第二点就是最後要放的 view 应该要根据 IdCheng 决定 02/25 19:01
11F:→ MetalChao:(R.id.view_id1 ~ view_id4) 02/25 19:01
12F:→ MetalChao:另外建议原PO 把 findViewById() 移出这个 loop/event 02/25 19:02
13F:→ MetalChao:事先就把 四个 view 准备好, 不然每一个 byte 来就要做 02/25 19:02
14F:→ MetalChao:一次 findViewbyId(), 效能会很差 02/25 19:03
15F:→ MetalChao:另外要问原原PO进来的资料是 byte values 还是字串? 02/25 19:03
16F:→ MetalChao:看应用很像是 byte values, 可是原原PO的code是把它当成 02/25 19:04
17F:→ MetalChao:字串来转换, 建议确定一下, 如果真是字串就当我没说 02/25 19:04
18F:推 xezct1213:感谢M大的指点,我的描述能力太差让Y大误解逻辑真是抱歉 02/25 21:49
19F:→ xezct1213:这是我目前修正的程式码,结合Y大与M大的建议 02/25 21:50
21F:→ xezct1213:我是直接使用蓝牙聊天室范本修改,进来的资料是 02/25 21:54
22F:→ xezct1213:Arduino丢进来的byte数值 02/25 21:55
23F:→ xezct1213:所以说 转换上建议用byte直接转换吗? 02/25 21:56
24F:推 MetalChao:蓝牙Andruino这部份我没概念, 你所列出的code是讯息接收 02/25 22:25
25F:→ MetalChao:端, 那麽重点是要看传讯息的另一端是如何安排资料的; 02/25 22:25
26F:→ MetalChao:假设传讯息的一端要送一个byte 0xFF (255), 那麽它是 02/25 22:25
27F:→ MetalChao:如何传给你呢? 02/25 22:25
28F:→ MetalChao:1. 把 0xFF(255), 转成十进位的 byte array (中间可能还 02/25 22:26
29F:→ MetalChao: 先转成string), 变成 byte[] a = { 2, 5, 5 }; 02/25 22:26
30F:→ MetalChao: 再转型成 msg.obj 送过来? (看你的 code 很像是这样 02/25 22:26
31F:→ MetalChao: 虽然我觉得有点怪, 而且没效率) 02/25 22:26
32F:→ MetalChao:2. 传送端直接把几个 bytes (如 255, 3, 8) 放进 byte 02/25 22:26
33F:→ MetalChao: 阵列, 变成 byte[] a = { 255, 3, 8 }; 再转成 02/25 22:26
34F:→ MetalChao:msg.obj 送过来 (个人觉得比较合理); 所以你收到的 02/25 22:27
35F:→ MetalChao:readBuf[] 其实是三个数字(bytes), 而不是表示一个 02/25 22:27
36F:→ MetalChao: byte 的字串, 但如果真是这样子, 你现在的 code 就会 02/25 22:28
37F:→ MetalChao: 有问题. 02/25 22:28
38F:→ MetalChao:这部份可能你要先确定(传送端放在 msg.obj 的资料格式) 02/25 22:28
39F:→ MetalChao:(或是上面是1.还是2.), 才有办法回答你 02/25 22:28
40F:推 xezct1213:M大您好,不好意思最近才测试才有办法回覆 02/27 07:12
41F:→ xezct1213:目前确定Arduino那边是您说的第二种方式 02/27 07:13
42F:→ xezct1213:我现在遇到的问题是手机收到的值为ACSII码 02/27 07:13
43F:→ xezct1213:请问我该怎麽使其转成 byte原始传来的值? 02/27 07:14