Обмен данными между arduino и pyserial. Что не так?

Помогите пожалуйста разобраться, почему нижеследующий код на python, работает только если задержка (time.sleep(1)) больше 1 секунды?

import time
import serial

ser = serial.Serial(port='/dev/ttyUSB0',baudrate=115200)
ser.write(b'1')
while 1:
    ser.write(b'test\n')
    time.sleep(1)
    while ser.inWaiting() > 0:
        line = ser.readline()
        if line:
            print(line.decode().strip())


Код скетча для Arduino UNO:

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

void loop() {

String incomingData;

if (Serial.available() > 0) {  //если есть доступные данные

       incomingData = Serial.readString();
       Serial.println("123456789");
    }
}
  • Вопрос задан
  • 5643 просмотра
Решения вопроса 1
chukov
@chukov Автор вопроса
После долгих экспирементов, удалось достигнуть приемлемого быстродействия, 100 сообщений ушло за 0:00:00.601094:
#include <Arduino.h>

void setup() {
  Serial.begin(115200);
  Serial.println("Booting");
}

void loop() {


  while(Serial.available()){
    Serial.write(Serial.read());
  }
  delay(10);


}


тестовый код на python:
import time
import serial
import datetime

ser = serial.Serial(port='/dev/ttyUSB0', baudrate=115200)
received = []

ser.write(b'begin\n')
time.sleep(5)

start = datetime.datetime.now()
for i in range(1, 100):
    ser.write(b'test%i\r\n' % i)
    time.sleep(0.005)
    while ser.inWaiting() > 0:
        line = ser.readline()
        if line:
            received.append(line.decode().strip())

print(datetime.datetime.now() - start)
print(received)


ser.write(b'begin\n')
time.sleep(5)

Даннй кусок нужен, что-бы ардуина (esp32 тоже) успел перзагрузиться, т.к. dtr связан с software reset.
Подробнее тут
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
NeiroNx
@NeiroNx
Программист
Это нормально для последовательных портов. Пока данные отправятся, пока ардуина ответ отправит.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы