通过USB OTG从设备同步写入然后读取数据

问题描述

我正在使用 ESP32(CP2102 USB 到 UART 桥接控制器)。我需要向该设备发送文本命令,然后立即读取响应同步在同一函数中返回数据。我尝试了两个库:usb-serial-for-androidUsbSerial 但没有成功。 我还检查了 Arduino Uno Rev 3 和同样的问题。

我的来自 usb-serial-for-android 的示例

//....
usbSerialPort.open(usbConnection)
usbSerialPort.setParameters(
SERIAL_BAUD_RATE,UsbSerialPort.DATABITS_8,UsbSerialPort.STOPBITS_1,UsbSerialPort.PARITY_NONE
)
//.....

private fun requestData(textMessage: String): String {
    send(textMessage)
    return read()
}

private fun send(textMessage: String) {
    val messageByteArray = "$textMessage$NEW_LINE".toByteArray()
    val writeResult = usbSerialPort.write(messageByteArray,USB_WRITE_TIMEOUT)
}
fun read(): String {
    val messageByteArray = ByteArray(1024)  //16384   multiply of 64
    val readDataLength = usbSerialPort.read(messageByteArray,USB_READ_TIMEOUT)
    return messageByteArray.decodetoString()
}

const val SERIAL_BAUD_RATE = 115200 //57600 //115200
const val vendOR_ID = 4292 // ESP32 4292   //arduino 9025
const val PRODUCT_ID = 60000 // ESP32 60000  //arduino 67
const val USB_READ_TIMEOUT = 3000
const val USB_WRITE_TIMEOUT = 1000
const val NEW_LINE = "\n"

来自 UsbSerial

//....
if (serialPort.syncopen()) {
  Log.d(TAG,"port opened successfully!")
  serialPort.setBaudrate(SERIAL_BAUD_RATE)
  serialPort.setDataBits(UsbSerialInterface.DATA_BITS_8)
  serialPort.setStopBits(UsbSerialInterface.STOP_BITS_1)
  serialPort.setParity(UsbSerialInterface.PARITY_NONE)
  /**
   * Current flow control Options:
   * UsbSerialInterface.FLOW_CONTROL_OFF
   * UsbSerialInterface.FLOW_CONTROL_RTS_CTS only for CP2102 and FT232
   * UsbSerialInterface.FLOW_CONTROL_DSR_DTR only for CP2102 and FT232
   */
  serialPort.setFlowControl(UsbSerialInterface.FLOW_CONTROL_OFF)
}
//.....


private fun requestData(textMessage: String): String {
    send(textMessage)
    return read()
}

private fun send(textMessage: String) {
    val messageByteArray = "$textMessage$NEW_LINE".toByteArray()
    val writeResult = serialPort.syncWrite(messageByteArray,USB_WRITE_TIMEOUT)
}
fun read(): String {
    val messageByteArray = ByteArray(1024)  //16384   multiply of 64
    val readDataLength = serialPort.syncRead(messageByteArray,USB_READ_TIMEOUT)
    return messageByteArray.decodetoString()
}

const val SERIAL_BAUD_RATE = 115200 //57600 //115200
const val vendOR_ID = 4292 // ESP32 4292   //arduino 9025
const val PRODUCT_ID = 60000 // ESP32 60000  //arduino 67
const val USB_READ_TIMEOUT = 3000
const val USB_WRITE_TIMEOUT = 1000
const val NEW_LINE = "\n"

在这两个示例中,syncWrite/write 返回的结果 > 0 但来自 syncRead/read 的 messageByteArray 为空或有时包含未剪切和凌乱的数据。

我来自 ESP32 / Arduino 的示例代码

#include <Wire.h>

void setup() {
  Serial.begin(115200);
  while (!Serial) {
    delay (100);
  }
}

void loop() {
  String serialANDROID = "";
  if (Serial.available()) {
     serialANDROID = Serial.readStringUntil('\n');
  if (serialANDROID == "command1") {
     Serial.println ("someData = [123456789123456]/nEND/n/n");
  }
  else if (serialANDROID == "command2"){
    Serial.println("OK/nEND/n/n"); 
  }
  else if (serialANDROID == "command3"){
    Serial.println("test=true/nEND/n/n");
  }
  else if (serialANDROID == "command4") {
    Serial.println ("someExTradata = [1234567891234568685645334354]/nEND/n/n");
  }
  else {
    Serial.println("error"); 
  }
 }
}

是安卓操作系统的限制吗?有人试过这个吗? 提前致谢

解决方法

首先,您的 ESP 代码中的换行符是向后的,/n 而不是 \n。解决这些问题。

其次,我建议在没有 Android 版本的情况下尝试您的 ESP 代码,以验证它的行为是否正确。将 ESP 连接到计算机,打开串行终端,输入命令并检查响应是否按预期到达。