Android BluetoothChat の例を使用して、ELM327 OBDII Bluetooth ドングルと通信しようとしています。問題なくデバイスに接続でき、BluetoothChat から ODBII デバイスへのメッセージはデバイスで正しく送受信されているようです。
ただし、OBDII デバイスからの応答メッセージは、多くの場合、複数のメッセージに分割されたり、スクランブルされたり、文字が欠落したりします。
たとえば、ati
期待される完全な応答を受け取るには、コマンドを
3 回試行する必要があります。
Me: ati
OBDII: a
OBDII: 327
OBDII: 327
OBDII: 327 v1.5 >
Me: ati
OBDII: 1
OBDII: 1
OBDII: 1.5 >v
OBDII: 1.5 >
Me: ati
OBDII: ELM327 v1.5 >
同様に、送信010c
は 3 つの 16 進数ペアを含む 1 行の応答をトリガーする必要があります。代わりに、通常は (常にではありませんが) 次のような結果が得られます。
Me: 010c
OBDII:
OBDII: 4
OBDII: 3C
OBDII: 3
OBDII: 3C C
OBDII: 3C
OBDII:
OBDII:
OBDII: >
いくつかの異なるボー レートと異なる OBDII プロトコルを試しましたが、デフォルト設定からの変更は問題を悪化させるだけのようです。応答メッセージの処理に問題はありますか? 応答メッセージが分割されるのはなぜですか? Bluetooth ドングルは Torque などの利用可能なアプリで正常に動作するため、デバイスの誤動作はないと思います。
私が使用しているコードは、BluetoothChat プロジェクト (ソースはこちら) とほぼ同じです。Bluetooth デバイスの UUID のみを変更し、発信メッセージにキャリッジ リターンを追加しました (この StackOverflow questionに従って)。
変更 1 (BluetoothChatService.java 内):
// Unique UUID for this application
private static final UUID MY_UUID_SECURE =
//UUID.fromString("fa87c0d0-afac-11de-8a39-0800200c9a66");
UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
private static final UUID MY_UUID_INSECURE =
//UUID.fromString("8ce255c0-200a-11e0-ac64-0800200c9a66");
UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
変更 2 (BluetoothChat.java 内):
// The action listener for the EditText widget, to listen for the return key
private TextView.OnEditorActionListener mWriteListener =
new TextView.OnEditorActionListener() {
public boolean onEditorAction(TextView view, int actionId, KeyEvent event) {
// If the action is a key-up event on the return key, send the message
if (actionId == EditorInfo.IME_NULL && event.getAction() == KeyEvent.ACTION_UP) {
String message = view.getText().toString();
//sendMessage(message);
sendMessage(message + "\r");
}
if(D) Log.i(TAG, "END onEditorAction");
return true;
}
};