POSIX的串行编程,非标准波特率

时间:2010-09-17 23:46:50

标签: serial-port posix baud-rate

我正在unix中实现一个简单的程序,它接受RS232输入并将其保存到文件中。

我使用过这些参考资料: http://en.wikibooks.org/wiki/Serial_Programming/Serial_Linuxhttp://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 bps和1'843'200 bps,它运行正常。 但是,如果我设置非标准波特率,例如1'382'400 bps,它就不起作用。

即,这有效:

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

但这不是(它获得随机数据):

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

可能是什么问题?

我尝试过使用WinXP(使用WIN32函数CreateFile,SetCommState和ReadFile), 它工作正常(1'843'200 bps,非标准1'382'400 bps)

ps:如果你问为什么我需要设置这个非标准的波特率,那是因为一台特殊的机器只能以这个速度工作。

此致 大卫

1 个答案:

答案 0 :(得分:1)

根据人们的说法,cfsetospeed接受宏,B0,B50,B75等,它们不等于实际波特率值(例如,B9600等于15)。因此传递随机整数将导致未定义的行为。

  

cfsetospeed()设置存储在termios中的输出波特率   termios_p指向速度的结构,必须是其中之一   这些常数:B0,B50等