Есть ли у нас что-то, чтобы проверить, доступны ли данные в порту UART во встроенном Linux?

Можно ли из пользовательского приложения проверить, доступны ли данные для чтения в порту UART. Код написан на C поверх Embedded Linux Platform.

Например :

while(isDataAvalable(fileDescriptor)) {
    read(fileDescriptor, buffer, 10)
}

Я ищу некоторую функцию, предоставляемую linux, которая возвращает true, если есть данные для чтения из порта, и false, если данных нет. Но сама функция не должна удалять данные из аппаратного буфера, пока данные не будут прочитаны методом "read".

Если в Linux нет такой встроенной функции, есть ли способ создать функцию-оболочку, используя системные вызовы Linux для достижения вышеуказанной функциональности, которую может использовать приложение пользовательского пространства..?


person Jose John Thottungal    schedule 09.10.2015    source источник
comment
Вы пробовали использовать select?   -  person Joel C    schedule 09.10.2015
comment
Ваше понимание ввода-вывода и того, как работает последовательный порт, ошибочно. Драйвер устройства всегда считывает порт UART как можно скорее, чтобы предотвратить ошибку переполнения приема. Данные хранятся в системном буфере. (На самом деле может быть ряд буферов, например, для линейной дисциплины.) Пользовательское пространство read() всегда извлекает данные из буфера, а не напрямую из оборудования. См. cmrr.umn.edu/~strupp/serial.html#5_1_3   -  person sawdust    schedule 09.10.2015
comment
Я согласен с вашей точкой зрения, что вызов read в пользовательском пространстве извлекает данные из буфера. Мне нужна функция для проверки наличия каких-либо данных в этом буфере. read() всегда берет данные из буфера, я не хочу брать данные, просто нужно посмотреть, есть ли какие-то данные в буфере.   -  person Jose John Thottungal    schedule 10.10.2015


Ответы (2)


Этого можно добиться, используя poll() в Linux.

poll() должен быть в состоянии сказать, есть ли данные для чтения, и это очень полезно в таких сценариях. Он отслеживает набор файловых дескрипторов и ожидает, когда один из файловых дескрипторов станет готов к выполнению ввода-вывода.

poll() проверяет, произошло ли какое-либо желаемое событие (например, получение данных). Если запрошенное событие произошло, он должен сообщить через POLLIN, что событие произошло (есть данные для чтения) в конкретном файловом дескрипторе.

person Karthik Balaguru    schedule 31.10.2015

Если бы вы могли использовать структуру Qt, то QSerialPort испускает сигнал QIODevice::readyRead(), когда данные доступны. (вы можете развернуть Qt без графического интерфейса для своей платформы, чтобы минимизировать занимаемую площадь)

person Libor Tomsik    schedule 13.10.2015