Если работа порта разрешена функцией Serial.begin(), то данные поступающие на вход контроллера Rx в последовательном коде преобразуются в байты и записываются в программный буфер. Этот процесс происходит незаметно для основной программы, по прерыванию контроллера порта.
Программисту нет необходимости беспокоиться о том, что данные могут быть потеряны или пропущены. В любой момент данные последовательного порта могут быть считаны функцией Serial.read(), даже если они были получены час назад.
Передача данных последовательного порта также происходит через программный буфер. Например, при скорости 9600 передача одного байта занимает 1 мс. Если необходимо передать 10 байтов, то потребуется 10 мс. Это не значит, что основная программа должна в течение 10 мс передавать в контроллер последовательного порта данные и контролировать их передачу. Достаточно, к примеру, функцией Serial.write() загрузить данные в программный буфер класса Serial и выполнять другие задачи. Передача данных в аппаратный контроллер последовательного порта будет происходить параллельным процессом по прерыванию контроллера порта.
Часто возникают вопросы:
- Какие размеры имеют буфер приема и буфер передачи класса Serial?
Сколько данных можно принять через последовательный порт, не считывая их программой?
Сколько байтов для передачи можно загрузить в класс Serial одновременно?
\hardware\arduino\avr\cores\arduino\HardwareSerial.h
Определение констант размеров буферов выглядит так:
Код: Выделить всё
#if !defined(SERIAL_TX_BUFFER_SIZE)
#if ((RAMEND - RAMSTART) < 1023)
#define SERIAL_TX_BUFFER_SIZE 16
#else
#define SERIAL_TX_BUFFER_SIZE 64
#endif
#endif
#if !defined(SERIAL_RX_BUFFER_SIZE)
#if ((RAMEND - RAMSTART) < 1023)
#define SERIAL_RX_BUFFER_SIZE 16
#else
#define SERIAL_RX_BUFFER_SIZE 64
#endif
#endif
По умолчанию и для приемного и передающего буферов заданы размеры:
- 16 байтов для микроконтроллеров с памятью до 1023 байта;
64 байта для микроконтроллеров с памятью свыше 1023 байта.
В принципе эти константы можно изменит в файле HardwareSerial.h. Можно исправить константы в строчках:
Код: Выделить всё
#define SERIAL_TX_BUFFER_SIZE 16
#define SERIAL_TX_BUFFER_SIZE 64
#define SERIAL_RX_BUFFER_SIZE 16
#define SERIAL_RX_BUFFER_SIZE 64
Можно дописать перед блоком:
Код: Выделить всё
#define SERIAL_TX_BUFFER_SIZE 100
#define SERIAL_RX_BUFFER_SIZE 100
Значения констант должны быть кратными 2.
Увеличение размеров буферов позволит принимать или передавать больше данных, уменьшение – увеличит размер оперативной памяти, доступной программе. Надо только помнить, что изменения затронут все компилируемые скетчи.