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

问题描述 投票:36回答:7

我想通过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_flagstruct termios必须与BOTHER (=CBAUDEX | B0)进行或运算。使用这种方法,可以直接在c_ispeedc_ospeedstruct termios成员中设置波特率。但是,我不知道如何在C程序中使用此方法。就像作者说的那样,当我包含BOTHER时,没有termios.h定义/不可用,那么应该怎样设置这种波特率呢?

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

linux serial-port baud-rate
7个回答
26
投票

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

19
投票

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

stty -F /dev/ttyX0 567890

6
投票

dougg3具有很多功能(我无法在此处发表评论)。您需要了解的主要附加信息是标头,它们彼此之间不冲突,但确实提供了正确的原型。答案是

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

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


1
投票

BOTHER在Linux上似乎可以从<asm/termios.h>获得。从那里拉定义将变得非常不可移植,但是我认为该API还是不可移植,因此可能不会造成太大损失。


0
投票

对于Mac用户(可能也对于某些Linux distributions

stty ospeed 999999

stty ispeed 999999

0
投票

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

因此,您使用open()打开设备并获取文件描述符,然后在tcgetattr()中使用它来填充termios结构。然后清除CBAUD并将CBAUDEX设置为c_cflagCBAUDEX具有与BOTHER相同的值。

设置此后,您可以使用cfsetspeed()等常规功能将自定义波特率指定为整数。


-1
投票

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

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

  1. 在程序启动期间设置波特率,奇偶校验,编码,流控制以及开始/结束序列长度。可以通过ioctl对串行设备或“ stty”命令进行设置。实际上,stty命令将ioctl用于该串行设备。
  2. 将数据写入串行设备,驱动程序将通过其8位数据总线将数据特征写入UART芯片。

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

© www.soinside.com 2019 - 2024. All rights reserved.