发布时间:2026-07-21阅读(1)
本小节我们来学习Linux下串口应用编程,串口(UART)是一种非常常见的外设,串口在嵌入式开发领域当中一般作为一种调试手段,通过串口输出调试打印信息,或者通过串口发送指令给主机端进行处理;当然除了作为基本的调试手段之外,还可以通过串口与其他设备或传感器进行通信,譬如有些sensor就使用了串口通信的方式与主机端进行数据交互。
本章将会讨论如下主题内容。
串口全称叫做串行接口,串行接口指的是数据一个一个的按顺序传输,通信线路简单。使用两条线即可实现双向通信,一条用于发送,一条用于接收。串口通信距离远,但是速度相对会低,串口是一种很常用的工业接口。
关于串口的基础知识以及通行原理、通行数据格式等之类的问题,笔者就不给大家介绍了,免得大家嫌啰嗦。串口(UART)在嵌入式Linux系统中常作为系统的标准输入、输出设备,系统运行过程产生的打印信息通过串口输出;同理,串口也作为系统的标准输入设备,用户通过串口与Linux系统进行交互。
所以串口在Linux系统就是一个终端,提到串口,就不得不引出“终端(Terminal)”这个概念了。
终端Terminal终端就是处理主机输入、输出的一套设备,它用来显示主机运算的输出,并且接受主机要求的输入。典型的终端包括显示器键盘套件,打印机打字机套件等。其实本质上也就一句话,能接受输入、能显示输出,这就够了,不管到了什么时代,终端始终扮演着人机交互的角色,所谓Terminal,即机器的边缘!
只要能提供给计算机输入和输出功能,它就是终端,而与其所在的位置无关。
终端的分类
以上列举的这些都是终端,前两类称之为物理终端;最后一个称之为伪终端。前两类都是在本地就直接关联了物理设备的,譬如显示器、鼠标键盘、串口等之类的,这种终端叫做物理终端,而第三类在本地则没有关联任何物理设备,注意,不要把物理网卡当成终端关联的物理设备,它们与终端并不直接相关,所以这类不直接关联物理设备的终端叫做伪终端。
终端对应的设备节点
在Linux当中,一切皆是文件。当然,终端也不例外,每一个终端在/dev目录下都有一个对应的设备节点。

图 27.1.1 本地终端设备节点

图 27.1.2 伪终端设备节点

图 27.1.3 串口终端对应的设备节点
这里为什么是0和2、而不是0和1?我们知道,I.MX6U SoC支持8个串口外设,分别是UART1~UART8;出厂系统只注册了2个串口外设,分别是UART1和UART3,所以对应这个数字就是0和2、而不是0和1,这里了解一下就行!
还需要注意的是,mxc这个名字不是一定的,这个名字的命名与驱动有关系(与硬件平台有关),如果你换一个硬件平台,那么它这个串口对应的设备节点就不一定是mxcX了;譬如ZYNQ平台,它的系统中串口对应的设备节点就是/dev/ttyPSX(X是一个数字编号),所以说这个名字它不是统一的,但是名字前缀都是以“tty”开头,以表明它是一个终端。
在Linux系统下,我们可以使用who命令来查看计算机系统当前连接了哪些终端(一个终端就表示有一个用户使用该计算机),如下所示:

图 27.1.4 查看系统连接了哪些终端
可以看到,开发板系统当前有两个终端连接到它,一个就是我们的串口终端,也就是开发板的USB调试串口(对应/dev/ttymxc0);另一个则是伪终端,这是笔者通过ssh连接的。
串口应用编程现在我们已经知道了串口在Linux系统中是一种终端设备,并且在我们的开发板上,其设备节点为/dev/ttymxc0(UART1)和/dev/ttymxc2(UART3)。
其实串口的应用编程也很简单,无非就是通过ioctl()对串口进行配置,调用read()读取串口的数据、调用write()向串口写入数据,是的,就是这么简单!但是我们不这么做,因为Linux为上层用户做了一层封装,将这些ioctl()操作封装成了一套标准的API,我们就直接使用这一套标准API编写自己的串口应用程序即可!
笔者把这一套接口称为termios API,这些API其实是C库函数,可以使用man手册查看到它们的帮助信息;这里需要注意的是,这一套接口并不是针对串口开发的,而是针对所有的终端设备,串口是一种终端设备,计算机系统本地连接的鼠标、键盘也是终端设备,通过ssh远程登录连接的伪终端也是终端设备。
要使用termios API,需要在我们的应用程序中包含termios.h头文件。
struct termios结构体对于终端来说,其应用编程内容无非包括两个方面的内容:配置和读写;对于配置来说,一个很重要的数据结构便是struct termios结构体,该数据结构描述了终端的配置信息,这些参数能够控制、影响终端的行为、特性,事实上,终端设备应用编程(串口应用编程)主要就是对这个结构体进行配置。
struct termios结构体定义如下:
示例代码 27.1.1 struct termios结构体struct termios{tcflag_t c_iflag; /* input mode flags */tcflag_t c_oflag; /* output mode flags */tcflag_t c_cflag; /* control mode flags */tcflag_t c_lflag; /* local mode flags */cc_t c_line; /* line discipline */cc_t c_cc[NCCS]; /* control characters */speed_t c_ispeed; /* input speed */speed_t c_ospeed; /* output speed */};
如上定义所示,影响终端的参数按照不同模式分为如下几类:
接下来,简单地给大家介绍下如何去配置这些参数、它们分别表示什么意思。
一、输入模式:c_iflag
输入模式控制输入数据(终端驱动程序从串口或键盘接收到的字符数据)在被传递给应用程序之前的处理方式。通过设置struct termios结构体中c_iflag成员的标志对它们进行控制。所有的标志都被定义为宏,除c_iflag成员外,c_oflag、c_cflag以及c_lflag成员也都采用这种方式进行配置。
可用于c_iflag成员的宏如下所示:
上一篇:护发素多久用一次?需要注意什么?
下一篇:如何注册qq号 怎样注册qq号
Copyright © 2024 有趣生活 All Rights Reserve吉ICP备19000289号-5 TXT地图HTML地图XML地图