我正在使用Go进行项目,并通过串口(ttyusb)将数据传输到嵌入式设备。在快速和"大"转移我发现传输的数据与我想要发送的值不符。
我尝试了各种可用的库,最后他们都使用系统调用进行读写。所以我附上了一个逻辑分析仪,看看是怎么回事。
然后我注意到输出中的数据不匹配有一个明确的模式:串口不是发送我的数据,而是将我的数据与以下值交错:
0x55, 0x53, 0x42, 0x53, 0x70, 0x02
后跟零(0x00
)。总共22个字节。通过串行线传输的总字节数确实与我想写的字节数相匹配>基本上我的数据被这22个字节块掩盖了。奇怪的是我可以将这些字节转换为ASCII
0x55, 0x53, 0x42, 0x53, 0x70 = "USBSp"
现在我的问题是:我不能通过串口发送任意数据(HEX值),或者是否有一些我应该知道的控制字符会使串口成为可能发出身份信息等?
[编辑]:其他信息:
主机是运行Go v1.10的MacOS;尝试使用go.bug.st/serial.v1
和github.com/tarm/serial
,各种通讯设置(比特率等)
目标是nRF52840 preview development kit,使用Nordic nRF5 SDK v12.3.0_d7731ad(不是最新的,我知道,但也是唯一支持其他主板的人)。使用app_uart_x
API
答案 0 :(得分:0)
您必须配置串口。两个设备的波特率,开始/停止位,......的设置必须匹配。那么像https://github.com/jacobsa/go-serial这样的库可以启用标准串口通信,你也可以使用任何十六进制值。
我不能说为什么发送USBSp
是因为您没有发布任何代码并且没有提供您使用的库的信息。很可能这不是由内核模块生成的,而是由更高层软件生成的,因为使用的内核模块是usb-serial
而USBSp
没有出现在源代码中:
https://elixir.bootlin.com/linux/v4.0/source/drivers/usb/serial/usb-serial.c
也不在内核模块ftdi-sio
中(如果你使用ftdi芯片)
https://elixir.bootlin.com/linux/v4.0/source/drivers/usb/serial/ftdi_sio.c
也不在https://elixir.bootlin.com/linux/v3.3/source/drivers/usb/core/urb.c