Увеличить последовательный буфер Rx

Я работаю с Arduino Due и столкнулся с проблемой размера буферов последовательного приёма. Я использую GSM-модуль, и некоторые ответы Arduino превышают количество байтов, которое я могу одновременно сохранить в буфере.

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

Не уверен, возможно ли это, но надеялся, что кто-нибудь знает, как увеличить размер буфера последовательного порта, используя исходный код. Если получится, буфер всегда будет иметь указанный мной размер.

, 👍0

Обсуждение

Вот несколько хороших предложений по этой теме: https://groups.google.com/a/arduino.cc/forum/#!topic/developers/AEA8LniThTA, @Mikael Patel

Просто читайте данные из последовательного порта быстрее. Не полагайтесь на буфер для хранения данных, считывайте их из буфера и сохраняйте самостоятельно., @Majenko

@Микаэль, спасибо за ссылку, я сейчас их читаю., @user1649972

@Majenko Моя проблема не в скорости чтения последовательного порта, а в том, как часто я могу выполнять чтение. Я работаю с кодом, написанным кем-то другим, поэтому у меня есть ограничения на частоту чтения данных из последовательного порта. Один из вариантов решения этой проблемы — снизить скорость передачи данных, чтобы данные считывались медленнее и, следовательно, было больше попыток прочитать и очистить буфер приёма, прежде чем он успеет что-то изменить., @user1649972

Может быть, тогда подключиться к yield(), чтобы извлечь данные в свой собственный буфер?, @Majenko

Хорошее предложение, я посмотрю на это. Опять же, код запускает несколько потоков, каждый из которых уже использует yield(), так что это может быть сложно, но определённо стоит посмотреть. Я также работаю над тем, чтобы убрать заголовки из отправляемого мне ответа, чтобы не пришлось обрабатывать нежелательные данные. Ещё раз спасибо., @user1649972


2 ответа


1

Используйте прерывания по таймеру для чтения и сохранения данных из последовательного порта. Предположим, вы получаете данные со скоростью 115 200 бод в конфигурации по умолчанию (8 бит данных, 1 стоповый бит), 115 200/9 = 12 800 байт в секунду, примерно 80 микросекунд на каждый байт. Создайте прерывание по таймеру, которое будет вызываться каждые 2 миллисекунды (выберите оптимальное время для вашего приложения, убедившись, что буфер приёмника не переполнится). Через 2 миллисекунды в буфере будет доступно 25 байт данных. Таким образом, вы можете считывать данные партиями по 25 байтов. С помощью прерывания считывайте и сохраняйте доступные данные из буфера.

,

-3

Я знаю, что это для входной строки, но указание размера буфера может помочь.

void setup()
{

  Serial.begin(57600);
  while(!Serial){;}
  inputString.reserve(20); //ЗАРЕЗЕРВИРУЕМ НЕКОТОРОЕ МЕСТО ДЛЯ ВХОДНОЙ СТРОКИ

  delay(50);

}
,