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

2024-09-30 08:34:57 发布

您现在位置:Python中文网/ 问答频道 /正文

作为机器人项目的一部分,我必须在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和串行适配器之间可能存在问题


Tags: importlineserial字符serutf笔记本电脑jetson
1条回答
网友
1楼 · 发布于 2024-09-30 08:34:57

不幸的是,这个问题是由Jetson Nano的载波板上40针头的UART TX针不可靠引起的。这会导致到各种设备的传输不可靠,我个人在CH340G USB tty、ESP8266和RP2040芯片中发现了这一点。虽然它与覆盆子皮零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

相关问题 更多 >

    热门问题