Serial висит на Arduino-Uno
У меня проблемы с последовательной связью Arduino и RPI3, через некоторое время она перестанет отвечать на запросы. Попробовал увеличить скорость передачи данных в бодах и ту же проблему, что и в Windows, так что RPI не виноват, и даже после увеличения задержки
зависание все равно происходит.
RPI3 python код
import serial
import time
if __name__ == '__main__':
ser = serial.Serial('/dev/ttyACM0', 115200, timeout=1, writeTimeout=0)
ser.flush()
last = "on\n"
while True:
last = "on\n" if last == "off\n" else "off\n"
ser.write(last.encode())
print(last)
time.sleep(0.5)
Arduino код
#define BAUD_RATE 115200
const int LED_PIN = 8;
String command;
void setup() {
Serial.begin(BAUD_RATE);
pinMode(LED_PIN, OUTPUT);
delay(100);
}
void loop() {
Serial.println("I was written in RPI");
if (Serial.available()) {
command = Serial.readStringUntil('\n');
if (command.equals("on")) {
digitalWrite(LED_PIN, HIGH);
} else if (command.equals("off")) {
digitalWrite(LED_PIN, LOW);
}
}
delay(50);
}
менее чем через минуту я получу это исключение из python
BlockingIOError: [Errno 11] Ресурс временно недоступен
Светодиоды Arduino TX и RX остаются включенными, когда он перестает реагировать, а не мигает, как обычно.
@Philip Rollins, 👍1
Обсуждение1 ответ
Лучший ответ:
Вы заливаете RPi/PC надписью "I was written in RPI"
и не читаете ее. Это сработает, если вы будете регулярно читать сер.
О задержках: сообщение по последовательной линии имеет время передачи, в вашем случае 20 символов со скоростью 115200 бод от Arduino до RPi/PC. При использовании общего протокола 8n1 символы передаются со скоростью 11520 символов в секунду. С 20 символами это займет почти 0,002 секунды, или 2 мс. Получателю требуется меньшая задержка, чем отправителю, чтобы избежать переполнения.
Если бы Arduino использовал USB напрямую (AFAIK этого не делает, между его интерфейсом USB и фактическим AVR находится "настоящая" последовательная линия), то baudrate не имеет значения. Виртуальная последовательная линия через USB всегда очень быстрая, независимо от объявленной скорости передачи данных. Однажды я с успехом использовал 921600 бод. ;-) Baudrate используется только в том случае, если задействована реальная последовательная линия.
- Отправка информации (например, строки) через цифровые контакты
- Метод перебора битов в байте, отправленном по последовательному каналу.
- серийные данные портятся
- Ошибка при загрузке скетча в Arduino UNO с помощью CLI
- Два адруино подключены к малине по usb, но один переподключается во время выполнения кода обработки
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Использовать все контакты как цифровые входы/выходы
также происходит и в Windows, так что RPI не виноват
... может быть, но это не исключает проблем с python, @jsotolaкакую ошибку вы получаете в RPi, если запускаете LED blink sketch на arduino?, @jsotola
Просто "ресурс временно недоступен", светодиоды Arduino TX и RX остаются включенными, когда он перестает отвечать на запросы, а не мигает, как обычно., @Philip Rollins
блок "if (!Serial) {}" находится в разделе " setup ()" ` , @jsotola
удалите блок
if (Serial.availableForWrite ()) { }
.... сократите код до минимума, @jsotolaСкорректировал код так, чтобы он был минимальным., @Philip Rollins
он все еще вешает трубку?, @jsotola
Да, все еще висит, @Philip Rollins
Поможет ли это, если вы удалите "Serial.println ()" из кода Arduino?, @Edgar Bonet
Можете ли вы попытаться выяснить, какой ресурс недоступен?, @the busybee
Вы наводняете RPi/PC словами"Я был написан в RPI" и не читаете их. Работает ли это, если вы регулярно читаете "сер"?, @the busybee
Говорит ли вам что-нибудь "dmesg-w" в тот момент, когда он запирается?, @Majenko
Кажется, все работает нормально, если все, что я делаю, это читаю ИЛИ пишу на Arduino, даже не читая серийный номер в python., @Philip Rollins
@thebusybee вы были правы, кажется, работает с
ser.readline()
в коде python. Бесплатные баллы, если вы хотите написать комментарий, как ответ будет принят., @Philip RollinsКроме того, стоит отметить, что мне пришлось увеличить "задержку" на Arduino, чтобы она была больше, чем " сон " в python. Для меня `delay(50) " и "sleep(0.01)" работают нормально, может быть, это как-то связано с тем, что python медленный?, @Philip Rollins