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

发布于 2024-09-19 12:22:10 字数 2005 浏览 7 评论 0原文

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

我使用过这些参考资料: http://en.wikibooks.org/wiki/Serial_Programming/Serial_Linuxhttp://www.easysw.com/~mike/serial/serial.html< /a>

#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:如果你问为什么我需要设置这个非标准波特率,那是因为仅在此速度下工作的特殊机器。

问候, 大卫

I am implementing a simple program in unix that takes a RS232 input and saves it into a file.

I've used these references:
http://en.wikibooks.org/wiki/Serial_Programming/Serial_Linux and
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);
}

I've tried at 921'600 bps and at 1'843'200 bps, and it works correctly.
However, it does not work if I set-up a non-standard baud rate, for instance 1'382'400 bps.

i.e., this works:

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

but this doesn't (it gets random data):

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

What can be the problem?

I've tried with WinXP (using the WIN32 functions CreateFile, SetCommState and ReadFile),
and it works correctly (with 1'843'200 bps and also with the non-standard 1'382'400 bps)

ps: if you ask why I need to set-up this non-standard baud-rate, it's because of a special machine that works only at this speed.

Regards,
David

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

两仪 2024-09-26 12:22:11

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

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

According to mans cfsetospeed accepts macros, B0, B50 , B75 and so on which are not equal to actual baudrate values (B9600 is equal to 15 e.g.). So passing random integer will cause undefined behaviour.

cfsetospeed() sets the output baud rate stored in the termios
structure pointed to by termios_p to speed, which must be one of
these constants: B0, B50 and so on

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文