前言
这一系列串口编程重点在应用层编程,但是在讲解原理与相关概念时需要对驱动框架有个基础的认识。如果只是浅尝辄止,以后在遇到串口驱动与应用层程序调试难免遇到瓶颈。关于 tty驱动架构参见我的其他博客:Linux tty驱动程序架构。有时了解下底层以及实现方式对于应用层编程的帮助也是大有裨益的。之前博客讲了终端,tty,控制台等概念以及区别,因此在串口编程相关章节中提及串口,有时也会用终端,tty等来替代,注意它们实际上所指是相同的。
在 Linux 中可以通过一组函数调用(通用终端接口,简称GTI)来控制终端,这组函数调用与用于读写数据的函数是分离的,这就使得读写数据的接口非常简洁,同时又允许可以对终端或串口的行为进行更精细地控制。但由于需要支持大量不同类型的硬件,GTI 中实现的 IO 接口却不简洁。
详解 termios
termios 是在 POSIX 规范中定义的标准接口,它类似与 System V 中的 termio 接口。通过设置 termios 类型的数据结构中的值和使用一小组函数调用,就可以对终端接口进行控制。termios 的结构体定义以及相关函数调用参见 termios.h 头文件。termios 结构的定义如下:
如定义所示,影响终端的参数按照不同模式分成如下几类:
- 输入模式
- 输出模式
- 控制模式
- 本地模式
- 线路规程
- 特殊控制字符
- 输入速率
- 输出速率
输入模式
输入模式控制输入数据(终端驱动程序从串行口或键盘接收到的字符)在被传递给程序之前的处理方式。通过设置 termios 结构中 c_iflag 成员的标志对它们进行控制。所有的标志都被定义为宏,这也是所有终端模式都采用的方法。可用于 c_iflag 成员的宏如下所示:
- BRKINT:当在输入行中检测到一个终止状态(连接丢失)时,产生一个中断。
- IGNBRK:忽略输入行中的终止状态。
- ICRNL:将接收到的回车符转换为新行符。
- IGNCR