Целесообразно ли использовать Serial.write в ISR, когда loop() обычно использует Serial.read?

Я не очень разбираюсь в электронике.

У меня есть Nano v3 в качестве мастера I2C, он считывает 5-байтовые пакеты (разделенных данных) с USB-порта ПК, обрабатывает их и пересылает.

Теперь мне нужно реализовать способ сигнализировать ПК, если что-то пойдет не так по линии. Я не хочу загромождать канал I2C, и это просто флаг, поэтому я думаю, что прерывание лучше всего подходит для моей цели.

При написании функции ISR я не уверен, что целесообразно записывать данные с помощью последовательного канала, потому что цикл мог бы прочитать 2-3 байта 5-байтового пакета сообщений. И я не знаю, будет ли он перезаписывать данные, поступающие с КОМПЬЮТЕРА, или что-то еще...

Что произойдет, если я Serial.write(0x1) (внезапно, в функции ISR), в то время как loop() считывал данные из того же последовательногоканала ?

Я и сам не знаю, как это проверить.

, 👍1


1 ответ


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

2

Чтение и запись последовательных данных являются отдельными функциями. Когда вы .write (), вы просто добавляете данные в буфер TX. Когда вы .read() вы просто берете следующий символ из буфера RX.

Вся фактическая отправка и получение, а также заполнение/опорожнение буферов производится внутри ISR для модуля UART.

Тем не менее, вы действительно не должны использовать Serial внутри ISR. Это происходит потому, что отправка и получение осуществляются ИСР, и если вы находитесь в своем ИСР, то отправка никогда не может произойти, пока вы не покинете свой ИСР. Для нечетного случайного байта это на самом деле не проблема, но если буфер TX заполнится, Serial.write() будет блокироваться до тех пор, пока TX ISR не отправит некоторые данные - чего не произойдет, так как ваш ISR блокирует TX ISR.

Поэтому лучше избегать любых последовательных операций внутри ISR. Вместо этого вы обычно устанавливаете флаги и значения в ISR, а затем проверяете наличие этих флагов в loop (), чтобы сообщить о чем-либо.

,

Вас понял. Да, я пишу всего 1 байт, а затем обработка ошибок возьмет верх. Я скоро отмечу как ответ, спасибо., @chocolate