ttyusb/uart 在传输过程中发送 'USB'
ttyusb/uart sends 'USB' during transfer
我正在为一个项目使用 Go 并通过串行端口 (ttyusb) 将数据传输到嵌入式设备。在快速和 "large" 传输期间,我注意到传输的数据与我想要发送的值不匹配。
我尝试了各种可用的库,最后它们都使用系统调用进行读写。所以我连接了一个逻辑分析仪来查看发生了什么。
然后我注意到输出中的数据不匹配有一个明显的模式:串行端口不会发送我的数据,而是将我的数据与以下值交错:
0x55, 0x53, 0x42, 0x53, 0x70, 0x02
后跟零 (0x00
)。总共 22 字节。通过串行线传输的总字节数确实与我想要写入的字节数相匹配 > 所以基本上我的数据被这 22 个字节块屏蔽了。奇怪的是我可以将这些字节转换为 ASCII
0x55, 0x53, 0x42, 0x53, 0x70 = "USBSp"
现在我的问题是:我不能通过串行端口发送任意数据(十六进制值),或者是否有一些我应该注意的控制字符会使串口发出身份信息之类的?
[编辑]:附加信息:
主机是 MacOS 运行 Go v1.10;尝试使用 go.bug.st/serial.v1
和 github.com/tarm/serial
,各种通信设置(比特率等)
目标是 nRF52840 preview development kit,使用 Nordic nRF5 SDK v12.3。0_d7731ad(不是最新的,我知道,但也是唯一支持其他板的)。使用 app_uart_x
API
您必须配置串口。两个设备的波特率设置,start/stop 位,...必须匹配。然后有像 https://github.com/jacobsa/go-serial 这样的库可以启用标准串行端口通信,您也可以使用任何十六进制值。
我不能说为什么要发送 USBSp
,因为你没有 post 任何代码,也没有提供你使用的库的信息。这很可能不是由内核模块生成的,而是由更高层软件生成的,因为使用的内核模块是 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
我正在为一个项目使用 Go 并通过串行端口 (ttyusb) 将数据传输到嵌入式设备。在快速和 "large" 传输期间,我注意到传输的数据与我想要发送的值不匹配。
我尝试了各种可用的库,最后它们都使用系统调用进行读写。所以我连接了一个逻辑分析仪来查看发生了什么。
然后我注意到输出中的数据不匹配有一个明显的模式:串行端口不会发送我的数据,而是将我的数据与以下值交错:
0x55, 0x53, 0x42, 0x53, 0x70, 0x02
后跟零 (0x00
)。总共 22 字节。通过串行线传输的总字节数确实与我想要写入的字节数相匹配 > 所以基本上我的数据被这 22 个字节块屏蔽了。奇怪的是我可以将这些字节转换为 ASCII
0x55, 0x53, 0x42, 0x53, 0x70 = "USBSp"
现在我的问题是:我不能通过串行端口发送任意数据(十六进制值),或者是否有一些我应该注意的控制字符会使串口发出身份信息之类的?
[编辑]:附加信息:
主机是 MacOS 运行 Go v1.10;尝试使用
go.bug.st/serial.v1
和github.com/tarm/serial
,各种通信设置(比特率等)目标是 nRF52840 preview development kit,使用 Nordic nRF5 SDK v12.3。0_d7731ad(不是最新的,我知道,但也是唯一支持其他板的)。使用
app_uart_x
API
您必须配置串口。两个设备的波特率设置,start/stop 位,...必须匹配。然后有像 https://github.com/jacobsa/go-serial 这样的库可以启用标准串行端口通信,您也可以使用任何十六进制值。
我不能说为什么要发送 USBSp
,因为你没有 post 任何代码,也没有提供你使用的库的信息。这很可能不是由内核模块生成的,而是由更高层软件生成的,因为使用的内核模块是 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