LINUX.ORG.RU

Serial port programming


0

0

Всем доброго времени суток.
Столкнулся с проблемой: нужна коммуникация через СОМ-порт.

Одна сторона всегда принимающая, другая - передающая. Ранее для передачи использовалось 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);
-----------------------------------------------------------------

anonymous

Попробуй не делать сам структуру temios, а модифицировать существующую:
---------------------------------------------
tcgetattr(fd, &old_cfg); 
new_cfg = old_cfg;
new_cfg.c_cflag &= (B115200 | CS8 | CLOCAL); 
// другие параметры
tcsetattr(fd, TCSANOW, &new_cfg); 
---------------------------------------------

anonymous
()
Ответ на: комментарий от anonymous

Спасибо, но не помогло :) Я уже столько вариантов перепробовал, но ни с одним ничего похожего на правду пока не получилось.

anonymous
()
Ответ на: комментарий от anonymous

Так у вас в c_cflag разные настройки протокола обмена!

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.