Qt 串口类QSerialPort

16 篇文章 1 订阅

Qt 串口类QSerialPort 使用笔记

Qt5.1 中提供了QtSerialPort模块,方便编程人员快速的开发应用串口的应用程序。 本文就简单的讲讲QtSerialPort模块的使用。

当前的QtSerialPort模块中提供了两个C++类,分别是QSerialPort 和QSerialPortInfo。
QSerialPort 类提供了操作串口的各种接口。
QSerialPortInfo 是一个辅助类,可以提供计算机中可用串口的各种信息。
使用方法
先介绍 QSerialPortInfo 的使用。下面是一个简单的例子,用来列举出电脑上全部的串口设备。
首先,需要在pro文件中增加如下内容:
QT += serialport

Cpp 文件如下:

[cpp] view plain copy

1.	#include <QCoreApplication>  
2.	#include <QDebug>  
3.	   
4.	#include <QSerialPort>  
5.	#include <QSerialPortInfo>  
6.	   
7.	int main(int argc, char *argv[])  
8.	{  
9.	    QCoreApplication a(argc, argv);  
10.	    foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())  
11.	    {  
12.	        qDebug() << "Name : " << info.portName();  
13.	        qDebug() << "Description : " << info.description();  
14.	        qDebug() << "Manufacturer: " << info.manufacturer();  
15.	        qDebug() << "Serial Number: " << info.serialNumber();  
16.	        qDebug() << "System Location: " << info.systemLocation();  
17.	    }  
18.	    return a.exec();  
19.	}  

在我的电脑上显示的结果如下:
[plain] view plain copy

  1. Name : “COM1”
  2. Description : “通信端口”
  3. Manufacturer: “(标准端口类型)”
  4. Serial Number: “”
  5. System Location: “\.\COM1”
  6. Name : “COM5”
  7. Description : “USB Serial Port”
  8. Manufacturer: “FTDI”
  9. Serial Number: “A400G3UXA”
  10. System Location: “\.\COM5”
    通常,我们需要指定程序使用某一个确定的串口,这时不能只使用串口名称,因为USB串口每次插在不同的USB口上时获得的串口名称都可能有变化。这时可以利用串口的序列号,这个号码一般来说是唯一的,比如下面的代码,首先遍历所有的串口,找到我们需要的串口后就返回。
    [cpp] view plain copy
1.	#include <QCoreApplication>  
2.	#include <QDebug>  
3.	#include <QSerialPort>  
4.	#include <QSerialPortInfo>  
5.	  
6.	int main(int argc, char *argv[])  
7.	{  
8.	    QCoreApplication a(argc, argv);  
9.	    QSerialPortInfo com_info;  
10.	    foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())  
11.	    {  
12.	        if( info.serialNumber() == "A400G3UXA" )  
13.	        {  
14.	            com_info = info;  
15.	            break;  
16.	        }  
17.	    }  
18.	    qDebug() << "Name : " << com_info.portName();  
19.	    qDebug() << "Description : " << com_info.description();  
20.	    qDebug() << "serialNumber: " << com_info.serialNumber();  
21.	    return a.exec();  
22.	}  

QSerialPort 负责具体的串口操作。选定串口后,要先打开串口,才能设置波特率等参数。这些参数都设置好了就可以使用了。最基本的操作无非是read() 和 write()。需要注意的是这两个操作都是非阻塞的。
另外有一个重要的signal 也需要用到,那就是 void QIODevice::readyRead()
每次串口收到数据后都会发出这个signal。我们的程序中需要定义一个slot,并将其与这个signal 相连接。这样,每次新数据到来后,我们就可以在slot中读取数据了。这时一定要将串口缓冲区中的数据全部读出来,可以利用readAll() 来实现。
下面的代码片段给出了设置串口的例子。
[cpp] view plain copy

1.	    m_reader.setPort(info);  
2.	    if(m_reader.open(QIODevice::ReadWrite))  
3.	    {  
4.	        qDebug() << "m_reader.open(QIODevice::ReadWrite)";  
5.	        m_reader.setBaudRate(QSerialPort::Baud9600);  
6.	        m_reader.setParity(QSerialPort::NoParity);  
7.	        m_reader.setDataBits(QSerialPort::Data8);  
8.	        m_reader.setStopBits(QSerialPort::OneStop);  
9.	        m_reader.setFlowControl(QSerialPort::NoFlowControl);  
10.	  
11.	        m_reader.clearError();  
12.	        m_reader.clear();  
13.	        connect(&m_reader, SIGNAL(readyRead()), this, SLOT(readyReadSlot()));  
14.	}  
15.	  
16.	  
17.	void Dialog::readyReadSlot()  
18.	{  
19.	    qDebug() << "x";  
20.	    QByteArray arr = m_reader.readAll();  
21.	    do_something(arr);  
22.	} 
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

七 六 伍

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值