linux 串口缓冲区(linux串口中断)

中标麒麟如何查询串口

目前,由于国产的中标麒麟操作系统有着高安全性,以及其功能、稳定性、效率方面都达到国外同类产品水平,部分指标还要优于国外同类产品,极大地降低了采购成本及维护成本等特点,中标麒麟操作系统逐步地应用到了部队、国家大型的建设项目、企事业单位中,如国家电网D5000项目等[1]。串口作为一种广泛应用的计算机接口,计算机对设备进行通信控制几乎都是通过串口进行的。在中标麒麟操作系统下进行串口调试与Windows不同,本文将介绍两种中标麒麟操作系统下的串口调试方法。

1串口编程

在任何操作系统下,串口调试程序的编写都是按照打开串口设备、初始化串口和串口读写操作的步骤进行[2]。

1.1打开串口

中标麒麟操作系统与Linux系统类似都是基于文件的,把硬件设备都看作文件,对硬件设备进行操作,就是对设备文件的操作[3]。串口设备的设备文件是用“/dev/ttyS0”、“/dev/ttyS1”来命名的,Windows下的“COM1”对应于中标麒麟下的“/dev/ttyS0”。打开串口只需要调用open()函数打开设备文件即可。

1.2初始化串口

串口的初始化设置包括波特率、数据位、奇偶校验位、停止位和流控制设置。对它们各自进行设置时都有多种选择,因此编程时一般采用switch()函数实现。

1.3串口读写操作

串口工作模式有阻塞方式和非阻塞方式两种。阻塞方式比较简单,当对串口进行操作时,如果条件不满足,操作会被阻塞,只有条件满足时操作才会进行;非阻塞方式是采用轮询对串口进行操作,编程时可以定义一个定时函数,通过定时实现对串口缓冲区的访问[2]。

2 minicom串口调试软件

2.1 minicom简介

minicom的功能与Windows系统下的超级终端类似,计算机可以利用此软件通过串口控制外部硬件设备。

2.2 minicom安装

中标麒麟操作系统最新发行版(NeoKylin3.2.1)的系统盘中集成有minicom的rpm安装包,因此只需要将系统盘插入电脑,打开终端,运行#yum list| grep minicom命令查看minicom的版本,然后采用#yum install命令安装。

2.3 minicom配置及使用

第一次运行minicom,为了保证minicom能正确地对CPU进行读写操作,需要对minicom的端口和波特率等进行配置[4]。

进入root输入#minicom-s命令,确定后会弹出minicom的配置界面如图1所示。

选择Serial port setup进入串口设置,如图2。根据实际要求设置好串口名、波特率、数据位、停止位、奇偶校验位和流控制等,然后按回车退出到配置界面。选择Save setup as dfl保存配置信息,再选择Exit退出配置界面回到minicom使用界面,然后就可以按照提示进行串行数据收发。

2.4 minicom控制VGA8×4矩阵切换器

VGA8×4是8输入4输出的矩阵切换器,它具有标准的RS-232串行通信接口,用户可以通过RS-232接口,进行计算机远端控制。其通信控制协议:波特率为9 600 b/s,数据位为8 bit,停止位1 bit,没有奇偶校验位和流控制位。控制命令格式为:设备号+输出端口号+控制符+输入端口号+!。其中“设备号”和“控制符”都是1个字符位,“输出端口号”和“输入端口号”都是2 bit数字,“!”是命令结束符。例如:设备号为A,以视频控制方式(控制符为“[”),第3路输入信号切换到第1路输出,其控制命令为“A01[03!”。如果控制成功,矩阵切换器前面板中由4个数码管组成的状态显示区会显示“0103”4个数字,它表示矩阵切换器当前的状态为第1路输出信号是由第3路输入的[5]。

利用minicom控制矩阵切换器以视频控制方式,第3路输入后由第2路输出的控制实验如图3所示。图3中上侧图显示minicom发送的控制名令为A02[03!,下侧图可以看出矩阵切换器前面板4个数码管显示0203,这说明控制实验成功。

3 Qt4编写串口调试程序

3.1 Qt简介

Qt是挪威的Trolltech公司开发的面向对象的C++图形用户界面程序开发框架。Qt以其作为一个跨平台框架而著称,它使用“一次编写,随处编译”的方式为开发包括Windows、Linux和Mac等多平台的应用软件提供方便,在中标麒麟操作系统下也可以用Qt编程。Qt拥有直观、强大的API,用户只要具备一定的C/C++基础,就能够快速地用Qt编写应用程序[6]。

NeoKylin3.2.1系统安装盘中集成有Qt4.6版本的rpm安装包,要想安装Qt只需将系统盘插入电脑,采用install命令就能把Qt4.6安装到自己的电脑中。

3.2 Qt串口编程

到目前为止,Qt的发行版本中还没有专门针对串口定义控制类,要用Qt编写串口调试程序,最简单的方法是使用第三方编写的Qextserialport类[7-8]。Qextserialport继承自Qt定义的对输入/输出设备操作的基类QIODevice。Qextserialport类中完整定义了包括打开串口、串口初始化设置和读写串口的一系列操作。使用Qextserialport类编写串口调试程序时,只需将串口操作相关的参数传递给它,就能完成相应的功能。因此,使用Qextserialport类编写串口调试程序时,只需要编写很少的代码就能实现串口调试的功能。

3.3 Qt4编写VGA8×4矩阵切换器控制程序

控制要求:矩阵切换器的第3路输出连接一个40英寸的大屏幕显示器,第1路至第4路输入分别连接4台计算机,要求编写控制程序,通过4个控制按钮实现大屏幕显示器可以选择显示4台计算机。

linux下如何运行可执行文件

1、打开kali linux的终端。创建一个文件并命名为dutest.c。在终端输入:touch test.c。

2、可以看到已经生成了一个后缀为test.c的源文件。然后用vim工具打开这个文件并编写代码。在终端中输入:vim test.c或者gvim test.c打开这个文件并编写代码。

3、编写完了这个代码。现在开始编译源文件。在终端中输入:gcc test.cgcc是linux自带的c语言编译器。如果是windows则要用ide工具来编译。linux系统一般写C语言用gcc+vim+gdb三个自带的工具就可以了。

4、打完gcc test.c编译完C源文件。然后就可以看见a.out的文件。一般linux系统就默认为a.out为编译完的文件。现在运行a.out文件。在a.out文件的目录下打开终端并输入./a.out就是运行文件了。

5、如果想要编译完的文件名不要用a.out文件。就可以在编译时打入.gcc test.c-o test.out然后就可以看见有一个test.out.文件了。-o后面跟着的编译生成的文件名。

6、再运行test.out在终端中输入./test.out结果如图。这样在linux系统下编译并运行C语言就完成了。

如何在QT中读取串口数据

一、文件下载

文件下载地址:

也可以下载我上传到网盘上的:

二、文件内容介绍

1.下载到的文件为qextserialport-1.2win-alpha,解压并打开后其内容如下。

(点击图片可以查看清晰大图)

下面分别介绍:

(1)doc文件夹中的文件内容是QextSerialPort类和QextBaseType的简单的说明,我们可以使用记事本程序将它们打开。

(2)examples文件夹中是几个例子程序,可以看一下它的源码,不过想运行它们好像会出很多问题啊。

(3)html文件夹中是QextSerialPort类的使用文档。

(4)然后就是剩下的几个文件了。其中qextserialenumerator.cpp及qextserialenumerator.h文件中定

义的QextSerialEnumerator类是用来获取平台上可用的串口信息的。不过,这个类好像并不怎么好用,而且它不是我们关注的重点,所以下面

就不再介绍它了。

(5)qextserialbase.cpp和qextserialbase.h文件定义了一个QextSerialBase

类,win_qextserialport.cpp和win_qextserialport.h文件定义了一个Win_QextSerialPort

类,posix_qextserialport.cpp和posix_qextserialport.h文件定义了一个

Posix_QextSerialPort类,qextserialport.cpp和qextserialport.h文件定义了一个

QextSerialPort类。这个QextSerialPort类就是我们上面所说的那个,它是所有这些类的子类,是最高的抽象,它屏蔽了平台特征,

使得在任何平台上都可以使用它。

2.几个类的简单介绍。

下面是这几个类的关系图。

可以看到它们都继承自QIODevice类,所以该类的一些函数我们也可以直接来使用。图中还有一个QextBaseType类,其实它只是一个标

识,没有具体的内容,它用来表示Win_QextSerialPort或Posix_QextSerialPort

中的一个类,因为在QextSerialPort类中使用了条件编译,所以QextSerialPort类既可以继承自

Win_QextSerialPort类,也可以继承自Posix_QextSerialPort类,所以使用了QextBaseType来表示。这一点

我们可以在qextserialport.h文件中看到。再说QextSerialPort类,其实它只是为了方便程序的跨平台编译,使用它可以在不同的

平台上,根据不同的条件编译继承不同的类。所以它只是一个抽象,提供了几个构造函数而已,并没有具体的内容。在qextserialport.h文件中的

条件编译内容如下:

#ifdef_TTY_POSIX_

#include“posix_qextserialport.h”

#define QextBaseTypePosix_QextSerialPort

#else

#include“win_qextserialport.h”

#define QextBaseTypeWin_QextSerialPort

#endif

所以,其实我们没有必要使用这个类,直接使用Win_QextSerialPort或Posix_QextSerialPort就可以了。当然如果

你想使用这个类,实现同样的源程序可以直接在Windows和Linux下编译运行,那么一定要注意在Linux下这里需要添加

#define _TTY_POSIX_。而我们这里为了使得程序更明了,所以没有使用该类,下面也就不再介绍它了。

QextSerialBase类继承自QIODevice类,它提供了操作串口所必需的一些变量和函数等,而

Win_QextSerialPort和Posix_QextSerialPort均继承自QextSerialBase

类,Win_QextSerialPort类添加了Windows平台下操作串口的一些功能,Posix_QextSerialPort类添加了

Linux平台下操作串口的一些功能。所以说,在Windows下我们使用Win_QextSerialPort类,在Linux下我们使用

Posix_QextSerialPort类。

3.在QextSerialBase类中还涉及到了一个枚举变量QueryMode。

它有两个值Polling和EventDriven

。QueryMode指的是读取串口的方式,下面我们称为查询模式,我们将Polling称为查询方式Polling,将EventDriven称为事件驱动方式。

事件驱动方式EventDriven就是使用事件处理串口的读取,一旦有数据到来,就会发出readyRead()信号,我们可以关联该信号来读取串口的数据。在事件驱动的方式下,串口的读写是异步的,调用读写函数会立即返回,它们不会冻结调用线程。

而查询方式Polling则不同,读写函数是同步执行的,信号不能工作在这种模式下,而且有些功能也无法实现。但是这种模式下的开销较小。我们需要自己建立定时器来读取串口的数据。

在Windows下支持以上两种模式,而在Linux下只支持Polling模式。

三、小结。

这里讲了这么多,最后要说的只是,我们在Qt中使用这个类编写串口程序,根据平台的不同只需要分别使用四个文件。

阅读剩余
THE END