Проверьте, есть ли входящие данные в последовательном порту Linux (cbInQue для Linux) - PullRequest
0 голосов
/ 08 октября 2018

У меня проблемы с управлением данными, поступающими в последовательный порт Linux с устройства Arduino.

В основном у меня есть рабочий код для чтения и распечатки (или просто хранения), но он записандля платформы Windows:

Статус имеет тип COMSTAT

int SerialPort::readSerialPort(char *buffer, unsigned int buf_size)
{
  DWORD bytesRead;
  unsigned int toRead = 0;
  Sleep(500);
  ClearCommError(this->handler, &this->errors, &this->status);

  if (this->status.cbInQue > 0) { //if there's something to read 
    if (this->status.cbInQue > buf_size) {//if there's something to read&bigger than buffer size
        toRead = buf_size; //read as much as buffer alows 
    }
    else toRead = this->status.cbInQue; //else just read as much as there is
}

if (ReadFile(this->handler, buffer, toRead, &bytesRead, NULL))
    return bytesRead; //return read data


return 0;//return 0 if nothing is there.
}

, кроме Sleep (), который является функцией Windows, мне было интересно, есть ли эквивалентная функция Linux для status.cbInQue, чтобы понятьесли есть какие-либо данные, которые готовы для чтения в порту.Прямо сейчас я просто продолжаю и читаю, не проверяя, и часто я ничего не печатаю позже в программе.

TLDR: есть ли эквивалент cbInQue для linux?

Спасибо

1 Ответ

0 голосов
/ 08 октября 2018

Да, вам понадобится ваш файловый дескриптор, а затем используйте FIONREAD, чтобы узнать, доступно ли что-нибудь.

Должно работать что-то вроде следующего:

int available;
if( ioctl( fd, FIONREAD, &available ) < 0 ) {
    // Error handling here
}
...