У меня проблемы с чтением данных с последовательного порта, который я открыл следующим образом. Я использовал этот экземпляр кода много раз, и все работало нормально, но сейчас, по какой-то причине, которую я не могу понять, я совершенно не могу прочитать что-либо из последовательного порта.
Я могу написать, и все правильно получено на другом конце, но ответы (которые отправлены правильно) никогда не принимаются (Нет, все кабели в порядке;))
Код, который я использовал для открытия последовательного порта, следующий:
fd = open("/dev/ttyUSB0", O_RDWR | O_NONBLOCK | O_NOCTTY);
if (fd == -1)
{
Aviso("Unable to open port");
return (fd);
}
else
{
//Get the current options for the port...
bzero(&options, sizeof(options)); /* clear struct for new port settings */
tcgetattr(fd, &options);
/*-- Set baud rate -------------------------------------------------------*/
if (cfsetispeed(&options, SerialBaudInterp(BaudRate))==-1)
perror("On cfsetispeed:");
if (cfsetospeed(&options, SerialBaudInterp(BaudRate))==-1)
perror("On cfsetospeed:");
//Enable the receiver and set local mode...
options.c_cflag |= (CLOCAL | CREAD);
options.c_cflag &= ~PARENB; /* Parity disabled */
options.c_cflag &= ~CSTOPB;
options.c_cflag &= ~CSIZE; /* Mask the character size bits */
options.c_cflag |= SerialDataBitsInterp(8); /* CS8 - Selects 8 data bits */
options.c_cflag &= ~CRTSCTS; // disable hardware flow control
options.c_iflag &= ~(IXON | IXOFF | IXANY); // disable XON XOFF (for transmit and receive)
options.c_cflag |= CRTSCTS; /* enable hardware flow control */
options.c_cc[VMIN] = 0; //min carachters to be read
options.c_cc[VTIME] = 0; //Time to wait for data (tenths of seconds)
//Set the new options for the port...
tcflush(fd, TCIFLUSH);
if (tcsetattr(fd, TCSANOW, &options)==-1)
{
perror("On tcsetattr:");
}
PortOpen[ComPort] = fd;
}
return PortOpen[ComPort];
После инициализации порта я записываю в него некоторые вещи с помощью простой команды записи ...
int nc = write(hCom, txchar, n);
где hCom - дескриптор файла (и это нормально), и (как я уже сказал) это работает. Но ... когда я делаю чтение после этого, я получаю ошибку "Resource временно недоступен" из errno.
Я проверил select, чтобы увидеть, когда в дескрипторе файла что-то прочиталось ... но время ожидания истекло!
Я читаю данные так:
ret = read(hCom, rxchar, n);
и я всегда получаю EAGAIN, и я понятия не имею, почему.
Обновление:
HW работает нормально! Я вижу, что на последовательном порту есть входящие данные, потому что я сделал отладочный кабель для чтения того, что происходит на другом терминале. Итак ...
Я знаю, что должен делать неблокирующий. Мой вопрос ... почему ничего не читают! Та же настройка отлично работает на Windows, поэтому все оборудование работает нормально ...
Это сводит меня с ума! Я уверен, что это что-то простое, как ад! Я даже пытался избавиться от O_NONBLOCK, чтобы увидеть, когда я получу что-то ... но ничего ...