LINUX.ORG.RU

Работа с Com портом.


0

0

Всем привет!!! Мой 3-ий день работы с сом портом уже выбивает меня из себя.Пробовал порыскать инфу по нету, но всё напрасно. Проблема вот в чем. На 1-й сом с внешнего устройства приходит сигнал(1 байт), который я должен просто прочесть. Кому не лень посмотрите пожалуйста инициализацию моего порта, может там че не так.

{ int fd; struct termios options;

/* открытие порта */ fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY); if (fd == -1) cout<<"Unable to open COM-1 port"<<endl; fcntl(fd, F_SETFL, FNDELAY); cfsetiospeed(&options, B9600); options.c_cflag &= CS8; options.c_cflag &= CREAD; tcsetattr(fd, TCSANOW, &options); }

Затем в цикле проверяю было ли прочитано хоть какое-то количество байт с помошью функции read: { int cbyte = 0; char Buf[256]; while(!(cbyte = read(fd,&Buf,1))) cout<<cbyte<<endl; }

Заранее огромное спасибо!


Ответ на: комментарий от Sad

CS8 -- двухбитовый флаг. Операция &= все остальные биты c_cflag заведомо гасит. Потом приходит CREAD -- другой однобитовый флаг... В итоге -- 0. Явно не то, что планировалось.

Если нужны ровна эти два флага, то

c_cflag = CREAD | CS8;

без фокусов (хотя CLOCAL в вашем случае тоже будет полезно).

vnp
()

cfmakeraw может спасти.


У меня так:

    struct termios t;
    int speed = B9600;
    
    tcgetattr(dev_out, &t);
    tcflush(dev_out, TCIOFLUSH);
    
    cfsetospeed(&t, speed);
    cfsetispeed(&t, speed);
    
    cfmakeraw(&t);
    
    t.c_cflag &= ~CSTOPB;  /* one stop bit */
    t.c_cflag |= PARENB;   /* enable parity */
    t.c_cflag &= ~PARODD;  /* do even parity */
    t.c_iflag &= ~IGNPAR;  /* don't ignore parity errors */
    t.c_cflag |=CLOCAL;

    tcsetattr(dev_out, TCSANOW, &t);
    tcflush(dev_out, TCIFLUSH);

yuriy123
()

Естественно скорость/четность/стопы разбавить по вкусу железа

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