前提・実現したいこと
AndroidとBLEデバイスで通信するプログラムを作成しています。
Androidからマイコンに"a"と書き込むと、マイコンに接続されたLEDのHigh/Lowを反転するプログラムです。
マイコンはLEDをHigh/Lowした際に、Androidに"H"または"L"の値を返します。
接続は以下の通りです。
Android(Pixcel3a) ⇔ BLEモジュール(HM-19) ⇔ マイコン(PIC)
Android(Pixcel3a) ⇔ BLEモジュール(HM-19) はBLE接続。
BLEモジュール(HM-19) ⇔ マイコン(PIC)はシリアル通信です。
Androidから"a"を送信し、マイコンが受信してLEDをON/OFFするところまでは、意図したとおりに動作しました。
発生している問題・エラーメッセージ
マイコンはLEDをHigh/Lowした際に、Androidに"H"または"L"の値を返します。
この値がAndroid側でうまく受信できません。
Notifyを設定して、onCharacteristicChangedが呼び出されるところは正常に動作しているようです。
bluetoothGatt.readCharacteristic(characteristic);を実行して、onCharacteristicReadが呼び出されるところも正常に動作していそうです。
characteristic.getValue();で値をとりだして、TextViewに表示するところで問題が発生します。
マイコン側から"H"や"L"を送信した場合、Android側では以下の7byteの値が受信されます。
A4 DA 32 67 16 F6 FB
これは"H"でも"L"でも同じ値です。
また、"HH"など文字列の長さを変えても同じ値です。
BLEモジュールを製作しているDSD TECH社が配布しているアプリがあるので、そのアプリを使用して書き込み、読み込みをすると意図したとおりに動作します。
"a"を送信して、LEDを反転して、"H"や"L"を正常に受信できます。文字列を"LED_ON"や"LED_OFF"に変更しても、正常に受信できます。
そのため、マイコン側は意図したとおりに動作していると思われます。
該当のソースコード
JAVA
1 //Notify(キャラスタリスティックの変更通知)処理 2 @Override 3 public void onCharacteristicChanged( BluetoothGatt gatt, BluetoothGattCharacteristic characteristic ) 4 { 5 //呼び出したUUID取り出す 6 String _uuidNotify; 7 _uuidNotify = characteristic.getUuid().toString(); 8 ///呼び出したUUID毎に処理を分ける 9 switch (_uuidNotify){ 10 case UUID_0: 11 Log.d("BLE", "変更通知(UUID_0)"); 12 break; 13 case UUID_1: 14 Log.d("BLE", "変更通知(UUID_1)"); 15 bluetoothGatt.readCharacteristic(characteristic); 16 break; 17 case UUID_2: 18 Log.d("BLE", "変更通知(UUID_2)"); 19 break; 20 } 21 return; 22 } 23 24 // キャラクタリスティックが読み込まれたときの処理 25 @Override 26 public void onCharacteristicRead( BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status ) 27 { 28 if( BluetoothGatt.GATT_SUCCESS != status ) 29 { 30 Log.d("BLE", "読み込み失敗"); 31 return; 32 }else{ 33 Log.d("BLE", String.valueOf(status)); 34 //呼び出したUUID取り出す 35 String _uuidRead; 36 _uuidRead = characteristic.getUuid().toString(); 37 ///呼び出したUUID毎に処理を分ける 38 switch (_uuidRead){ 39 case UUID_0: 40 Log.d("BLE", "読み込み(UUID_0)"); 41 break; 42 case UUID_1: 43 Log.d("BLE", "onCharacteristicRead\nstatus=" + String.valueOf(status) + "\n読み込み(UUID_1)"); 44 byte[] data = characteristic.getValue(); 45 final StringBuilder sb = new StringBuilder(); 46 for (byte _data : data) { 47 sb.append(String.format("%02X ", _data)); 48 } 49 final String result = sb.toString(); 50 tvRead.append("read:" + result + "\n"); 51 break; 52 case UUID_2: 53 Log.d("BLE", "読み込み(UUID_2)"); 54 break; 55 } 56 return; 57 } 58 59 }
試したこと
・マイコン側から送信する文字列を変えてみる。int型の値を送ってみる。
→毎回同じ値(A4 DA 32 67 16 F6 FB)を受信する。
・マイコン側から空の値("")を送信する。
→なにも受信しない。
補足情報(FW/ツールのバージョンなど)
AndroidStudio:ArcticFox|2020.3.1
Android:Pixcel3a API30
BLEモジュール:DSD TECH社 HM-19 (BLE5.0対応)
マイコン:PIC16LF1566
回答1件
あなたの回答
tips
プレビュー