在Android上将USB波特率从9600更改为115200
我有一个Arduino,它以115200波特率串行发送数据 有一个应用程序以9600波特率从Arduino接收数据。代码是在Android上将USB波特率从9600更改为115200,android,arduino,baud-rate,Android,Arduino,Baud Rate,我有一个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.contr
// 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有人能告诉我怎么做吗?这里有一个修改过的函数,它将您的函数推广到上面的其他波特率:
private byte[] getLineEncoding(int baudRate) {
final byte[] lineEncodingRequest = { (byte) 0x80, 0x25, 0x00, 0x00, 0x00, 0x00, 0x08 };
//Get the least significant byte of baudRate,
//and put it in first byte of the array being sent
lineEncodingRequest[0] = (byte)(baudRate & 0xFF);
//Get the 2nd byte of baudRate,
//and put it in second byte of the array being sent
lineEncodingRequest[1] = (byte)((baudRate >> 8) & 0xFF);
//ibid, for 3rd byte (my guess, because you need at least 3 bytes
//to encode your 115200+ settings)
lineEncodingRequest[2] = (byte)((baudRate >> 16) & 0xFF);
return lineEncodingRequest;
}
你也可以试试这些。这些是从这里找到的 波特率:
* 0x2710 ----------------- 300
* 0x1388 ----------------- 600
* 0x09C4 ----------------- 1200
* 0x04E2 ----------------- 2400
* 0x0271 ----------------- 4800
* 0x4138 ----------------- 9600
* 0x809C ----------------- 19200
* 0xC04E ----------------- 38400
* 0x0034 ----------------- 57600
* 0x001A ----------------- 115200
* 0x000D ----------------- 230400
* 0x4006 ----------------- 460800
* 0x8003 ----------------- 921600
您可以在这里找到有关如何使用
controlTransfer()
和FTDI芯片的详细概述
这是我的荣幸。很高兴我能帮上忙。哦,我忘了:如果你接受这个答案,你可以把它标记为已接受,从而结束你的问题。虽然激进的代码编辑通常不被接受,但我认为@epichorns不介意OP对代码做一点修改,以便它对他有用。不,他一点也不介意:-)我对OP使用的编译器有点好奇,因为并不是每个编译器都抱怨,甚至阻止编译,因为缺少像这样的显式类型转换…@epichorns,在Java中向下转换整数类型不是违法的吗,所以它独立于使用的编译器?例如,我用一个普通Java编译器(Java-1.8.0-openjdk-devel-1.8.0.5-3.b13.fc20.x86_64)得到了“错误:不兼容类型:从int到byte的可能有损转换”;虽然代码涉及到系统的安卓部分,但目标是与Arduino对话,这将有助于其他试图解决该问题的人找到问题。@ChrisStratton,他们是通过串行线进行通信的,安卓设备不关心线路另一端的内容。不,他们不是通过串行线进行通信,他们使用Arduino实现的虚拟com端口方案通过USB进行通信。碰巧它的一个参数是虚拟波特率,但波特率(以及它所控制的“串行线”链路)实际上只存在于Arduino板上的两个芯片之间。但关键是,这是一个在Arduino工作的人经常会遇到的问题;这并不是唯一的问题,但它是被问到的背景,并且很可能在将来被看到。@ChrisStratton这是整个事情的基本方面。你介意我问两个问题吗?1) 这是否可以解释为什么我似乎从来没有在代码中确定将波特率设置为Android设备本身的位置?(相反,我只看到Android将波特率控制传输发送到Arduino。)这是否意味着Android端没有设置波特率的功能?2) Android发出的controlTransfer调用和Arduino代码发出的Serial.init都是针对Arduino上的不同目标的,也就是说,没有将波特率设置为同一个芯片,对吗?@ChrisStratton,如果你不介意的话,我将这些问题写进一篇独立的SO帖子:
* 0x2710 ----------------- 300
* 0x1388 ----------------- 600
* 0x09C4 ----------------- 1200
* 0x04E2 ----------------- 2400
* 0x0271 ----------------- 4800
* 0x4138 ----------------- 9600
* 0x809C ----------------- 19200
* 0xC04E ----------------- 38400
* 0x0034 ----------------- 57600
* 0x001A ----------------- 115200
* 0x000D ----------------- 230400
* 0x4006 ----------------- 460800
* 0x8003 ----------------- 921600
typedef enum {
ftdi_8U232AM_48MHz_b300 = 0x2710,
ftdi_8U232AM_48MHz_b600 = 0x1388,
ftdi_8U232AM_48MHz_b1200 = 0x09c4,
ftdi_8U232AM_48MHz_b2400 = 0x04e2,
ftdi_8U232AM_48MHz_b4800 = 0x0271,
ftdi_8U232AM_48MHz_b9600 = 0x4138,
ftdi_8U232AM_48MHz_b19200 = 0x809c,
ftdi_8U232AM_48MHz_b38400 = 0xc04e,
ftdi_8U232AM_48MHz_b57600 = 0x0034,
ftdi_8U232AM_48MHz_b115200 = 0x001a,
ftdi_8U232AM_48MHz_b230400 = 0x000d,
ftdi_8U232AM_48MHz_b460800 = 0x4006,
ftdi_8U232AM_48MHz_b921600 = 0x8003,
} FTDI_8U232AM_48MHz_baudrate_t;