Android USB串行-发送负字节(带符号字节)时设备停止响应

问题描述 投票:0回答:1

[我们正在尝试从连接到USB CP2102 USB至UART桥的外部传感器读取值。

我们使用this library进行串行通信,我们可以发送诸如0x69 0x14 0x00..和任何其他种类的正字节(0到127)为了打开传感器,我们需要发送传感器的编号,在本例中为0x82(相当于无符号字节中的130和带符号2中的-126)

在Kotlin中,我们无法将0x82分配给字节变量,因此我们必须使用其十进制形式-126,但是发送该字节会导致设备停止发送或接收数据。

我们尝试使用所有正字节,没有问题导致此问题,只有负字节会导致问题。

从我的角度来看,设备使用无符号字节来接收和发送数据,发送有符号字节在某种程度上超出了它的范围

[实验性Kotlin中有无符号字节,以UBytes为单位,但不幸的是Android USB Host Api和串行通信library都使用传统的ByteArray作为缓冲区。

无论如何,我们可以向设备发送0x82而不会导致它停止工作吗?

使用此Serial Terminal App,我们通常可以发送十六进制的82。来自传感器的数据已成功返回,并且符合设备文档中的预期。

怎么可能?

注意:我们还尝试了一些将hexStringToBytes转换的实用程序,例如69到105,但是结果仍然与将0x82字节直接分配给-126相同。

编辑:

该库具有writeAsync方法,该方法接受ByteArray作为参数。在我们看来,我们有一个编辑文本,要求用户编写Bytes,例如105、20 ...,因此我们传递的是byteArrayOf(editText.text.toString.ToByte()),如果值超过127,则会抛出该错误。

用户必须输入-128到127之间的一个字节。

为了从传感器接收配置文件,用户必须发送

0x69-105字节然后是0x82,即以Ubytes为单位130或以-126为单位0x00-为0最后是CRC(除以256的余数的一个字节),此处为0x14。等于20。

此后,用户应接收以下数据(看起来像十六进制):

96 82 00 3C 54 79 70 65 3D 70 48 20 EC E5 F2 F0 0A 50 61 72
61 6D 3D 70 48 0A 55 6E 69 74 3D 0A 6B 3D 3D 5B 8B AC 0A 62 3D 3E
C1 FF 2E 0A 6D 69 6E 00 3D 00 00 00 0A 6D 61 78 3D 41 60 00 0A 00 51

用户写105,发送,成功发送,然后-127,发送,失败,设备停止响应。

我们无法接收该数据,因为需要0x82。

先发送105,然后是0,然后是21,或者其他任何正字节不会返回任何错误。发送任何负字节将阻止设备读取/写入

在应用程序日志中,我们将ByteArray转换为十六进制字符串以便于阅读。

发送105在日志目录中写入request: byte= 105 hex= 69,设备接收回该数据并写入answer: byte= 105 hex= 69

写入130(用于0x82)会引发强制转换异常,该异常会强制您使用另一个值为-126的值,该值将立即使设备停止读取或发送数据,日志仅显示request: byte= -126 hex= 82,没有答案,并且接受之后没有任何请求。

硬编码值也做同样的事情。

java android kotlin byte usbserial
1个回答
0
投票

在此test program中,我构造了各种字节数组,并将它们毫无问题地发送到USB设备。应该在Kotlin中工作类似。

[Serial Terminal App默认情况下会添加换行符。您的代码中可能缺少此代码吗?

© www.soinside.com 2019 - 2024. All rights reserved.