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

Re: Serial port programming

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

anonymous
()
Ответ на: Re: Serial port programming от anonymous

Re: Serial port programming

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

anonymous
()
Ответ на: Re: Serial port programming от anonymous

Re: Serial port programming

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

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