gpt4 book ai didi

c++ - 如何在 Linux 上将波特率设置为 307,200?

转载 作者:IT老高 更新时间:2023-10-28 23:10:28 27 4
gpt4 key购买 nike

基本上我使用下面的代码来设置串口的波特率:

struct termios options;
tcgetattr(fd, &options);
cfsetispeed(&options, B115200);
cfsetospeed(&options, B115200);
tcsetattr(fd, TCSANOW, &options);

这很好用。但是知道我必须与使用波特率 307,200 的设备通信。我该如何设置? cfsetispeed(&options, B307200); 不起作用,没有定义 B307200

我使用 MOXA Uport 1150(实际上是一个 USB 转串口转换器)和英特尔主板的标准串口进行了尝试。我不知道后者的确切类型,setserial 只是将其报告为 16550A。

最佳答案

Linux 对非标准波特率使用一种肮脏的方法,称为“波特率混叠”。基本上,您告诉串行驱动程序以不同的方式解释值 B38400。这由 serial_struct 成员 flags 中的 ASYNC_SPD_CUST 标志控制。

您需要手动计算自定义速度的除数,如下所示:

// Configure port to use custom speed instead of 38400
ioctl(port, TIOCGSERIAL, &ss);
ss.flags = (ss.flags & ~ASYNC_SPD_MASK) | ASYNC_SPD_CUST;
ss.custom_divisor = (ss.baud_base + (speed / 2)) / speed;
closestSpeed = ss.baud_base / ss.custom_divisor;

if (closestSpeed < speed * 98 / 100 || closestSpeed > speed * 102 / 100) {
fprintf(stderr, "Cannot set serial port speed to %d. Closest possible is %d\n", speed, closestSpeed));
}

ioctl(port, TIOCSSERIAL, &ss);

cfsetispeed(&tios, B38400);
cfsetospeed(&tios, B38400);

当然,您需要具有合适的 baud_base 和除数设置的串行驱动程序。前面的代码段允许 2% 的偏差,这对于大多数用途来说应该是可以的。

并告诉驱动程序将 B38400 再次解释为 38400 波特:

ioctl(mHandle, TIOCGSERIAL, &ss);
ss.flags &= ~ASYNC_SPD_MASK;
ioctl(mHandle, TIOCSSERIAL, &ss);

请注意:我不确定此方法是否可以在其他 *nix 风格之间移植。

关于c++ - 如何在 Linux 上将波特率设置为 307,200?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4968529/

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