我正在使用GO进行项目,并通过串行端口(TTYUSB(将数据传输到嵌入式设备。在快速和"大"传输期间,我注意到传输数据与我要发送的值不符。
我尝试了各种可用的库,最后它们都使用syscall读写。因此,我已经附上了逻辑分析仪以查看发生了什么。
然后,我注意到输出中的数据不匹配具有清晰的模式:而不是发送我的数据,而是串行端口将我的数据与以下值交织在一起:
0x55, 0x53, 0x42, 0x53, 0x70, 0x02
接着是零(0x00
(。总共22个字节。通过串行线传输的字节的总数确实与我想编写的字节数量匹配>从本质上讲,我的数据被这22个字节块掩盖了。奇怪的是,我可以将这些字节转换为ASCII
0x55, 0x53, 0x42, 0x53, 0x70 = "USBSp"
现在我的问题是:我不能在串行端口上发送任意数据(十六进制值(,或者我应该知道一些控制字符,这会使串行端口发送出去身份信息之类的?
[编辑]:其他信息:
-
主机是运行go v1.10的macOS;使用
go.bug.st/serial.v1
和github.com/tarm/serial
尝试,各种通信设置(比特率等( -
目标是NRF52840预览开发套件,使用Nordic NRF5 SDK v12.3.0_d7731ad(我知道不是最新的,但也不是唯一支持其他板的一个(。使用
app_uart_x
API
您必须配置串行端口。两种设备的baud速率设置,启动/停止位,...必须匹配。然后,go中有图书馆,例如https://github.com/jacobsa/go-serial,可以使用标准的串行端口通信,您也可以使用任何HEX值。
我不能说为什么要发送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/source/usb/core/core/urb.c