如何在Linux上设置自定义波特率?

时间:2012-09-28 19:39:27

标签: linux serial-port baud-rate

我希望通过Linux上的串口与具有非标准波特率的设备进行通信,该设备未在termios.h中定义。

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

我在Google上进行了一些搜索,似乎还有另一种(更新的?)方法将波特率更改为非标准值:在http://sourceware.org/ml/libc-help/2009-06/msg00016.html上,作者说c_flag } struct termios必须与BOTHER (=CBAUDEX | B0)进行“或”运算。使用此方法,波特率直接设置在c_ispeedc_ospeed成员struct termios中。但是,我不知道如何在我的C程序中使用此方法。就像作者所说,当我包含BOTHER时,没有termios.h定义/可用,那么应该采取什么方式来设置波特率呢?

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

7 个答案:

答案 0 :(得分:21)

我注意到关于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);

答案 1 :(得分:16)

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

stty -F /dev/ttyX0 567890

答案 2 :(得分:3)

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

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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

  1. 在程序启动期间设置波特率,奇偶校验,编码,流量控制和开始/结束序列长度。此设置可以通过ioctl到串行设备或'stty'命令完成。实际上,stty命令使用ioctl来连接该串行设备。
  2. 将数据字符写入串行设备,驱动程序将通过8位数据总线将数据字符写入UART芯片。
  3. 简而言之,您只能在STTY命令中指定波特率,然后所有其他选项将保留为默认值,并且它应足以连接到ohter设备。

答案 5 :(得分:0)

对于Mac用户(可能还有一些Linux distributions

stty ospeed 999999

stty ispeed 999999

答案 6 :(得分:0)

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

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

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

设置此值之后,您可以使用cfsetspeed()之类的常规功能来设置自定义波特率,并将所需的波特率指定为整数。