虚拟 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 调用中的一个变量被硬编码。
中
在方法中
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)
现在两个接口都可以使用了。
我们有一个嵌入式硬件,它有两个通过 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 调用中的一个变量被硬编码。
中在方法中 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)
现在两个接口都可以使用了。