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 остаются включенными, когда он перестает реагировать, а не мигает, как обычно.

, 👍1

Обсуждение

также происходит и в 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


1 ответ


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

2

Вы заливаете 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 используется только в том случае, если задействована реальная последовательная линия.

,