gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:13:55 25 4
gpt4 key购买 nike

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

问候,
大卫

最佳答案

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

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

关于serial-port - POSIX 串行编程,非标准波特率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3739778/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com