Re: [問題] 輸入流辨別過濾

看板AndroidDev作者 (Y78)時間13年前 (2013/02/24 14:48), 編輯推噓5(5039)
留言44則, 2人參與, 最新討論串2/3 (看更多)
※ 引述《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

02/24 23:35, , 1F
感謝Y大回覆,造福我這種菜逼八的新手QQ
02/24 23:35, 1F

02/25 18:54, , 2F
沒錯, 基本上原原PO的code裡的邏輯可以大幅縮小成Y大寫
02/25 18:54, 2F

02/25 18:55, , 3F
的這樣, 不過個人覺得跑起來應該會不太一樣
02/25 18:55, 3F

02/25 18:56, , 4F
第一點是原原PO的邏輯是,如果是252~255是指定接下來要放
02/25 18:56, 4F

02/25 18:56, , 5F
在哪裡, 然後後面的(非252~255)才是要放進的內容
02/25 18:56, 5F

02/25 18:57, , 6F
例外: 連續兩個相同的 252~255 的值, 則會被當成資料
02/25 18:57, 6F

02/25 18:59, , 7F
但Y大的code裡面 old_IdCheng == IdCheng
02/25 18:59, 7F

02/25 19:00, , 8F
變成只有連續兩個值相同, 才會放進去; 而且有些是資料不
02/25 19:00, 8F

02/25 19:00, , 9F
是 IdCheng, 也要先判斷, 不能直接減
02/25 19:00, 9F

02/25 19:01, , 10F
第二點就是最後要放的 view 應該要根據 IdCheng 決定
02/25 19:01, 10F

02/25 19:01, , 11F
(R.id.view_id1 ~ view_id4)
02/25 19:01, 11F

02/25 19:02, , 12F
另外建議原PO 把 findViewById() 移出這個 loop/event
02/25 19:02, 12F

02/25 19:02, , 13F
事先就把 四個 view 準備好, 不然每一個 byte 來就要做
02/25 19:02, 13F

02/25 19:03, , 14F
一次 findViewbyId(), 效能會很差
02/25 19:03, 14F

02/25 19:03, , 15F
另外要問原原PO進來的資料是 byte values 還是字串?
02/25 19:03, 15F

02/25 19:04, , 16F
看應用很像是 byte values, 可是原原PO的code是把它當成
02/25 19:04, 16F

02/25 19:04, , 17F
字串來轉換, 建議確定一下, 如果真是字串就當我沒說
02/25 19:04, 17F

02/25 21:49, , 18F
感謝M大的指點,我的描述能力太差讓Y大誤解邏輯真是抱歉
02/25 21:49, 18F

02/25 21:50, , 19F
這是我目前修正的程式碼,結合Y大與M大的建議
02/25 21:50, 19F

02/25 21:50, , 20F

02/25 21:54, , 21F
我是直接使用藍牙聊天室範本修改,進來的資料是
02/25 21:54, 21F

02/25 21:55, , 22F
Arduino丟進來的byte數值
02/25 21:55, 22F

02/25 21:56, , 23F
所以說 轉換上建議用byte直接轉換嗎?
02/25 21:56, 23F

02/25 22:25, , 24F
藍牙Andruino這部份我沒概念, 你所列出的code是訊息接收
02/25 22:25, 24F

02/25 22:25, , 25F
端, 那麼重點是要看傳訊息的另一端是如何安排資料的;
02/25 22:25, 25F

02/25 22:25, , 26F
假設傳訊息的一端要送一個byte 0xFF (255), 那麼它是
02/25 22:25, 26F

02/25 22:25, , 27F
如何傳給你呢?
02/25 22:25, 27F

02/25 22:26, , 28F
1. 把 0xFF(255), 轉成十進位的 byte array (中間可能還
02/25 22:26, 28F

02/25 22:26, , 29F
先轉成string), 變成 byte[] a = { 2, 5, 5 };
02/25 22:26, 29F

02/25 22:26, , 30F
再轉型成 msg.obj 送過來? (看你的 code 很像是這樣
02/25 22:26, 30F

02/25 22:26, , 31F
雖然我覺得有點怪, 而且沒效率)
02/25 22:26, 31F

02/25 22:26, , 32F
2. 傳送端直接把幾個 bytes (如 255, 3, 8) 放進 byte
02/25 22:26, 32F

02/25 22:26, , 33F
陣列, 變成 byte[] a = { 255, 3, 8 }; 再轉成
02/25 22:26, 33F

02/25 22:27, , 34F
msg.obj 送過來 (個人覺得比較合理); 所以你收到的
02/25 22:27, 34F

02/25 22:27, , 35F
readBuf[] 其實是三個數字(bytes), 而不是表示一個
02/25 22:27, 35F

02/25 22:28, , 36F
byte 的字串, 但如果真是這樣子, 你現在的 code 就會
02/25 22:28, 36F

02/25 22:28, , 37F
有問題.
02/25 22:28, 37F

02/25 22:28, , 38F
這部份可能你要先確定(傳送端放在 msg.obj 的資料格式)
02/25 22:28, 38F

02/25 22:28, , 39F
(或是上面是1.還是2.), 才有辦法回答你
02/25 22:28, 39F

02/27 07:12, , 40F
M大您好,不好意思最近才測試才有辦法回覆
02/27 07:12, 40F

02/27 07:13, , 41F
目前確定Arduino那邊是您說的第二種方式
02/27 07:13, 41F

02/27 07:13, , 42F
我現在遇到的問題是手機收到的值為ACSII碼
02/27 07:13, 42F

02/27 07:14, , 43F
請問我該怎麼使其轉成 byte原始傳來的值?
02/27 07:14, 43F

02/27 07:20, , 44F
補上伺服器端程式碼 http://pastebin.com/pyu9BTRF
02/27 07:20, 44F
文章代碼(AID): #1HARUaEx (AndroidDev)
討論串 (同標題文章)
文章代碼(AID): #1HARUaEx (AndroidDev)