gpt4 book ai didi

android - BluetoothChat-to-ELM327 拆分响应消息

转载 作者:行者123 更新时间:2023-11-29 17:47:37 25 4
gpt4 key购买 nike

我正在尝试使用 Android BluetoothChat 示例与 ELM327 OBDII 蓝牙加密狗进行通信。我可以毫无问题地连接到设备,从 BluetoothChat 到 ODBII 设备的消息似乎可以正确地传输和接收。

然而,来自 OBDII 设备的响应消息通常被分成几条消息、乱码或缺失字符。

例如,需要尝试 3 次 ati 命令才能收到完整的预期响应:
我:阿提
OBDII:一个
诊断二:327
诊断二:327
OBDII:327 v1.5 >
我:阿提
诊断二:1
诊断二:1
OBDII:1.5 >v
OBDII: 1.5 >
我:阿提
OBDII: ELM327 v1.5 >

类似地,发送 010c 应该触发包含三个十六进制对的单行响应。相反,我通常(但不总是)得到如下结果:
我:010c
诊断二:
诊断二:4
诊断二:3C
诊断二:3
OBDII:3C C
诊断二:3C
诊断二:
诊断二:
OBDII: >

我尝试了几种不同的波特率和不同的 OBDII 协议(protocol),但默认设置的更改似乎只会让事情变得更糟。 我的响应消息处理有问题吗?为什么响应消息会拆分?蓝牙加密狗可以与可用的应用程序(例如 Torque)一起正常工作,所以我认为设备没有出现故障。

我使用的代码与 BluetoothChat 项目(来源 here)几乎相同。我只修改了我的蓝牙设备的 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;
}
};

ELM327 manual for reference

最佳答案

我在 this BluetoothSPP project by user akexorcist on Github 中找到了消息拆分问题的解决方案. ConnectedThread 类的相关函数如下所示:

     public void run() {
byte[] buffer;
ArrayList<Integer> arr_byte = new ArrayList<Integer>();

// Keep listening to the InputStream while connected
while (true) {
try {
int data = mmInStream.read();
if(data == 0x0A) {
} else if(data == 0x0D) {
buffer = new byte[arr_byte.size()];
for(int i = 0 ; i < arr_byte.size() ; i++) {
buffer[i] = arr_byte.get(i).byteValue();
}
// Send the obtained bytes to the UI Activity
mHandler.obtainMessage(BluetoothState.MESSAGE_READ
, buffer.length, -1, buffer).sendToTarget();
arr_byte = new ArrayList<Integer>();
} else {
arr_byte.add(data);
}
} catch (IOException e) {
connectionLost();
// Start the service over to restart listening mode
BluetoothService.this.start(BluetoothService.this.isAndroid);
break;
}
}
}

显然,尽管如果我错了请纠正我,.read() 无法在没有一些帮助的情况下获取和维护流中出现的任何字节的格式。

关于android - BluetoothChat-to-ELM327 拆分响应消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25374953/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com