androidにてBLEデータの送受信の処理を作っているのですが、思うように
動いてくれません。
通信の流れは
RA送信→RA応答受信→P送信→P応答受信→Pリピート→OFF送信
という流れです。
送信は100ms周期のタイマータスクを使って変数txProgState
に応じてコマンドをtxDataにて送信します。
受信処理はUIを操作する関係上ハンドラを使って受信データの
処理とUIの処理をまとめて行っています。
そしてhandleMessage内で応答がきたらtxProgStateを次のコマンドに進めています。
ここで問題になってくるのが受信ハンドラ内でRAの応答がきたら
txProgState = 1にしている部分なのですが、
タイマとハンドラの起動のタイミングの問題なのか
受信ハンドラのcase 0:でブレークを貼りtxProgState = 1になったことを確認
次のSendDataTimerでブレークを貼ると受信ハンドラで1にしたにも
かかわらずtxProgState = 0になっておりcase 1に入っていかないというような
ことが起こります。
これはなぜでしょうか?
またソフトの作り的にはUI操作部分とデータ処理部分を完全にわけて、
ハンドラではUIの処理のみを行うようにした方がよいのでしょうか?
(進行ステータスのtxProgStateなどの変数を受信ハンドラでいじらない)
他にもいいつくり方があればご教授お願いいたします。
送信タイマー
public class SendDataTimer extends TimerTask { @Override public void run() { String txString = ""; String ad; switch (txProgState){ case 0: txString = "RA" + "\r\n"; break; case 1: ad = String.format("%02d", address); String num = String.format("%03d", pointer); txString = "@" + ad + "P" + num + "\r\n"; break; case 2: ad = String.format("%02d", address); txString = "@" + ad + "OF" + "\r\n"; break; } if(txState == TX_STATE_OK) { if(txData(txString)){ txState = TX_STATE_RES; //応答待ち timeOutCt = TIME_OUT; } } } }
受信ハンドラ データ受信が完了したらmBleHandler.sendEmptyMessage(MESSAGE_NEW_RECEIVEDNUM);
をコールする
java
1 private Handler mBleHandler = new Handler() 2 { 3 public void handleMessage(Message msg) 4 { 5 // UIスレッドで実行する処理. 6 switch (msg.what) 7 { 8 case MESSAGE_NEW_RECEIVEDNUM: 9 //受信データのチェック 10 String data = rxBuffer.toString(); 11 switch (txProgState){ 12 case 0: //RA送信中=RA応答と判断する 13 if(chkRACommandFormat(data)){ 14 t = (TextView) findViewById(R.id.rxTextView); 15 t.setText("受信ログ:RA"); 16 if(txState == TX_STATE_RES) { 17 txProgState = 1; 18 } 19 } 20 break; 21 case 1: //P送信中=P応答と判断する 22 if(chkPCommandFormat(data)){ //Pコマンドの応答フレームチェック 23 t = (TextView) findViewById(R.id.rxTextView); 24 t.setText("受信ログ:P" + pointer); 25 pCommandOp(data); //データ処理 26 } 27 break; 28 case 2: //OFF送信中=OFF応答と判断する 29 txProgState = 0; 30 break; 31 } 32 timeOutCt = TIME_OUT; //受信したのでタイムアウト初期化 33 //データ処理終了したらバッファクリア 34 rxBuffer.delete(0, rxBuffer.length()); 35 txState = TX_STATE_OK; //送信可とする 36 } 37 } 38 };
あなたの回答
tips
プレビュー