函数cfsetospeed
和cfsetispeed
采用波特率类型speed_t
:
int cfsetispeed(struct termios *termios_p, speed_t speed);
int cfsetospeed(struct termios *termios_p, speed_t speed);
类型
speed_t
基本上是一个整数,但强制转换不是解决方案,这可以从 termios.h
中的波特率定义中看出。#define B0 0x00000000
#define B50 0x00000001
#define B75 0x00000002
// ...
#define B9600 0x0000000d
#define B19200 0x0000000e
#define B38400 0x0000000f
当我处理用户输入(例如来自文件的输入)时,我会将字符串“9600”转换为整数9600,然后转换为B9600。我基本上正在寻找一种通用的方法来进行以下转换:
// 0 -> B0
// 50 -> B50
// 75 -> B75
// ...
// 9600 -> B9600
// 19200 -> B19200
// 38400 -> B38400
一种将int
(例如9600)转换为speed_t
(例如B9600)的方法是使用switch-case结构。是否有更好的方法来实现这个目标?
speed_t baudrate(int br) { ... }
中,然后使用cfsetispeed(term, baudrate(19200));
或类似的代码,你的代码看起来相当优雅。 - Ctxint
来保存波特率的值,除非你确定你的代码将在所有平台上运行时都有足够大的int
。此外,波特率不能为负数。更好的选择是uint_fast32_t
、uint_least32_t
、unsigned long
或uint32_t
(当你确定这种类型存在时,几乎到处都是这种情况)。 - 12431234123412341234123