Что делает Arduino, если последовательное соединение закрыто на другом конце?

У меня есть простой метод, который просто ждет ввода, вычисляет ответ и отправляет его:

void loop() { 
  if (Serial.available() > 0){
    input = Serial.read();

    if (input == 10){
      digitalWrite(trigPin, LOW);
      delayMicroseconds(2);
    
      digitalWrite(trigPin, HIGH);
      delayMicroseconds(10);
      digitalWrite(trigPin, LOW);
    
      duration = PulseDuration(echoPin, HIGH, 6000);
      distance = duration * 0.00034/2;  // 0.00034 m/us is speed of sound

      Serial.println(distance, 4);
      }
  }
}

Мой вопрос: Что произойдет с arduino, если я закрою последовательное соединение с приемным концом во время печати данных (в последней строке цикла)?

Контекст и мотивация:

В большинстве случаев программа работает хорошо. Я могу открыть программу python, которая отправляет запросы и распечатывает ответ с помощью pyserial. После того, как я закрываю сторону python и снова открываю ее, соединение устанавливается, и я могу начать слушать на стороне красиво, как и в первый раз. Иногда, однако, когда я пытаюсь перезапустить программу python, я получаю ошибку подключения, говорящую о том, что порт уже открыт (я работаю в Windows.. есть тонны сообщений об этой проблеме, но ни один из них не был полезен). В некоторых других случаях, при соединении с программой python (которая соединяется с connection = serial.Последовательный(self.arduino_port, 9600, timeout=0) он просто блокирует и не подключается, не выдает ошибку "порт уже открыт" и не переходит к следующему оператору. Я уверен, что закрыл предыдущий запуск python перед попыткой нового (process explorer не показывает никаких активных программ python, он также не показывает никаких открытых процессов с помощью последовательного обработчика). Однако я здесь не для того, чтобы решить эту проблему напрямую, а просто задать связанный с ней вопрос.

Я также уверен, что запуск функции connection.close() не завершает работу программы arduino, так как я смог перезапустить свою программу python без необходимости перезагрузки arduino или чего-то еще, предполагая, что arduino продолжал работать свой цикл после того, как я закрыл соединение на стороне python.

Все, что хотел сказать, что мое последнее предположение заключается в том, что эти вопросы возникают, когда я закрываю соединение через последовательный порт связи.близко() в то время как Arduino является печать, а потому, что порт закрыт, что Arduino является застрял и не серийный.метод println(), как USB-никогда не просит, чтобы очистить данные в свой буфер. Возможно ли это/имеет ли смысл? Что произойдет с arduino, если я закрою последовательное соединение во время печати данных?

Я не публикую здесь свою программу python, поскольку она не имеет прямого отношения к вопросу, и я не могу сделать минимальную воспроизводимую программу, которая не раскрывает конфиденциальный код.

, 👍0

Обсуждение

Какой Arduino? Пожалуйста, отметьте свой вопрос этой информацией. Существует множество моделей Arduino, и некоторые из них имеют разные способы взаимодействия с USB, чем другие., @Nick Gammon

вопрос не в Arduino, @Juraj

@NickGammon Это Arduino/Genuino 101, @polortiz4

@Juraj Он спрашивает, что делает Arduino, если последовательное соединение закрыто, поэтому я думаю, что это актуальный вопрос. Однако основная часть вопроса, по-видимому, касается поведения окон., @Nick Gammon

Да, я хотел объяснить, почему я хотел знать, что делает arduino, и, возможно, слишком увлекся моей общей проблемой (извините), когда все, что я хотел, - это знать, что происходит, когда arduino пытается запустить Serial.println (..), в то время как другой конец отключается., @polortiz4


1 ответ


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

0

Это какое-то странное интеллектуальное чудовище. Невозможно понять, что он делает и как. Вторжение Intel в Ардуиносферу было кратким и несколько неудачным.

Однако в целом (для большинства ядер) сигнал DTR (а иногда и сигнал RTS) протокола CDC/ACM используется для "ворот" последовательных данных - если он утверждается, то последовательные данные передаются на главный КОМПЬЮТЕР. Если она не утверждена, то ее просто выбрасывают.

Я видел ядра, где, если DTR не утверждается, данные буферизуются до тех пор, пока буфер TX не заполнится, а затем блокируются, но это редко.

Вы можете найти свой ответ, если покопаетесь в исходном коде ядра, но вы можете обнаружить, что большие его куски скрыты в предварительно скомпилированных библиотеках с закрытым исходным кодом, и тот факт, что он, кажется, запускает некоторые пользовательские RTOS, означает, что он будет еще более запутан. МММ...

,

или попробуй это сделать ....., @Juraj

Спасибо, @Majenko, это полезно., @polortiz4

@Juraj, попробуй что? Я уже пытаюсь что-то (описано в посте) и наблюдаю за некоторым поведением. Я задал этот вопрос, чтобы посмотреть, имеют ли смысл мои рассуждения в отношении указанного наблюдения. Если у вас есть предложения по тестам более низкого уровня, чтобы понять поведение в этом сценарии, я весь внимание. Я не знаю, как опуститься ниже того уровня, который я сейчас делаю. Как я могу увидеть результат кода arduino, если сам тест заключается в отключении его последовательной связи? Как я могу определить, блокирует ли arduino или запускает свой цикл, если я не могу подключиться к нему повторно?, @polortiz4

@polortiz4, добавьте Serial печать в скетч мерцания., @Juraj

Хм, это хорошая и простая идея. Спасибо, @polortiz4