![]() 点击上方蓝字关注我们 ![]() ![]() 14.1 QT下串口编程介绍14.1.1 串口协议介绍串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方式的扩展接口。串行接口 (SeriaInterface) 是指数据一位一位地顺序传送,其特点是通信线路简单,只要一对传输线就可以实现双向通信(可以直接利用电话线作为传输线),从而大大降低了成本,特别适用于远距离通信,但传送速度较慢。 串行接口 (SeriaInterface) 是指数据一位一位地顺序传送,其特点是通信线路简单,只要一对传输线就可以实现双向通信(可以直接利用电话线作为传输线),从而大大降低了成本,特别适用于远距离通信,但传送速度较慢。一条信息的各位数据被逐位按顺序传送的通讯方式称为串行通讯。串行通讯的特点是:数据位的传送,按位顺序进行,最少只需一根传输线即可完成;成本低但传送速度慢。串行通讯的距离可以从几米到几千米;根据信息的传送方向,串行通讯可以进一步分为单工、半双工和全双工三种。 RS-232 也称标准串口,最常用的一种串行通讯接口。 串口由于其简单和可靠,目前在像嵌入式系统,机器人等工业中依旧用得很多。 QtSerialPort模块是Qt5库的附加部分,为硬件和虚拟的串口提供了统一的接口。注意:该模块也增加了对Qt4的支持。使用QtSerialPort模块,开发者可以大大缩短开发串口相关的应用程序的周期。使用QtSerialPort模块最初是来源于第三方库QSerialDevice(2.0分支),现在QtSerialPort已经移到了https://codereview.qt-project.org/代码库上,后面的QT5版本都自带了QtSerialPort相关库。 14.1.2 功能介绍目前,该QT5模块API只包括两个类:QSerialPort 和QSerialPortInfo SerialPort是该模块的基础类,提供了一系列基础的方法和属性来访问串口资源。 SerialPortInfo是一个帮助类。它提供了系统上可用的串口的信息。 在QT工程中使用串口相关的类需要在pro文件中添加以下代码:
工程中包含相应的头文件
14.2 QSerialPortInfo帮助信息类介绍
QSerialPortInfo提供了有关现有串行端口的信息。 使用静态函数availablePorts()生成QSerialPortInfo对象列表。 列表中的每个QSerialPortInfo对象表示一个串行端口,可以查询端口名称,系统位置,说明和制造商。 QSerialPortInfo类也可以用作QSerialPort类的setPort()方法的输入参数。 其他的另请参阅QSerialPort。 14.2.1 构造函数与析构函数
14.2.2 判断串口com口的状态
如果当前串口COM口忙就返回真,否则返回假! 14.2.3 返回当前串口的名称
如果串口可用就返回串口的名称,否则返回空字符串! 14.2.4 返回当前串口的供应商16位编号
如果当前串口可用,就返回16位供应商编号,否则返回空! 14.2.5. 互换串口的信息
将另一个串口信息,整体赋值给当前串口! 14.2.6 返回当前串口的产品序列号
返回串口的16位产品编号,如果可用,否则返回0。 14.2.7 返回当前串口的产品序列号-字符串方式
如果串口可用,返回串口序列号的字符串,否则返回空字符串。 14.2.8 判断当前串口是否支持
支持返回假,否则返回真! 14.2.9 获取串口支持的波特率
示例:
14.2.10 获取当前系统支持的串口端口
示例:
14.3 QSerialPort串口类介绍14.3.1 QSerialPort功能使用介绍QSerialPort提供访问串行端口的功能。 你可以使用QSerialPortInfo帮助程序类获取有关可用串行端口的信息,该类允许枚举系统中的所有串行端口。这对于获取要使用的串行端口的正确名称很有用。可以将QSerialPortInfo帮助类的对象作为参数传递给setPort()或setPortName()方法以分配所需的串行设备。 设置端口后,可以使用open()方法以只读(r / o),只写(w / o)或读写(r / w)模式打开它。 注意:串行端口始终以独占访问方式打开(也就是说,其他进程或线程无法访问已打开的串行端口)。 成功打开后,QSerialPort尝试确定端口的当前配置并自行初始化。可以使用setBaudRate(),setDataBits(),setParity(),setStopBits()和setFlowControl()方法将端口重新配置为所需的设置。 有几个属性可用于引脚分配信号,即:QSerialPort :: dataTerminalReady,QSerialPort :: requestToSend。也可以使用pinoutSignals()方法查询当前引脚排列信号集。 一旦知道端口已准备好读取或写入,可以使用read()或write()方法。另外也可以调用readLine()和readAll()方便方法。如果不是所有的数据都被一次读取,其余的数据将与随后新传入数据一同被附加到QSerialPort的内部缓冲区。你可以使用setReadBufferSize()来限制读取缓冲区的大小。 串口使用完毕使用close()方法关闭端口并取消I / O操作。 看下面的例子:
如果waitForReadyRead()返回false,则表示连接已关闭或发生错误。 使用阻塞串行端口编程与使用非阻塞串行端口编程截然不同。 阻塞串行端口不需要事件循环,并且通常会导致代码更简单。 但是,在GUI应用程序中,阻塞串行端口只能用于非GUI线程,以避免卡住用户界面。 有关这些方法的更多详细信息,请参阅示例应用程序。 QSerialPort类也可以与QTextStream和QDataStream的流操作符(运算符<<()和operator >>())一起使用。 但是,需要注意的一个问题是:在尝试使用操作符>>()重载操作符进行读取之前,确保有足够的数据可用。 14.3.2 清除缓冲区根据给定方向的方向,丢弃输出或输入缓冲区的所有字符。这包括清除内部类缓冲和UART缓冲区。也终止等待读或写操作。如果成功,返回true,否则返回false。
|
void QSerialPort::close() |
booQSerialPort::open(OpenMode mode) |
qint64 QSerialPort::bytesAvailable() const |
booQSerialPort::atEnd() const |
// This slot is connected to QSerialPort::readyRead() void QSerialPortClass::readyReadSlot() { while (!port.atEnd()) { QByteArray data = port.read(100); .... } } |
void QSerialPort::setReadBufferSize(qint64 size) |
qint64 QSerialPort::readBufferSize() const |
QByteArray QIODevice::readAll() |
QByteArray rx_data; /*读取串口缓冲区所有的数据*/ rx_data=my_serialport->readAll(); |
qint32baudRate(Directions directions = AllDirections) const boolsetBaudRate(qint32 baudRate, Directions directions = AllDirections |
Parityparity() const boolsetParity(Parity parity) |
StopBitsstopBits() const boolsetStopBits(StopBits stopBits) |
DataBitsdataBits() const boolsetDataBits(DataBits dataBits) |
FlowControlflowControl() const boolsetFlowControl(FlowControflowControl) |
/*配置串口的信息*/ my_serialport->setPortName(Uart_name); //COM的名称 if(!(my_serialport->open(QIODevice::ReadWrite))) //打开的属性权限 { QMessageBox::warning(this, tr("-----串口错误信息-----"), tr("串口打开失败!\n重新选择COM口"), QMessageBox::Ok); return; } my_serialport->setBaudRate(Uart_Baud); //默认波特率 my_serialport->setDataBits(QSerialPort::Data8); //数据位 my_serialport->setParity(QSerialPort::NoParity);//奇偶校验 my_serialport->setStopBits(QSerialPort::OneStop);//停止位 my_serialport->setFlowControl(QSerialPort::NoFlowControl); //流控开关 |
Header: | #include <QSerialPort> |
qmake: | QT += serialport |
Since: | Qt 5.1 |
Inherits: | QIODevice |
[signal] void QIODevice::readyRead() |
[signal] void QIODevice::aboutToClose() |
void QIODevice::aboutToClose() |
void QIODevice::bytesWritten(qint64 bytes) |