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