Последовательное программирование - Termios.Застревание при чтении 0x00 байт с устройства - PullRequest
0 голосов
/ 12 марта 2019

Я использую termios API для чтения / записи на устройство, настроенное в последовательном интерфейсе. Я использую следующий код:

// Open serial interface
const char *device = "/dev/ttyS0";
int fd = open(device, O_RDWR | O_NOCTTY | O_NONBLOCK);
if (fd == -1)
  printf( "failed to open port\n" );

fcntl(fd, F_SETFL, 0);

// Get current configuration of serial interface
struct termios config;
tcgetattr(fd, &config);

// Set configuration of device
...
...
//

// Apply configuration to descriptor
tcflush(fd, TCIFLUSH);
tcsetattr(fd, TCSANOW, &config);

// Send order to device
unsigned char order[2];
int res;
unsigned char m = 0x00;
unsigned char s = 0x00;

order[0] = 0xc1; // Byte 193
order[1] = m;

res = write(fd, &order[0], 2);
if (res != 2)
  return -1;

res = read(fd, &s, 1);
if ((res != 1) || (res == -1))
  return -1;

Последовательный порт открывается правильно, и устройство также правильно настроено. Если я распечатываю конфигурацию (config) в GDB, я получаю следующее:

{c_iflag = 8240, c_oflag = 0, c_cflag = 3251, c_lflag = 0, c_cc = «\ 003 \ 034 \ 177 \ 025 \ 004 \ 000 \ 000 \ 000 \ 021 \ 023 \ 032 \ 000 \ 000 \ 000 \ 000 \ 026 \ 001 \ 000 \ 000 \ 000 \ 033 [\ 000 \ 000 \ 000 \ 000 \ 000 \ 000DCAB @ P \ 000 \ 000HY \ 000" , зарезервировано = {0, 0, 1552337580}, c_ispeed = 9600, c_ospeed = 9600}

Тогда я могу использовать функцию записи для отправки заказов на устройство, но я не могу использовать функцию чтения. Код застревает после запуска строки res = read(fd, &s, 1);, и я не получаю ответа (см. Ниже). Любой намек?

enter image description here

EDIT:

Блок // Set configuration of device выглядит следующим образом:

cfsetispeed(&config, B9600);
cfsetospeed(&config, B9600);

config.c_cflag &= ~CSIZE;
config.c_cflag |= CS8;    

config.c_cflag &= ~CSTOPB;
config.c_cflag |= 0;

config.c_cflag &= ~PARENB;
config.c_cflag &= ~PARODD;
config.c_cflag |= (0 | 0);

config.c_cflag |= (CLOCAL | CREAD);
config.c_iflag |= (INPCK | ISTRIP);

config.c_oflag = 0;
config.c_lflag = 0;

config.c_cc[VMIN]=1;
config.c_cc[VTIME]=0;

1 Ответ

0 голосов
/ 13 марта 2019

Хотя O_NONBLOCK был добавлен во время открытия, fcntl(fd, F_SETFL, 0) был вызван ниже, что эквивалентно режиму блокировки.

fd = open(device, O_RDWR | O_NOCTTY | O_NONBLOCK);
fcntl(fd, F_SETFL, 0);   // The O_NONBLOCK flag is overwritten

Если на последовательном порту нет данных, он будет заблокирован.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...