|
Ubuntu: настройка последовательного порта на прием двойчных данных |
|
|
Добавил(а) microsin
|
|
В приложении столкнулся с тем, что пропускается прием специальных символов (\r, \n, \t). Вот такой вариант настройки для приема двоичных данных оказался ошибочным:
// Настройка последовательного порта static int setup_serial(const char* port, int baudrate) { int fd = open(port, O_RDWR | O_NOCTTY); if (fd < 0) { perror("Ошибка открытия порта"); return -1; }
struct termios options; tcgetattr(fd, &options); // Преобразование числовой скорости в константу termios speed_t speed; switch(baudrate) { case 9600: speed = B9600; break; case 19200: speed = B19200; break; case 38400: speed = B38400; break; case 57600: speed = B57600; break; case 115200: speed = B115200; break; case 230400: speed = B230400; break; case 460800: speed = B460800; break; case 921600: speed = B921600; break; default: fprintf(stderr, "Предупреждение: скорость %d нестандартная, пробуем...\n", baudrate); speed = baudrate; }
cfsetispeed(&options, speed); cfsetospeed(&options, speed);
options.c_cflag |= (CLOCAL | CREAD); options.c_cflag &= ~CSIZE; options.c_cflag |= CS8; options.c_cflag &= ~PARENB; options.c_cflag &= ~CSTOPB;
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); options.c_iflag &= ~(IXON | IXOFF | IXANY); options.c_oflag &= ~OPOST;
options.c_cc[VMIN] = 0; options.c_cc[VTIME] = 1;
tcsetattr(fd, TCSANOW, &options); tcflush(fd, TCIOFLUSH);
return fd;
}
Чтобы прием двоичных данных работал корректно, поля c_iflag, c_oflag и c_lflag нужно настроить следующим образом:
// ВСЕ преобразования символов должны быть отключены! options.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL | IXON); options.c_oflag &= ~OPOST; // Отключаем все выходные преобразования options.c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN);
[Ссылки]
1. FAQ программирования Linux: ввод/вывод терминала. |