Увеличить последовательный буфер Rx
Я работаю с Arduino Due и столкнулся с проблемой размера буферов последовательного приёма. Я использую GSM-модуль, и некоторые ответы Arduino превышают количество байтов, которое я могу одновременно сохранить в буфере.
Я читал о способах увеличения размера буфера путем изменения установочных файлов Arduino по умолчанию, но я не могу пойти этим путем, поскольку мой код может быть скомпилирован на машине со стандартными размерами буфера в установочных файлах по умолчанию, и модуль не будет работать правильно.
Не уверен, возможно ли это, но надеялся, что кто-нибудь знает, как увеличить размер буфера последовательного порта, используя исходный код. Если получится, буфер всегда будет иметь указанный мной размер.
@user1649972, 👍0
Обсуждение2 ответа
Используйте прерывания по таймеру для чтения и сохранения данных из последовательного порта. Предположим, вы получаете данные со скоростью 115 200 бод в конфигурации по умолчанию (8 бит данных, 1 стоповый бит), 115 200/9 = 12 800 байт в секунду, примерно 80 микросекунд на каждый байт. Создайте прерывание по таймеру, которое будет вызываться каждые 2 миллисекунды (выберите оптимальное время для вашего приложения, убедившись, что буфер приёмника не переполнится). Через 2 миллисекунды в буфере будет доступно 25 байт данных. Таким образом, вы можете считывать данные партиями по 25 байтов. С помощью прерывания считывайте и сохраняйте доступные данные из буфера.
Я знаю, что это для входной строки, но указание размера буфера может помочь.
void setup()
{
Serial.begin(57600);
while(!Serial){;}
inputString.reserve(20); //ЗАРЕЗЕРВИРУЕМ НЕКОТОРОЕ МЕСТО ДЛЯ ВХОДНОЙ СТРОКИ
delay(50);
}
- Построение графика на Python с использованием Tkinter Canvas
- Что является более быстрой альтернативой parseInt()?
- SerialUSB на Arduino Due
- Использование экрана SD-карты на Arduino Due
- Связь между Python и Arduino ненадежна
- Serial.availableForWrite против Serial.flush
- Проблемы с I2C и Wire.Available()
- Протокол связи Arduino с python — помимо примера pyserial и Arduino
Вот несколько хороших предложений по этой теме: https://groups.google.com/a/arduino.cc/forum/#!topic/developers/AEA8LniThTA, @Mikael Patel
Просто читайте данные из последовательного порта быстрее. Не полагайтесь на буфер для хранения данных, считывайте их из буфера и сохраняйте самостоятельно., @Majenko
@Микаэль, спасибо за ссылку, я сейчас их читаю., @user1649972
@Majenko Моя проблема не в скорости чтения последовательного порта, а в том, как часто я могу выполнять чтение. Я работаю с кодом, написанным кем-то другим, поэтому у меня есть ограничения на частоту чтения данных из последовательного порта. Один из вариантов решения этой проблемы — снизить скорость передачи данных, чтобы данные считывались медленнее и, следовательно, было больше попыток прочитать и очистить буфер приёма, прежде чем он успеет что-то изменить., @user1649972
Может быть, тогда подключиться к yield(), чтобы извлечь данные в свой собственный буфер?, @Majenko
Хорошее предложение, я посмотрю на это. Опять же, код запускает несколько потоков, каждый из которых уже использует yield(), так что это может быть сложно, но определённо стоит посмотреть. Я также работаю над тем, чтобы убрать заголовки из отправляемого мне ответа, чтобы не пришлось обрабатывать нежелательные данные. Ещё раз спасибо., @user1649972