【发布时间】:2014-07-14 11:59:59
【问题描述】:
我有一个 Arduino,它以 115200 波特率串行发送数据。
有一个应用程序以 9600 波特率从 Arduino 接收数据。代码是
// Arduino USB serial converter setup
// Set control line state
mUsbConnection.controlTransfer(0x21, 0x22, 0, 0, null, 0, 0);
// Set line encoding.
mUsbConnection.controlTransfer(0x21, 0x20, 0, 0, getLineEncoding(9600), 7, 0);
//mUsbConnection.controlTransfer(0x21, 0x20, 0x001A, 0, getLineEncoding(9600), 7, 0);
然后在getLineEncoding()函数中
private byte[] getLineEncoding(int baudRate) {
final byte[] lineEncodingRequest = { (byte) 0x80, 0x25, 0x00, 0x00, 0x00, 0x00, 0x08 };
switch (baudRate) {
case 14400:
lineEncodingRequest[0] = 0x40;
lineEncodingRequest[1] = 0x38;
break;
case 19200:
lineEncodingRequest[0] = 0x00;
lineEncodingRequest[1] = 0x4B;
break;
}
return lineEncodingRequest;
}
有一个开关盒结构可以将波特率设置为 9600、14400 或 19200。但我希望它是 115200 谁能告诉我该怎么做?
【问题讨论】:
-
恢复了原海报的Arduino标签;虽然代码涉及系统的 Android 部分,但目标是与 Arduino 对话,这将有助于其他试图解决该问题的人找到问题。
-
@ChrisStratton,他们正在通过串行线路进行通信,Android 设备并不关心线路另一端的内容。
-
不,它们不是通过串行线路进行通信,而是使用 Arduino 实现的虚拟 COM 端口方案通过 USB 进行通信。碰巧它的一个参数是虚拟波特率,但波特率(和它所控制的“串行线路”链接)实际上只存在于两个芯片之间,这两个芯片都位于 Arduino 板上。但关键是,这是一个在 Arduino 工作人员中经常出现的问题。它不是唯一的,而是它被询问的上下文,并且将来可能会被查看。
-
@ChrisStratton 这是整个事情的基本方面。你介意我问2个问题吗? 1)这是否可以解释为什么我似乎从未在代码中识别出将波特率设置为 Android 设备本身的位置? (相反,我只看到 Android 向 Arduino 发送带有波特率的控制传输。)这是否意味着 Android 端没有任何东西可以设置波特率? 2) Android 的 controlTransfer 调用和 Arduino 代码中的 Serial.init 都针对 Arduino 上的不同 目标,即不将波特率设置为同一芯片,对吧?
-
@ChrisStratton 如果你不介意的话,我将这些问题写成一个独立的 SO 帖子:stackoverflow.com/q/43679630/224239