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

Serial port POSIX串行编程,非标准波特率,serial-port,posix,baud-rate,Serial Port,Posix,Baud Rate,我正在unix中实现一个简单的程序,它接受RS232输入并将其保存到文件中 我使用了以下参考资料: 和 但这并没有(它得到随机数据): 有什么问题吗 我试过使用WinXP(使用WIN32函数CreateFile、SetCommState和ReadFile), 它工作正常(1'843'200 bps和非标准1'382'400 bps) ps:如果你问我为什么要设置这个非标准波特率,那是因为一台特殊的机器只能以这个速度工作 问候,, David根据mans的cfsetospeed接受宏、B0、B

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

我使用了以下参考资料: 和

但这并没有(它得到随机数据):


有什么问题吗

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

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

问候,,
David

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

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


对cfset[io]speed的调用是否成功返回?这可能是一个驱动程序的限制,您可能会遇到一些内核攻击。您没有指定您正在开发的Unix的风格,但我查看了Linux 2.6.32源代码,它肯定是针对标准波特率进行硬编码的,显然是为了在传递的结构上保存一些位。不幸的是,我想大多数的POSIXE都是相似的。但是,与其他设备驱动程序相比,串行驱动程序相对容易编写/修改。我在这里读过一些关于自定义除数设置为波特率/新波特率的文章。然而,这个图书馆似乎很旧。你好,卡尔。您提到您查看了Linux2.6.32源代码,发现它是硬编码的。你在哪里找到的?我没有加载linux源代码,在代码中执行“grep-I-rcfsetospeed*”,我没有找到任何东西(只找到了一个不相关的东西arch/um/drivers/slip_user.c)。您在哪里找到了cfsetospeed的实现?谢谢,David。@DavidPortabella cfsetospeed是用户空间的一部分,您无法直接在内核中找到它。但是看看内核,例如drivers/tty/tty_ioctl.c,其中标准波特率是硬编码的。还有一个也可以。
#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);
}
cfsetospeed(&tio,1843200); cfsetispeed(&tio,1843200);
cfsetospeed(&tio,1382400); cfsetispeed(&tio,1382400);