Программирование PC Ubuntu: настройка последовательного порта на прием двойчных данных Wed, March 04 2026  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.


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: ввод/вывод терминала.

 

Добавить комментарий


Защитный код
Обновить

Top of Page