0

这是我一直在使用的用于与微控制器接口的串行程序的快速代码片段。该代码已经过验证可以工作,但我想添加全局定义以使代码更加模块化。显示的摘录有效,直到我将“cfsetispeed”中的“B1000000”替换为全局“BAUDRATE”。

// Globals
struct termios tty;
char BAUDRATE = B1000000;     // 1,000,000

// All of the other details omitted ( int main (), etc. )
cfsetospeed (&tty, BAUDRATE);
cfsetispeed (&tty, B1000000);

于是想到了两个问题:

1) 我读到 Termios 只允许选择波特率,列出的最大值是 230,400。1,000,000是怎么被允许的?

2) 为什么 cfsetispeed() 不允许全局字符定义作为参数?

4

1 回答 1

0
  1. Termios 接受波特率作为位标志,但termbits.h(内核 v5.3.11 的链接代码)中的 speed_t 结构还有其他可用的波特率,这些波特率未在 man7 页面或 linux.die.net 上列出,范围从 460800 到400万。

编辑:提供的上一个链接已失效,我设法在较新版本中找到了等效链接,因此这是摘录,以防它再次失效:

#define CBAUDEX 0010000
#define    BOTHER 0010000
#define    B57600 0010001
#define   B115200 0010002
#define   B230400 0010003
#define   B460800 0010004
#define   B500000 0010005
#define   B576000 0010006
#define   B921600 0010007
#define  B1000000 0010010
#define  B1152000 0010011
#define  B1500000 0010012
#define  B2000000 0010013
#define  B2500000 0010014
#define  B3000000 0010015
#define  B3500000 0010016
#define  B4000000 0010017
  1. cfsetispeed 接受波特率作为 speed_t 类型。speed_t 在 termbits.h 中被 typedef 为“unsigned int”类型的对象,它比您传入的字符大(32 位对 8 位)。
于 2015-08-24T00:02:01.197 回答