USB串口数据发送乱码

Posted

技术标签:

【中文标题】USB串口数据发送乱码【英文标题】:USB Serial data sending gibberish 【发布时间】:2017-01-10 03:48:47 【问题描述】:

我遇到了一个我似乎无法解决的问题。我在树莓派上使用 python 从 pi 上的 USB 连接读取数据(正在从串行转换)。

我可以连接到 USB 端口并开始使用代码接收数据

ser = serial.Serial("myUsbPortID", 9600)
bytes = ser.inWaiting()
print ser.read(bytes)

我知道波特率是 9600(硬件制造商文档),但是由于某种原因,当我尝试读取数据流时,我得到了很多不同语言和字符形式的乱码。在我杀死程序后,我的屏幕仍然会在我输入时用乱码数据替换我的字符。

我确定这不是硬件发送的数据流。某处的东西正在转换东西,但我不知道它可能是什么。

当我启动设备并初始化时,我会得到可读信息。但是当设备开始运行时,我只会得到这个奇怪的字符

有没有办法将这些字符转换为实际输入的数据?

示例图片: output screen

【问题讨论】:

你发送字节还是文本?如果是字节,那么只需以十六进制打印它,你就会看到你想要的。 它在 minicom/hyperterm 中有效吗?字节大小/停止位配置正确吗?你能转储十六进制吗?您期望什么样的数据(以及您的设备是什么)? 这看起来像是配置错误(波特率、开始/停止位、流量控制...)。使用终端程序并测试可能的配置。另一个非常少见的错误是位排序错误(如果设备先发送 LSB 而主机希望先发送 MSB)但是这确实不常见 你记得要在两个设备之间连接地吗?当您忘记它时,通常会发生这种情况。当什么都没有传输时,计算机只会接收到由于缺少接地而产生的噪音,并写出乱码。 感谢所有 cmets。我不认为这是文本。文档说它们是数据帧,格式为非唯一的帧开始字符,后跟两个 16 位数字。我尝试通过执行“十六进制(结果)”转换为十六进制,但我收到一个错误,说它无法转换。我怎么知道它是否在两个设备之间接地?我所做的只是将串口连接到串口。 【参考方案1】:

所以我能够使用 python 代码上的这一行来解决乱码问题(对于遇到此问题的其他人)。

data = ":".join(":02x".format(ord(c)) for c in bytes)

其中字节是原始数据,我将其设为“:”分隔。 似乎连接和波特率没问题。幸运的是,数据能够转换为十六进制。

【讨论】:

以上是关于USB串口数据发送乱码的主要内容,如果未能解决你的问题,请参考以下文章

串口通信接收区出现多余的乱码怎么解决

USB 虚拟串口简介

虚拟机linux下用usb 转串口线,minicom连接SBC2410板,能接收数据,但是不能发送数据?

STM32串口打印乱码

52单片机通过usb 串口发送数据给linux,minicom来接收

63 USB复合设备多设备数据乱码问题及ENDP0_RXADDR起始地址计算方式