虚拟 COM 端口无法在 Android 上工作

virtual com port not working on Android

我们有一个嵌入式硬件,它有两个通过 USB 实现的虚拟 COM 端口。在 Windows OS 上,我们能够正确检测并 read/write 这些虚拟 COM 端口。我们使用超级终端对其进行了测试。 但是当我们使用 Android 时,它可以打开两个端口,但 read/write 只在一个 COM 端口上工作。它在第二个虚拟 COM 端口上不工作。

我正在使用 https://github.com/felHR85/UsbSerial 此代码来探测虚拟 COM 端口。 它是一个 CDC 串行设备。 我可以在调试时看到检测到两个接口,并且两个接口都成功声明了 IN 和 OUT 端点。但是只在第一个接口上写入成功,在第二个接口上失败。 对于第二个接口,我发现 connection.bulkTransfer (UsbDeviceConnection.bulkTransfer) 失败,它 returns -1 并且无法找出为什么相同的 code/configuration 正在为第一个虚拟 COM 端口工作但不是第二次

[下面的界面正在运行] UsbInterface[mId=1,mClass=10,mSubclass=0,mProtocol=0,mEndpoints=[Landroid.os.Parcelable;@41a7b9e0] [这个正在工作] UsbEndpoint[mAddress=129,mAttributes=2,mMaxPacketSize=64,mInterval=0] UsbEndpoint[mAddress=2,mAttributes=2,mMaxPacketSize=64,mInterval=0]

[下面的界面不工作] UsbInterface[mId=3,mClass=10,mSubclass=0,mProtocol=0,mEndpoints=[Landroid.os.Parcelable;@41a7bd10]
UsbEndpoint[mAddress=132,mAttributes=2,mMaxPacketSize=64,mInterval=0] UsbEndpoint[mAddress=5,mAttributes=2,mMaxPacketSize=64,mInterval=0]

VID=1003 (0x3EB) PID=9253 (0x2425)

有没有人试过在 Android 上使用多个虚拟 COM 端口?任何调试提示都会有很大帮助。

我们发现了这个问题,一位同事帮助调试了这个问题。 UsbDeviceConnection.controltransfer 调用中的一个变量被硬编码。

发布地点: 在文件 https://github.com/felHR85/UsbSerial/blob/master/usbserial/src/main/java/com/felhr/usbserial/CDCSerialDevice.java

在方法中 setControlCommand 和 getLineCoding,对 connection.controlTransfer 的调用将第 4 个变量(整数索引)硬编码为 0,应根据为数据传输选择的接口进行更改

int response = connection.controlTransfer(CDC_REQTYPE_HOST2DEVICE, request, value,0, data, dataLength, USB_TIMEOUT);

int controlTransfer (int requestType, 内部请求, 整数值, 整数索引, 字节[]缓冲区, 整数长度, 整数超时)

接口ID 1的数据传输变量索引应为0,接口ID 3的数据传输应为2

接口 0 = 批量接口 1 的 CDC 关联接口

接口 1 = CDC 实际批量接口(PC 上的 COM PORT 1)

批量接口 3 的接口 2 CDC 关联接口

接口 3 = CDC 实际批量接口(PC 上的 COM PORT 2)

现在两个接口都可以使用了。