我使用pyserial编写了一个python脚本,通过使用Jetson Nano J41引脚和Arduino Uno上的Software serial与Arduino Uno进行串行通信来连接NVIDIA Jetson Nano,但我对在Arduino Uno上接收到的消息有问题,有时消息中有错误字符。例如,我用pyserial发送"你好世界",当我查看arduino serial时,我得到了"他⸮lo"worlf*">
此外,当arduino收到消息时,它会用message_OK回答,而jetson nano总是在没有奇怪字符的情况下正确处理。从jetson到uno都没有收到坏字符,但从nano到jetson都可以。我正在使用逻辑电平转换器将arduino软件串行引脚连接到jetson nano-uart引脚。
我一直在努力弄清楚发生了什么,但没有成功,如果有人能帮我提建议,或者得到答案,那就太好了。
我正在尝试一个最简单的例子,下面是我为arduino和jetsonnano:编写的代码
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");
}
}
Jetson nano:
#!/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:数据意外结束
在预期字符和接收字符中存在许多单位和双位错误。这可能是电气和/或时间问题。
例如
空间(
0010 0000
(=>quot;(0010 0010
(d(
0010 0010
(=>f(0110 0110
(\n(
0000 1011
和0000 1010
(=>*(其中一个最终成为0010 1010
(
尝试在板之间使用较慢的波特率,因为时序尤其是软件串行的问题。
或者,使用Arduino Uno上的硬件串行端口与其他板进行通信。