【问题标题】:Changing USB Baud Rate from 9600 to 115200 on Android在 Android 上将 USB 波特率从 9600 更改为 115200
【发布时间】: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

标签: android arduino baud-rate


【解决方案1】:

这是一个修改后的函数,它可以将上述函数推广到其他波特率:

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;

}

【讨论】:

  • 快乐是我的全部。很高兴我能帮上忙。
  • 哦,我忘了:如果您接受这个答案,您可以将其标记为已接受,因此结束您的问题。
  • @TylerH,虽然激进的代码编辑通常不被接受,但我认为@epichorns 并不介意 OP 稍微更改代码以使其对他有用。
  • 不,他一点也不介意 :-) 我对 OP 使用的编译器有点好奇,因为不是每个编译器都会抱怨,甚至会阻止编译,因为缺少像这样的显式类型转换...
  • @epichorns,在 Java 中整数类型的向下转换不是非法的,所以它独立于使用的编译器吗?例如,我使用普通的 Java 编译器(java-1.8.0-openjdk-devel-1.8.0.5-3.b13.fc20.x86_64)得到“错误:不兼容的类型:从 int 到字节的可能有损转换”。跨度>
【解决方案2】:

你也可以试试这些。这些都是从link找到的

conn.controlTransfer(0x40, 0, 0, 0, null, 0, 0);// reset
                    conn.controlTransfer(0x40, 0, 1, 0, null, 0, 0);// clear Rx
                    conn.controlTransfer(0x40, 0, 2, 0, null, 0, 0);// clear Tx
                    conn.controlTransfer(0x40, 0x03, 0x001A, 0, null, 0, 0);//Baud rate 115200

波特率:

* 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

【讨论】:

    【解决方案3】:

    您可以在这里找到controlTransfer() 和 FTDI-Chips 的功能概览ftdi_sio.h

    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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-31
      • 1970-01-01
      • 2019-12-08
      • 1970-01-01
      相关资源
      最近更新 更多