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:
Глядя на них, я понимаю, что это может быть проблема с моим кодом или я использую неправильный протокол.
@Ritesh Sharma, 👍0
Обсуждение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
- Последовательная связь между несколькими устройствами (или ардуино)
- I2C связь между Arduino Uno и Nodemcu32-s (ESP32)
- SIM800L не отвечает на AT-команды
- Как импортировать данные с SD-карты на Arduino на компьютер, используя последовательный/COM-порт Arduino?
- Проблема последовательной связи с общей землей SIM800L
- Альтернатива LCD-дисплеям UART/I2C?
- ESP01 и Arduino — путаница с последовательным портом
- Arduino UARTS Автоматическая адресация ведомых устройств
пожалуйста, отформатируйте свой код, @jsotola
Это отвечает на ваш вопрос? ненадежная связь Python - Arduino, @Juraj
Я не знаю Python, но по поведению, которое вы показываете, я готов поспорить, что функция
input()
не сохраняет завершающий\n
., @Edgar Bonetиспользование последовательного монитора решает проблему, но все же, почему arduino выдает задержанное сообщение с избыточными данными, @Ritesh Sharma