Я читаю данные ~ 100 байт на 100 Гц из последовательного порта.Мой буфер составляет 1024 байта, поэтому часто мой буфер используется не полностью.Однако иногда я получаю икоты с последовательного порта, и буфер заполняется.
Мои данные организованы как [header] data [checkum].Когда мой буфер заполняется, иногда сообщение / данные разделяются на две операции чтения из последовательного порта.
Это простая проблема, и я уверен, что есть много разных подходов.Я опережаю график, поэтому я хотел бы исследовать различные подходы.Не могли бы вы, ребята, назвать несколько парадигм, которые охватывают буферизацию в высокоскоростных данных, которые, возможно, потребуется собрать из двух операций чтения?Обратите внимание, что основное отличие, которое я вижу в этой проблеме от, скажем, другой буферизации, которую я сделал (получение изображений, tcp / ip), заключается в том, что там нам гарантированы полные пакеты / сообщения.Здесь «пакет» может быть разделен между операциями чтения, которые мы узнаем только после того, как начнем анализ данных.
О, да, обратите внимание, что данные, буферизованные в результате чтения, должны быть проанализированы, поэтомупросто, данные должны быть смежными, когда они достигают синтаксического анализа.(Плюс я не думаю, что это ответственность парсера)
Некоторые идеи, которые у меня были:
- Перенести неиспользованные байты в мой оригинальный буфер, а затем заполнить его чтением после левогоболее байтов из предыдущего чтения.(Например, мы читаем 1024 байта, 24 байта остаются в конце, это частичное сообщение, memcpy в начало read_buffer_, передаем начало + 24 для чтения и чтения в 1024 - 24)
- Создайте свой собственный класс, который просто получает блоки данных.Он имеет два указателя: чтение / запись и большой кусок памяти (1024 * 4).Когда вы передаете данные, класс корректно обновляет указатель записи и переносится в начало своего буфера, когда достигает конца.Я думаю, как кольцевой буфер?
- Я думал, может быть, используя
std::vector<unsigned char>
.Динамическое распределение памяти, гарантированно непрерывное.
Спасибо за информацию, ребята!