UART между arduino UNO и ПК через USB не синхронизирован

Я подключил свой arduino uno к своей системе, а затем с помощью последовательного порта попробовал записывать и считывать данные, но есть проблема, которую я обнаружил, когда попытался передать созданные arduino сообщения. Мой код arduino довольно прост.

void setup() {
  Serial.begin(115200);
  
}

void loop() {
  if (Serial.available() > 0) {
    String data = Serial.readStringUntil('\n');
    Serial.print(" You sent me: ");
    Serial.println(data);
  }
}

и мой код python в моей системе

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

if __name__ == '__main__':
    ser = serial.Serial('/dev/ttyACM0', 115200, timeout=1)
    ser.flush()

    while True:
        string=input("Enter the string: ")
        ser.write(str.encode(string))
        line = ser.readline().decode('utf-8').rstrip()
        print(line)
        time.sleep(0.01)
        

Теперь это дает мне возможность писать инструкции к моему arduino, но следующие последовательности общения происходят

└──╼ $python3 serial_communication.py 
Enter the string: a

Enter the string: v

Enter the string: v
 You sent me: v
Enter the string: s
 You sent me: v
Enter the string: d

Enter the string: r
 You sent me: sd
Enter the string: d
 You sent me: r
Enter the string: s

Enter the string: e
 You sent me: ds
Enter the string: r
 You sent me: e
Enter the string: 

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

, 👍0

Обсуждение

пожалуйста, отформатируйте свой код, @jsotola

Это отвечает на ваш вопрос? ненадежная связь Python - Arduino, @Juraj

Я не знаю Python, но по поведению, которое вы показываете, я готов поспорить, что функция input() не сохраняет завершающий \n., @Edgar Bonet

использование последовательного монитора решает проблему, но все же, почему arduino выдает задержанное сообщение с избыточными данными, @Ritesh Sharma


1 ответ


Лучший ответ:

1

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

Во-первых, это задержка на старте:

Enter the string: a

Enter the string: v

Enter the string: v
 You sent me: v
Enter the string: s
 You sent me: v

Это происходит потому, что при первом открытии последовательного порта Arduino сбрасывается и входит в загрузчик. Таким образом, первые несколько отправленных вещей отбрасываются, и ничего не отправляется обратно из Arduino - ваш скетч просто не работает в этот момент.

Далее следует формат того, что вы отправляете, по сравнению с тем, как вы его получаете.

Вы вводите строку, а затем отправляете ее дословно. Но на Arduino вы читаете все данные вплоть до завершающего символа новой строки, который вы не отправляете.

Но функция чтения также имеет тайм-аут, поэтому она вернет все, что ей удалось прочитать за это время, даже если терминатор еще не прибыл. По умолчанию этот тайм-аут составляет 1 секунду.

Таким образом, все, что отправляется в течение 1-секундного окна, группируется вместе, что вы и видите здесь:

Enter the string: d
 You sent me: r
Enter the string: s

Enter the string: e
 You sent me: ds

Появление "не синхронизировано" из - за этого 1-секундного тайм-аута-вы видите то, что было отправлено секунду назад.

Исправление достаточно простое: убедитесь, что вы отправляете завершающий символ новой строки из Python:

ser.write(str.encode(string + "\n"))

И подождите несколько секунд после запуска программы и открытия последовательного порта, прежде чем просить что-либо отправить. Возможно, добавьте time.sleep(2) после открытия порта, чтобы принудить эту задержку.

,

Спасибо вам за ответ. Это действительно помогает, так как моей целью было что-то другое, чтобы приступить к работе, но так как это отправная точка, я не хотел, чтобы мои концепции перепутались., @Ritesh Sharma