Последовательная связь USB arduino nano и jetson nano

Я хочу обмениваться данными между Jetson nano и arduino nano через последовательный порт.

Я написал простой скрипт для проверки функциональности, но получаю странные данные

вот код ардуино

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
  
  Serial.println("work fine");
  delay(10000);
}

а это код Python, работающий на jetson nano

import serial
import time

arduino = serial.Serial('/dev/ttyUSB0', 9600, timeout=1)

while True:
  try:
     data = arduino.readline()
     if data:
        print(data)
        print('Hi Arduino')
  except:
     arduino.close

вывод

b'\x17\x0f\t\x0b\x01\x06\t\x0e\x15\r\n'
Hi Arduino

если пробовал разные скорости передачи данных, но ничего не изменилось.

при использовании последовательного монитора в Windows все работает нормально.

, 👍3

Обсуждение

начните с отправки только одного символа каждую секунду, @jsotola

Интересно, может ли это быть проблемой преобразования UTF., @st2000

обратитесь к таблицам ASCII ... биты данных отбрасываются ... работа в шестнадцатеричном формате дает понять ... arduino отправляет 77, 6F, 72, 6B, 20, 66, 69, 6E, 65, 0D, 0A и Jetson получает 17, 0F, 09, 0B, 01, 06, 09, 0E, 15, 0D, 0A ... возможно, несоответствие скорости или буфер данных переполняется входящими данными, @jsotola

Что касается скорости, есть ли параметр, кроме скорости передачи данных, который может вызвать несоответствие? Я отправлял символ "I" каждые 10 секунд, но получил b'\t\r\n', @Abdelrahman Mohsen

Асинхронная последовательная передача имеет 3 дополнительных параметра: количество бит данных, использование четности, количество стоповых битов. Общий набор — 8-N-1, что означает 8 бит данных, без четности, 1 стоповый бит. Вам нужно это проверить. Несоответствие количества стоповых битов безвредно, если отправитель использует их больше, чем получатель., @the busybee


2 ответа


0

В этом вопросе/ответе по стеку подразумевается, что .readline() необходимо преобразовать в строку.

import serial
ser = serial.Serial("COM11", 9600)
while True:
     cc=str(ser.readline())
     print(cc[2:][:-5])

Я согласен с одним из комментариев к этому ответу, что его лучше написать так:

import serial
ser = serial.Serial("COM11", 9600)
while True:
     cc=str(ser.readline())
     cc=cc.decode("utf-8")
     print(cc)
,

readline() возвращает числа... возвращает непечатаемые символы, @jsotola

... тогда возвращает "Байты"?, @st2000

нет никакой разницы между текстом и байтами... это все байты... разница в том, как вы представляете эти байты пользователю... код python печатает текст, потому что он "экранирует" непечатаемые символы... escape-символ - это `\`, @jsotola


2

Я также думаю, что это связано со следующей строкой,

 data = arduino.readline()

Попробуйте следующее,

while True:


try:
     arduino.flushInput() // Очистить буфер

     data = arduino.readline()

     // декодируем байты в формат str, аргумент 'utf-8' должен работать
     data.decode('utf-8')

     // удалить \r\t в выводе str
     data.strip()
     if data:
        print(data)
        print('Hi Arduino')
  except:
     arduino.close

Посмотрите, решит ли это вашу проблему.

Примечание. Я использовал скрипт ESP32 и Python с вышеупомянутыми изменениями, и он у меня работал.

Кроме того, как упоминалось в разделе комментариев, некоторая информация может отсутствовать в выводе 'b'\x17\x0f\t\x0b\x01\x06\t\x0e\x15\r\n' для меня это не воспроизводимо. Просто для справки, мой вывод строки байтов без изменений был b'work fine\r\n' не 'b'\x17\x0f\t\x0b\x01\x06\t\x0e \x15\r\n'

  • перепроверьте скорость записи Arduino,
  • перепроверьте скорость последовательного соединения Python,
  • включить исправление скрипта py

посмотрите, поможет ли это решить вашу проблему.

,