Jetson nano pyserial 向 arduino 写入消息得到错误的字符

Jetson nano pyserial write message to arduino get wrong chars

我使用 pyserial 编写了一个 python 脚本,通过使用 Jetson nano J41 引脚和 Arduino Uno 上的软件序列与 Arduino Uno 进行串行通信来连接 NVIDIA Jetson Nano,但我对收到的消息有疑问arduino uno,有时我会在消息中看到坏字符。例如我用 pyserial "hello world" 发送,当我检查 arduino serial 时,我得到了 "he⸮lo"worlf*"

此外,当 arduino 收到一条消息时,它会用 MESSAGE_OK 回答,而 jetson nano 总是正确无误,没有奇怪的字符。从 jetson 到 uno 收到坏字符,但从 nano 到 jetson 没问题。我正在使用逻辑电平转换器将 arduino 软件串行引脚连接到 jetson nano uart 引脚。

我一直在试图弄清楚是怎么回事,但没有成功,如果有人能帮助我提出建议,或者给出答案那就太好了。

我正在尝试最简单的示例,这是我的 arduino 和 jetson nano 代码:

Arduino:

#include <SoftwareSerial.h>

String a;
// Arduino uno Ext Serial pins
int ext_rx_pin = 9;
int ext_tx_pin = 8;
SoftwareSerial ext(ext_rx_pin, ext_tx_pin); //RX, TX 

void setup() {
  // opens serial port
  Serial.begin(38400); 
  // Setup external serial connection to jetson
  ext.begin(38400);
}

void loop() {
  while (ext.available() > 0) {
    a = ext.readStringUntil('\n'); // read the incoming data as string
    // Print message on ide console
    Serial.println(a);
    // Answer to jetson
    ext.print("MESSAGE_OK");
    ext.print("\n");
  }
}

杰森纳米:

#!/usr/bin/python3
import time
import serial

serial_port = serial.Serial(
    port="/dev/ttyTHS1",
    baudrate=38400,
    timeout=0.5
)

# Wait a second to let the port initialize
time.sleep(1)

arduino_message = ""
wait = True

try:
    while True:
        text = input("Input message: ")
        print("Sending:", text)
        text = text + "\n"
        print(text.encode())
        for i in text:
            serial_port.write(i.encode('utf-8'))
            time.sleep(0.1)
        wait = True
        while wait:
            if serial_port.inWaiting() > 0:
                data = serial_port.read()
                arduino_message = arduino_message + data.decode('utf-8')
                if data == "\n".encode():
                    wait = False
                    print(arduino_message)
                    arduino_message = ""

except KeyboardInterrupt:
    print("Exiting Program")

except Exception as exception_error:
    print("Error occurred. Exiting Program")
    print("Error: " + str(exception_error))

finally:
    serial_port.close()
    pass

此外,如果我尝试回显从 jetson 发送到 uno,然后从 uno 发送到 jetson 的内容,我会收到此消息,因为错误字符:错误:'utf-8' 编解码器无法解码位置 0 中的字节 0xec : 数据意外结束

预期字符和接收字符中存在多个单比特和双比特错误。这可能是电气 and/or 时序问题。

例如

space (0010 0000) => " (0010 0010)

d (0010 0010) => f (0110 0110)

\n (0000 1011 and 0000 1010) => * (one of which ends up being 0010 1010)

尝试在板之间使用较慢的波特率,因为时序对于软件串行来说尤其是一个问题。

或者,使用 Arduino Uno 上的硬件串行端口与另一块板通信。