Одновременное последовательное чтение и запись
Я пытаюсь прочитать длинные строки из серийного номера, используя arduino. Чтобы сэкономить немного оперативной памяти, я не использую Serial.readString(). Вместо этого я использую Serial.read().
Во время чтения я также печатаю некоторую отладочную информацию на тот же последовательный порт.
Допустим, я отправляю 90 символов в серийный номер с ПК. Я прочитал их с помощью Serial.read(). Если я несколько раз вызываю Serial.println() между двумя вызовами Serial.read(), я получаю только 67 символов из 90 (Serial.available()>0
равно false).
Я читаю все 90 символов, когда вообще не вызываю Serial.println().
Почему? Я был уверен, что можно одновременно писать в серийник и читать из него, что это независимые процессы.
Я ошибаюсь?
@zhekaus, 👍0
Обсуждение1 ответ
Лучший ответ:
Вы действительно можете одновременно читать и писать через последовательный порт. В на аппаратном уровне последовательный порт (UART) является передатчиком, а приемник, которые почти независимы. На программном уровне они оба обрабатываются через прерывания, которые читают / записывают в программное обеспечение буфер.
Однако существует ограничение, о котором следует помнить: буферы небольшие, обычно 64 байта на платах на основе AVR. Если вы слишком часто пытаетесь писать слишком много, выходной буфер будет заполнен, а затем все последующие записи становятся блокирующими и выполняются так же медленно, как и сам последовательный порт. Если вы получаете много данных и не читаете их в ближайшее время достаточно, входной буфер переполнится, и вы потеряете некоторые данные.
Судя по вашему описанию проблемы, вы попали в самую точку.
пределы обоих буферов. Вы слишком часто используете Serial.println()
. Затем
эти операции записи занимают слишком много времени, и в то же время вы не
Serial.read()
. Поскольку ваш компьютер не ждет, пока вы
Serial.read()
, ваш входной буфер в конечном итоге переполняется, и вы только
получить немного больше символов, чем стоит буфер.
Я полностью удовлетворен вашим ответом. Большое вам спасибо!, @zhekaus
- Как разделить входящую строку?
- Как вывести несколько переменных в строке?
- В чем разница между Serial.write и Serial.print? И когда они используются?
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Программы построения последовательных данных
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Очистить существующий массив при получении новой последовательной команды
Я не понимаю, что вы подразумеваете под «сколько я печатаю ... настолько короче строка чтения». Пожалуйста, объясните более и более ясно, @chrisl
Пожалуйста, покажите нам скетч, который вы используете., @VE7JRO
Я отправляю 90 символов в сериал. Я прочитал их с помощью Serial.read(). Если между вызовами Serial.read() я вызываю Serial.println() несколько раз, я читаю только 67 символов из 90. Я читаю все 90 символов, когда вообще не вызываю Serial.println., @zhekaus
@VE7JRO, кажется, я достаточно хорошо описал свою проблему. Скетч довольно длинный и его вырезание займет некоторое время., @zhekaus
какая команда использует это сравнение? ...
Серийный.доступный()>0
, @jsotola@jsotola вы можете прочитать об этом на arduino.cc, @zhekaus
Размер последовательного буфера составляет всего 64 байта. Если печать занимает слишком много времени, а компьютер отправляет данные слишком быстро, вы потеряете данные. Но это зависит от вашего скетча, от того, сколько данных вы печатаете и какую скорость передачи данных вы используете., @chrisl