Одновременное последовательное чтение и запись

Я пытаюсь прочитать длинные строки из серийного номера, используя arduino. Чтобы сэкономить немного оперативной памяти, я не использую Serial.readString(). Вместо этого я использую Serial.read().

Во время чтения я также печатаю некоторую отладочную информацию на тот же последовательный порт.

Допустим, я отправляю 90 символов в серийный номер с ПК. Я прочитал их с помощью Serial.read(). Если я несколько раз вызываю Serial.println() между двумя вызовами Serial.read(), я получаю только 67 символов из 90 (Serial.available()>0 равно false).

Я читаю все 90 символов, когда вообще не вызываю Serial.println().

Почему? Я был уверен, что можно одновременно писать в серийник и читать из него, что это независимые процессы.

Я ошибаюсь?

, 👍0

Обсуждение

Я не понимаю, что вы подразумеваете под «сколько я печатаю ... настолько короче строка чтения». Пожалуйста, объясните более и более ясно, @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


1 ответ


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

2

Вы действительно можете одновременно читать и писать через последовательный порт. В на аппаратном уровне последовательный порт (UART) является передатчиком, а приемник, которые почти независимы. На программном уровне они оба обрабатываются через прерывания, которые читают / записывают в программное обеспечение буфер.

Однако существует ограничение, о котором следует помнить: буферы небольшие, обычно 64 байта на платах на основе AVR. Если вы слишком часто пытаетесь писать слишком много, выходной буфер будет заполнен, а затем все последующие записи становятся блокирующими и выполняются так же медленно, как и сам последовательный порт. Если вы получаете много данных и не читаете их в ближайшее время достаточно, входной буфер переполнится, и вы потеряете некоторые данные.

Судя по вашему описанию проблемы, вы попали в самую точку. пределы обоих буферов. Вы слишком часто используете Serial.println(). Затем эти операции записи занимают слишком много времени, и в то же время вы не Serial.read(). Поскольку ваш компьютер не ждет, пока вы Serial.read(), ваш входной буфер в конечном итоге переполняется, и вы только получить немного больше символов, чем стоит буфер.

,

Я полностью удовлетворен вашим ответом. Большое вам спасибо!, @zhekaus