Как долго работает последовательный буфер в Linux?
Мой вопрос касается <termios.h>
, Как я понимаю, при чтении чего-либо через UART существуют два буфера: аппаратный буфер, в котором хранятся принятые байты, и программный буфер, в который мы загружаем материал, который был сохранен в аппаратном буфере. Этот программный буфер является вторым аргументом в read(uart_channel, BUFFER, length)
насколько я понимаю.
Пожалуйста, объясните: как долго аппаратный буфер? У меня есть контроль над тем, как долго это? Для меня очень важно прочитать 12 последних байтов, отправленных устройством через UART - как я могу это обеспечить?
2 ответа
Большинство uC, которые я видел, имеют аппаратный FIFO, который можно настроить на прерывание, скажем, после [1,2,4,8,16] байтов. Если FIFO остается "частично заполненным" для некоторого небольшого кратного интервала символов для текущей настроенной скорости передачи, UART все равно прерывается. Если вы действительно должны иметь доступ к байтам как можно скорее, то вам нужно установить "длину" FIFO равной 1. Конечно, ваш драйвер должен делать это при инициализации UART.
В противном случае, я думаю, вы могли бы опросить его:(
Однажды у меня была похожая ситуация, и я создал поток, который продолжал читать UART (блокировка read
) и я использовал FIFO между потоками.
Если вы не можете использовать многопоточность, вы можете просто использовать select
,