在大部分讲解 Linux 编程书籍的时候会发现没有单独的串口编程章节,实际上串口编程已经被概括在了“终端”或者“终端IO”章节里面。在上一篇博客中对经常出现的几个容易混淆的概念进行简单描述:tty,串口,控制台与驱动程序。后面会在实际使用过程中对几种设备的原理与使用进行详解。
在系统下面通过执行 "ls /dev" 或者 "cat /proc/tty/drivers" 可以看到经常碰到的一些术语以及分类,如下所示:
对开发者而言,比较熟悉的有 console 控制台、tty 终端、ttyS serial串口设备、pty 伪终端等。由于 pty 成对使用,所以又细分为了主从两类。这些设备类对应的系统设备文件名参见第二列,可以输入 "ls /dev" 进行查看。
需要理清这些概念的关系就需要追溯早起计算机的使用历史,最初计算机成本高昂,通常需要连接多套键盘显示器供多人使用,因此就出现了这样一种专门连接计算机的设备,它只有显示器和键盘,外加简单处理电路。用户可以通过这套设备连接到计算机上(通常是通过串口连接),然后登录系统,并对计算机进行操作。这样一台只有输入、显示器件并能连接到计算机的设备就称为终端。tty 设备的名称是从过去的电传打字机(Teletype)缩写而来,也是最早出现的一种终端设备,因此现在在 Linux 系统中,就用 tty 来表示 “终端”。而 console 控制台,pty 伪终端等可以理解为虚拟 tty。总之,在 Unix 系统中 tty 就可以理解为连接到系统的物理或者虚拟终端。
“console”控制台用于用户和系统进行交互的设备,与终端作用类似。该虚拟 tty 与普通终端相比,多了一些功能:如显示系统内核消息,后台服务日志等。从硬件上看,控制台与终端等都是具备输入显示功能的设备,没有区别。实际上他们表达的意思相同。控制台与终端的区别体现在软件上,在启动 Linux 内核前传入的命令行参数 "console=..." 就是用来指定具体的控制台。控制台在 tty 驱动初始化之前就可以使用了,最开始被用来显示内核消息。我们在计算机或者嵌入式系统中经常会看到 "console = ttySAC0"、"console = ttyS1" 等语句,实际就是选取某个虚拟或者物理终端作为控制台与用户交互。
当 tty 驱动初始化结束,用户程序就可以通过 tty 驱动的接口来操作各类终端设备,包括控制台。而后面要介绍的应用程序操作接口也由此而来。
关于 Linux 串口编程的其他文章,可以移步至以下链接:
- 《Linux 串口编程<一> 一些背景》
- 《Linux 串口编程<二> 深入了解 termios》
- 《Linux 串口编程<三> 使用termios与API 进行串口程序开发》
- 《Linux 串口编程<四> 串口设备程序开发》
如果有想法或者疑问可以给我邮件或者评论,觉得有用就点赞吧~:-D