Последовательное программирование для POSIX, нестандартная скорость передачи - PullRequest
3 голосов
/ 18 сентября 2010

Я реализую простую программу в Unix, которая принимает входной сигнал RS232 и сохраняет его в файл.

Я использовал следующие ссылки: http://en.wikibooks.org/wiki/Serial_Programming/Serial_Linux и http://www.easysw.com/~mike/serial/serial.html

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>
#include <string.h>

int main(int argc,char** argv)
{
        struct termios tio;
        struct termios stdio;
        int tty_fd;
        fd_set rdset;
        FILE *file;

        unsigned char c;

        memset(&tio,0,sizeof(tio));
        tio.c_iflag=0;
        tio.c_oflag=0;
        tio.c_cflag=CS8|CREAD|CLOCAL;           // 8n1, see termios.h for more information
        tio.c_lflag=0;
        tio.c_cc[VMIN]=1;
        tio.c_cc[VTIME]=5;

        tty_fd=open("/dev/ttyS1", O_RDWR | O_NONBLOCK);      

        speed_t baudrate = 1843200; //termios.h: typedef unsigned long speed_t;
        cfsetospeed(&tio,baudrate);
        cfsetispeed(&tio,baudrate);

        tcsetattr(tty_fd,TCSANOW,&tio);

        file = fopen("out.raw", "wb");      

        while (1)
        {
                if (read(tty_fd,&c,1)>0) {
            fwrite(&c, 1, 1, file);
            fflush(file);
                }
        }

        //close(tty_fd);
}

Я пробовал на скорости 921'600 бит / с и 1'843'200 бит / с, и все работает правильно.Однако он не работает, если я установил нестандартную скорость передачи, например, 1 382 400 бит / с.

, т.е. это работает:

cfsetospeed(&tio,1843200); cfsetispeed(&tio,1843200);

, но это не't (он получает случайные данные):

cfsetospeed(&tio,1382400); cfsetispeed(&tio,1382400);

В чем может быть проблема?

Я пробовал с WinXP (с использованием функций WIN32 CreateFile, SetCommState и ReadFile)и работает правильно (с 1'843'200 бит / с, а также с нестандартным 1'382'400 бит / с)

пс: если вы спросите, почему мне нужно настроить этот нестандартный бодСкорость, это из-за специальной машины, которая работает только на этой скорости.

С уважением, Дэвид

1 Ответ

1 голос
/ 24 июля 2016

В соответствии с mans cfsetospeed принимает макросы, B0, B50, B75 и т. Д., Которые не равны фактическим значениям скорости передачи (B9600 равен 15, например).Таким образом, передача случайного целого числа приведет к неопределенному поведению.

cfsetospeed () устанавливает скорость передачи в бодах, сохраненную в структуре termios, на которую указывает termios_p, в значение speed, которое должно быть одной из следующих констант: B0, B50 иитак

...