質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

0回答

1111閲覧

androidでハンドラとタイマーを使った通信処理がうまくいかない

luckyclock

総合スコア73

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2018/03/28 08:18

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 };

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問