在 termios 结构体以及内部终端控制标志中,并非所有的参数对于实际的物理串口都是有效的,在使用过程中也不需要对于所有标志的作用都有所理解。事实上,快速掌握一项技术的核心点也是一种学习能力。对于使用,熟悉并掌握操作框架十分有用。对于串口编程,核心步骤也十分鲜明,下面首先介绍 termios 相关的 API 函数。
核心配置函数
1. int tcgetattr(int fd, struct termios *termios_p);
函数功能:获取当前终端接口配置并将配置写入参数 termios_p 指向的 termios 结构体。一般操作时将配置保存为 old_termios,可以在需要时通过 tcsetattr 函数对终端接口进行重新配置。
2. int tcsetattr(int fd, int actions, const struct termios *termios_p);
函数功能:使用 termios_p 指向的 termios 结构体对终端接口进行配置,参数 actions 控制修改方式,共有3种修改方式,如下所示:
- TCSANOW:立刻对配置进行修改。
- TCSADRAIN:等当前输出完成后再对配置进行修改。
- TCSAFLUSH:等当前输出完成后再对配置进行修改,但丢弃还未从 read 调用返回的当前可用的任何输入。
终端速度函数
1.speed_t cfgetispeed(const struct termios *);
函数功能:获取终端读取速度。
2.speed_t cfgetospeed(const struct termios *);
函数功能:获取终端输出速度。
3.int cfsetispeed(const struct termios *, speed_t speed);
函数功能:设置终端读取速度。
4.int cfgetispeed(const struct termios *, speed_t speed);
函数功能:设置终端输出速度。
Note:输入与输出速度是分开控制的;根据函数形参,这些函数只作用于 termios 结构,而不是直接作用于设备。因此如果要设置速度,就要首先使用 tcgetattr 获取当前终端配置,然后使用上述函数设置速度,最后使用 tcsetattr 将 termios 配置写入设备。此外,还要注意系统支持的波特率范围,通过查看 termios.h 可以获取到。
其他控制函数
1.int tcdrain(int fd);
函数功能:让调用程序一直等待,直到所有排队的输出都已发送完毕。
2.int tcflow(int fd, int flowtype);
函数功能:用于暂停或重新开始输出。
3.int tcflush(int fd, int in_out_selector);
函数功能:用于清空输入、输出或者两者同时清空。
Note:如果串口程序发生阻塞,检查程序中是否调用了上述 API。在打开终端或者串口设备之前,对应的输入或者待输出数据缓存在驱动程序中,因此要根据实际需求选择是否调用 tcflush 清空相应缓冲区数据。关于终端串口 API 函数的讲解本篇就到这里,在实际应用开发中必须明确程序中配置的标志位和函数的作用,在不确定作用的情况下最好保持默认设置。
关于 Linux 串口编程的其他文章,可以移步至以下链接:
- 《Linux 串口编程<一> 一些背景》
- 《Linux 串口编程<二> 深入了解 termios》
- 《Linux 串口编程<三> 使用termios与API 进行串口程序开发》
- 《Linux 串口编程<四> 串口设备程序开发》
有想法或者疑问可以给我邮件或者评论,觉得本文对你有帮助就点赞吧~:-D