Jetson Nano Pyserial написать сообщение Arduino получить неправильные символы - PullRequest
0 голосов
/ 22 апреля 2020

Я написал python скрипт, использующий pyserial для подключения NVIDIA Jetson Nano через последовательную связь с Arduino Uno с использованием контактов Jetson nano J41 и Software Serial на Arduino Uno, но у меня возникают проблемы с сообщениями, полученными на arduino uno, иногда Я получил плохие символы в сообщении. например, я отправляю с pyserial "hello world", и когда я проверяю серийный номер arduino, я получаю "he⸮lo" worlf * "

Также, когда arduino получает сообщение, оно отвечает с помощью MESSAGE_OK, а jetson nano всегда получает его прямо без странных символов. От jetson к uno принимаются плохие символы, но от nano к jetson все нормально. Я использую преобразователь уровня logi c для подключения последовательных контактов программного обеспечения 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");
  }
}

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 c не может декодировать байт 0xe c в позиции 0: неожиданный конец данных

1 Ответ

1 голос
/ 22 апреля 2020

В ожидаемых и получаемых символах есть ряд одно- и двухбитных ошибок. Это может быть проблема с электричеством и / или временем.

например

пробел (0010 0000) => "(0010 0010)

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

\ n (0000 1011 и 0000 1010) => * (один из которых заканчивается 0010 1010)

Попробуйте использовать более медленную скорость передачи данных между платами, так как синхронизация особенно важна для серийного программного обеспечения.

В качестве альтернативы используйте аппаратный последовательный порт на Arduino Uno для связи с другой платой.

...