有趣生活

当前位置:首页>科技>正点原子linux使用教程交流正点原子I.MX6U嵌入式Linux

正点原子linux使用教程交流正点原子I.MX6U嵌入式Linux

发布时间:2026-07-21阅读(1)

导读串口应用编程本小节我们来学习Linux下串口应用编程,串口(UART)是一种非常常见的外设,串口在嵌入式开发领域当中一般作为一种调试手段,通过串口输出调试打....串口应用编程

本小节我们来学习Linux下串口应用编程,串口(UART)是一种非常常见的外设,串口在嵌入式开发领域当中一般作为一种调试手段,通过串口输出调试打印信息,或者通过串口发送指令给主机端进行处理;当然除了作为基本的调试手段之外,还可以通过串口与其他设备或传感器进行通信,譬如有些sensor就使用了串口通信的方式与主机端进行数据交互。

本章将会讨论如下主题内容。

  • 串口应用编程介绍
  • 应用编程实战
串口应用编程介绍

串口全称叫做串行接口,串行接口指的是数据一个一个的按顺序传输,通信线路简单。使用两条线即可实现双向通信,一条用于发送,一条用于接收。串口通信距离远,但是速度相对会低,串口是一种很常用的工业接口。

关于串口的基础知识以及通行原理、通行数据格式等之类的问题,笔者就不给大家介绍了,免得大家嫌啰嗦。串口(UART)在嵌入式Linux系统中常作为系统的标准输入、输出设备,系统运行过程产生的打印信息通过串口输出;同理,串口也作为系统的标准输入设备,用户通过串口与Linux系统进行交互。

所以串口在Linux系统就是一个终端,提到串口,就不得不引出“终端(Terminal)”这个概念了。

终端Terminal

终端就是处理主机输入、输出的一套设备,它用来显示主机运算的输出,并且接受主机要求的输入。典型的终端包括显示器键盘套件,打印机打字机套件等。其实本质上也就一句话,能接受输入、能显示输出,这就够了,不管到了什么时代,终端始终扮演着人机交互的角色,所谓Terminal,即机器的边缘!

只要能提供给计算机输入和输出功能,它就是终端,而与其所在的位置无关。

终端的分类

  • 本地终端:例如对于我们的个人PC机来说,PC机连接了显示器、键盘以及鼠标等设备,这样的一个显示器/键盘组合就是一个本地终端;同样对于开发板来说也是如此,开发板也可以连接一个LCD显示器、键盘和鼠标等,同样可以构成本地终端。
  • 用串口连接的远程终端:对于嵌入式Linux开发来说,这是最常见的终端—串口终端。譬如我们的开发板通过串口线连接到一个带有显示器和键盘的PC机,在PC机通过运行一个终端模拟程序,譬如Windows超级终端、putty、MobaXterm、SecureCRT等来获取并显示开发板通过串口发出的数据、同样还可以通过这些终端模拟程序将用户数据通过串口发送给开发板Linux系统,系统接收到数据之后便会进行相应的处理、譬如执行某个命令,这就是一种人机交互!
  • 基于网络的远程终端:譬如我们可以通过ssh、Telnet这些协议登录到一个远程主机。

以上列举的这些都是终端,前两类称之为物理终端;最后一个称之为伪终端。前两类都是在本地就直接关联了物理设备的,譬如显示器、鼠标键盘、串口等之类的,这种终端叫做物理终端,而第三类在本地则没有关联任何物理设备,注意,不要把物理网卡当成终端关联的物理设备,它们与终端并不直接相关,所以这类不直接关联物理设备的终端叫做伪终端。

终端对应的设备节点

在Linux当中,一切皆是文件。当然,终端也不例外,每一个终端在/dev目录下都有一个对应的设备节点。

  • /dev/ttyX(X是一个数字编号,譬如0、1、2、3等)设备节点:ttyX(teletype的简称)是最令人熟悉的了,在Linux中,/dev/ttyX代表的都是上述提到的本地终端,包括/dev/tty1~/dev/tty63一共63个本地终端,也就是连接到本机的键盘显示器可以操作的终端。事实上,这是Linux内核在初始化时所生成的63个本地终端。如下所示:

图 27.1.1 本地终端设备节点

  • /dev/pts/X(X是一个数字编号,譬如0、1、2、3等)设备节点:这类设备节点是伪终端对应的设备节点,也就是说,伪终端对应的设备节点都在/dev/pts目录下、以数字编号命令。譬如我们通过ssh或Telnet这些远程登录协议登录到开发板主机,那么开发板Linux系统会在/dev/pts目录下生成一个设备节点,这个设备节点便对应伪终端,如下所示:

图 27.1.2 伪终端设备节点

  • 串口终端设备节点/dev/ttymxcX:对于ALPHA/Mini I.MX6U开发板来说,有两个串口,也就是有两个串口终端,对应两个设备节点,如下所示:

图 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成员的宏如下所示:

TAGS标签:  正点  原子  linux  使用  教程  正点原子linux使

Copyright © 2024 有趣生活 All Rights Reserve吉ICP备19000289号-5 TXT地图HTML地图XML地图