Что делает 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, поскольку она не имеет прямого отношения к вопросу, и я не могу сделать минимальную воспроизводимую программу, которая не раскрывает конфиденциальный код.
@polortiz4, 👍0
Обсуждение1 ответ
Лучший ответ:
Это какое-то странное интеллектуальное чудовище. Невозможно понять, что он делает и как. Вторжение Intel в Ардуиносферу было кратким и несколько неудачным.
Однако в целом (для большинства ядер) сигнал DTR (а иногда и сигнал RTS) протокола CDC/ACM используется для "ворот" последовательных данных - если он утверждается, то последовательные данные передаются на главный КОМПЬЮТЕР. Если она не утверждена, то ее просто выбрасывают.
Я видел ядра, где, если DTR не утверждается, данные буферизуются до тех пор, пока буфер TX не заполнится, а затем блокируются, но это редко.
Вы можете найти свой ответ, если покопаетесь в исходном коде ядра, но вы можете обнаружить, что большие его куски скрыты в предварительно скомпилированных библиотеках с закрытым исходным кодом, и тот факт, что он, кажется, запускает некоторые пользовательские RTOS, означает, что он будет еще более запутан. МММ...
или попробуй это сделать ....., @Juraj
Спасибо, @Majenko, это полезно., @polortiz4
@Juraj, попробуй что? Я уже пытаюсь что-то (описано в посте) и наблюдаю за некоторым поведением. Я задал этот вопрос, чтобы посмотреть, имеют ли смысл мои рассуждения в отношении указанного наблюдения. Если у вас есть предложения по тестам более низкого уровня, чтобы понять поведение в этом сценарии, я весь внимание. Я не знаю, как опуститься ниже того уровня, который я сейчас делаю. Как я могу увидеть результат кода arduino, если сам тест заключается в отключении его последовательной связи? Как я могу определить, блокирует ли arduino или запускает свой цикл, если я не могу подключиться к нему повторно?, @polortiz4
@polortiz4, добавьте Serial печать в скетч мерцания., @Juraj
Хм, это хорошая и простая идея. Спасибо, @polortiz4
- Почему я не могу распечатать значения логических переменных (0 и 1) с помощью функции println?
- Печать массива с помощью функции печати и последовательной записи в Arduino Uno
- Genuino 101 - Не удается загрузить скетч - Ошибка тайм-аута
- Arduino Serial.ReadString() проблема
- Serial.print печатает, а lcd.print - нет.
- Создание строк с символами UTF-8 из данных
- Serial Monitor печатает странные значения и пропускает строки
- Серийный монитор, '\r' и Realterm
Какой Arduino? Пожалуйста, отметьте свой вопрос этой информацией. Существует множество моделей Arduino, и некоторые из них имеют разные способы взаимодействия с USB, чем другие., @Nick Gammon
вопрос не в Arduino, @Juraj
@NickGammon Это Arduino/Genuino 101, @polortiz4
@Juraj Он спрашивает, что делает Arduino, если последовательное соединение закрыто, поэтому я думаю, что это актуальный вопрос. Однако основная часть вопроса, по-видимому, касается поведения окон., @Nick Gammon
Да, я хотел объяснить, почему я хотел знать, что делает arduino, и, возможно, слишком увлекся моей общей проблемой (извините), когда все, что я хотел, - это знать, что происходит, когда arduino пытается запустить Serial.println (..), в то время как другой конец отключается., @polortiz4