微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Jetson Nano UART 将损坏的字符 CH340G UART 传输到串口

如何解决Jetson Nano UART 将损坏的字符 CH340G UART 传输到串口

作为机器人项目的一部分,我必须在 Nvidia Jetson Nano 2Gb 和运行 Micropython 的 ESP8266 设备之间进行通信,用作电机控制器,使用它们的 UART 接口。允许我将命令字符串从 Jetson 发送到 ESP。

出于测试目的,我使用了 CH340G UART 到串行转换器,以允许我也从笔记本电脑发送/接收。我将 Jetson 上的 UART1 RX 和 TX 引脚(引脚 8 和 10)用于 3.3V TTL,串行转换器 UART 侧的接地连接到 Jetson 上的接地。

我能够在 Jetson 上成功接收来自 ESP 或我的笔记本电脑的消息,几乎没有损坏的字符,但是当我尝试从 Jetson 传输“Hello World”并在我的笔记本电脑上接收它时,所有字符都已损坏.

两个程序都使用 Pyserial,Jetson 在引脚 8 和 10 上使用 /dev/ttyTHS1。

在我的笔记本电脑 (Windows) 上接收:

import serial
import time

baud = 4800
port = "COM8"

# Defaults as serial.EIGHTBITS,serial.PARITY_NONE,parity.STOPBITS_ONE
ser = serial.Serial(port,baud)

try:
    while True:
        #ser.write(b'hello world\n\r')
        time.sleep(0.5)

        line = ser.read_all()
        print(line.decode('utf-8'))
        

except KeyboardInterrupt:
    ser.close()

b'\xeb\x8b\xab\xc1\xff\xcd\xdb\x1e_\xf9'
b'\xad_\xb1\xbd$\xf7\x8b;\xeb\xfe'
b'lm\xb6\x7f\xbc\xfd\xb9\xab\xcd\xf9\xa5}'
b'}\x7f\xf2o\xfa\xbe\xf2\x98\x8dS}\xf6\x0b\xd7O'
b'\xb6dp\xb5I\xfb\xfb\xbd(\xdf\xef\xae\xd1\xd8\xcd'
b'Z\xf1[<\xbd\xf3\xbe\x96\xfe\xfe'
b'\xd9\xb3\xf6\x83\x7f{\xf7\xd9\x9a\xfc'
b'r\xd7m\xe1]\xbd\xb9\xb7y\x96\xfe'
b'\x7f\xbf\xfc\x85}\xfdr\x7f_\xa5\xfe'
b'}\xb6\xfb\x0b_o\x17\xcb\xe0['
b'\xfc\xf1\xbf\x98\xf7\xf9\xf6\x8fR'
b'\xae\x7f\xb7\x8b}\xbf\xaf_%'

这些字符不会被解码,因为它们不匹配 utf-8

Traceback (most recent call last):
  File "C:\Users\Jackr\Desktop\test-serial.py",line 16,in <module>
    print(line.decode('utf-8'))
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb1 in position 1: invalid start byte

只需在 Putty 中打开一个串行终端,它通常可以让我查看通过的字符串,从而显示损坏的字符

enter image description here

在 Jetson(Linux 4 Tegra,基于 Ubuntu 18.04)上传输:

import serial
from time import sleep

baud = 4800
ser = serial.Serial('/dev/ttyTHS1',baud)

print(ser)

try:

    While True:
        ser.write('Hello World \n'.encode('utf-8')
        sleep(0.5)

except KeyboardInterrupt:
    print("closing...")

我试过了:

  • Nvgetty 在 ttyTHS1 上被禁用

  • 使用 UTF-8 在每一侧对消息进行编码和解码,以确保编码相同。

  • 使用较低的波特率 (4800) 确实可以防止在 Jetson 接收时出现损坏的字符,但在 Jetson 传输时没有效果

更新

当我测试将 TX 从 Jetson 环回到它的 RX 时,根本没有损坏。使用以下代码

import serial

ser = serial.Serial('/dev/ttyTHS1',9600)
ser.write(b'Hello World)
ser.flush()

print(ser.read_all())

我现在还设置了 RaspBerry Pi W Zero,并测试了该设备和 Jetson 的 UART 接口之间直接发送和接收 UART。两个方向的交通都没有受到破坏。

我还使用 Pi 插入串行适配器从笔记本电脑上的 pi 读取数据,这也很好用,这表明 Jetson 和串行适配器之间可能存在问题

解决方法

不幸的是,此问题是由 Jetson Nano 载板上 40 针接头的 UART TX 针脚不可靠引起的。这会导致向各种设备的传输不可靠,我个人在 CH340G USB-tty、ESP8266 和 RP2040 芯片上发现了这一点。虽然它与 Raspberry Pi Zero W 兼容。

没有详细记录的解决方案(我可以找到),但常见的解决方法似乎是使用 FTDI usb 到串行转换器将 Jetson 的 USB 端口之一转换为串行接头。 (尽管我的 jetson 的 USB 端口已经在使用中,我将通过 I2C 将我的微控制器切换为专用的 PWM 控制器,以逃避 uart 噩梦)

向任何后来发现类似问题的人道歉,我知道只找到解决方法的挫败感。如需了解更多信息,以下内容似乎是官方 Nvidia 开发者论坛上一些关于此问题的主帖;

https://forums.developer.nvidia.com/t/unreliable-serial-communcation-via-the-uart-tx-rx-gpio-pins/158249/30

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。