Всем доброго времени суток.
Столкнулся с проблемой: нужна коммуникация через СОМ-порт.
Одна сторона всегда принимающая, другая - передающая. Ранее для передачи использовалось Win32-приложение. Реализовать получение данных в Linux получилось быстро. Все работало.
Попытался переписать передающую программу так же под Linux, но вместо нужных данных стала приходить всякая чушь. Похоже, что неправильно конфигурирую порт на выводе. Может кто что подскажет?
Работает все примерно по такой схеме:
Принимающая сторона:
-----------------------------------------------------------------
struct termios old_cfg;
struct termios new_cfg;
int fd = open(SERIAL_DEVICE, (O_RDWR | O_NOCTTY | O_NONBLOCK));
if (fd < 0)
return RES_ERR;
new_cfg.c_cflag = B115200 | CRTSCTS | CS8 | CLOCAL | CREAD;
new_cfg.c_iflag = IGNPAR;
new_cfg.c_oflag = 0;
new_cfg.c_lflag = 0;
new_cfg.c_cc[VTIME] = 0;
new_cfg.c_cc[VMIN] = 1;
tcgetattr(fd, &old_cfg);
tcflush(fd, TCIFLUSH);
tcsetattr(fd, TCSANOW, &new_cfg);
for ( ; ; )
{
char c;
if (read(fd, &c, 1) < 1)
continue;
if (c == 0xFF)
break;
printf("%c", c);
}
tcsetattr(fd, TCSANOW, &old_cfg);
close(fd);
-----------------------------------------------------------------
Передающая сторона:
-----------------------------------------------------------------
struct termios old_cfg;
struct termios new_cfg;
int fd = open(SERIAL_DEVICE, (O_RDWR | O_NOCTTY | O_NONBLOCK));
if (fd < 0)
return RES_ERR;
new_cfg.c_cflag = B115200 | CS8 | CLOCAL;
new_cfg.c_iflag = IGNPAR;
new_cfg.c_oflag = 0;
new_cfg.c_lflag = 0;
new_cfg.c_cc[VTIME] = 0;
new_cfg.c_cc[VMIN] = 1;
tcgetattr(fd, &old_cfg);
tcflush(fd, TCOFLUSH);
tcsetattr(fd, TCSANOW, &new_cfg);
write(fd, buffer, buf_size);
tcsetattr(fd, TCSANOW, &old_cfg);
close(fd);
-----------------------------------------------------------------