39

我想通过我在 Linux 上的串行端口与具有未在termios.h.

我尝试了这篇文章中的“波特率别名”方法,但是当我执行我的 C 程序(我将其命名为“testprogram”)时,Linux 说"testprogram sets custom speed on ttyS0. This is deprecated."

我在 Google 上进行了一些搜索,似乎还有另一种(更新的?)方法可以将波特率更改为非标准值:在http://sourceware.org/ml/libc-help/2009-06 /msg00016.html作者说c_flagofstruct termios必须与BOTHER (=CBAUDEX | B0).

使用这种方法,波特率直接在 . 的c_ispeedc_ospeed- 成员中设置struct termios。但是,我不知道如何在我的 C 程序中使用这种方法。就像作者说的,当我包含时没有BOTHER定义/可用termios.h,那么应该怎么做才能以这种方式设置波特率呢?

如何在不更改内核的情况下将波特率设置为非标准值?

4

7 回答 7

28

我注意到关于 BOTHER 没有被定义的同样的事情。正如 Jamey Sharp 所说,您可以在<asm/termios.h>. 只是一个警告,我想我同时遇到了包括它和常规<termios.h>文件在内的问题。

除此之外,我发现我拥有的 glibc 仍然无法正常工作,因为 glibc 的 tcsetattr 正在为不注意速度设置的旧式 struct termios 版本执行 ioctl。我可以通过使用新样式 termios2 结构手动执行 ioctl 来设置自定义速度,该结构也应该可以通过包括<asm/termios.h>

struct termios2 tio;

ioctl(fd, TCGETS2, &tio);
tio.c_cflag &= ~CBAUD;
tio.c_cflag |= BOTHER;
tio.c_ispeed = 12345;
tio.c_ospeed = 12345;
ioctl(fd, TCSETS2, &tio);
于 2013-11-15T02:32:40.257 回答
20

stty您可以使用Linux 上的命令设置自定义波特率。例如,要在串行端口 /dev/ttyX0 上设置自定义波特率 567890,请使用以下命令:

stty -F /dev/ttyX0 567890
于 2012-12-11T11:33:31.213 回答
6

dougg3 几乎有这个(我不能在那里发表评论)。您需要了解的主要附加事项是不相互冲突但确实提供正确原型的标题。答案是

#include <stropts.h>
#include <asm/termios.h>

之后,您可以使用 dougg3 的代码,最好在 ioctl() 调用中进行错误检查。您可能需要将其放在一个单独的 .c 文件中,以用于使用普通 termios 设置其他参数的串行端口代码的其余部分。首先进行 POSIX 操作,然后设置自定义速度,在 Raspberry Pi 的内置 UART 上工作正常,以获得 250k 波特率。

于 2014-02-22T20:49:50.933 回答
1

BOTHER似乎可以<asm/termios.h>在 Linux 上使用。从那里提取定义将是非常不可移植的,但我认为这个 API 无论如何都是不可移植的,所以它可能没有什么大的损失。

于 2012-11-05T06:39:12.403 回答
0

对于 Mac 用户(可能也适用于某些Linux 发行版

stty ospeed 999999

stty ispeed 999999
于 2013-11-19T21:58:18.593 回答
0

您可以只使用普通的 termios 标头和普通的 termios 结构(使用标头 asm/termios 时与 termios2 相同)。

因此,您使用 open() 打开设备并获取文件描述符,然后使用它tcgetattr()来填充您的 termios 结构。

然后清除并 CBAUD设置CBAUDEX。与 BOTHER 具有相同的值。c_cflagCBAUDEX

设置后,您可以使用普通函数设置自定义波特率,例如cfsetspeed(),将所需的波特率指定为整数。

于 2020-02-04T10:38:41.677 回答
-2

主板的 CPU ( 16650 UART ) 上有一个串行 I/O 芯片。该芯片使用8位端口作为控制和数据总线,因此您可以通过控制和数据总线向该芯片写入命令来向它发出命令。

通常,应用程序在串行端口上执行以下步骤

  1. 在程序启动期间设置波特率、奇偶校验、编码、流控制和开始/结束序列长度。此设置可以通过 ioctl 到串行设备或“stty”命令来完成。事实上,stty 命令对那个串行设备使用 ioctl。
  2. 将数据字符写入串行设备,驱动程序将通过其 8 位数据总线将数据字符写入 UART 芯片。

简而言之,您可以只在 STTY 命令中指定波特率,然后将所有其他选项保持为默认值,并且足以连接到其他设备。

于 2012-12-14T06:56:56.767 回答