我希望通过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_ispeed
和c_ospeed
成员struct termios
中。但是,我不知道如何在我的C程序中使用此方法。就像作者所说,当我包含BOTHER
时,没有termios.h
定义/可用,那么应该采取什么方式来设置波特率呢?
如何在不更改内核的情况下将波特率设置为非标准值?
答案 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位端口作为控制和数据总线,因此您可以通过控制和数据总线写入该芯片来发出命令。
通常,应用程序在串行端口上执行以下步骤
简而言之,您只能在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_cflag
。
CBAUDEX
与BOTHER的值相同。
设置此值之后,您可以使用cfsetspeed()
之类的常规功能来设置自定义波特率,并将所需的波特率指定为整数。