Qt5 串口类QSerialPort的实现

目录
  • 简述
  • 1.QSerialPortInfo类
  • 2.QSerialPort类

简述

在Qt5以上提供了QtSerialPort模块,方便编程人员快速的开发应用串口的应用程序。

QtSerialPort模块中提供了两个C++类,分别是QSerialPort 和QSerialPortInfo。

QSerialPort 类是Qt5封装的串口类,可与串口进行通信,提供了操作串口的各种接口。

QSerialPortInfo类是一个辅助类,可以提供计算机中可用串口的各种信息。如可用的串口名称,描述,制造商,序列号,串口16位产品编号等。利用QSerialPortInfo提供的可用串口信息,可设置串口波特率,并打开需要的串口进行通信。

使用Qt5进行串口通信大致步骤为:配置串口参数->打开串口->收发数据。

要使用QtSerialPort模块,需要在工程文件.pro文件或.pri中增加语句:

QT += serialport

Qt版本:5.12.8

1.QSerialPortInfo类

列举出电脑上全部的串口设备,Cpp 文件如下:

#include <QCoreApplication>
#include <QDebug>

#include <QSerialPort>
#include <QSerialPortInfo>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
    {
        qDebug() << "Name : " << info.portName();
        qDebug() << "Description : " << info.description();
        qDebug() << "Manufacturer: " << info.manufacturer();
        qDebug() << "Serial Number: " << info.serialNumber();
        qDebug() << "System Location: " << info.systemLocation();
    }
    return a.exec();
}

显示的结果如下:

Name :  "COM17"
Description :  "USB-SERIAL CH340"
Manufacturer:  "wch.cn"
Serial Number:  ""
System Location:  "\\\\.\\COM17"
Name :  "COM1"
Description :  "通信端口"
Manufacturer:  "(标准端口类型)"
Serial Number:  ""
System Location:  "\\\\.\\COM1"
Name :  "COM16"
Description :  "Prolific USB-to-Serial Comm Port"
Manufacturer:  "Prolific"
Serial Number:  "A400G3UXA"
System Location:  "\\\\.\\COM16"
Name :  "COM11"
Description :  "Prolific USB-to-Serial Comm Port"
Manufacturer:  "Prolific"
Serial Number:  ""
System Location:  "\\\\.\\COM11"

若USB串口每次插在不同的USB口上时获得的串口名称可能有变化,这时可以利用串口的序列号,指定程序使用某一个确定的串口。

#include <QCoreApplication>
#include <QDebug>
#include <QSerialPort>
#include <QSerialPortInfo>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QSerialPortInfo com_info;
    foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
    {
        if( info.serialNumber() == "A400G3UXA" )
        {
            com_info = info;
            break;
        }
    }
    qDebug() << "Name : " << com_info.portName();
    qDebug() << "Description : " << com_info.description();
    qDebug() << "serialNumber: " << com_info.serialNumber();
    return a.exec();
}

2.QSerialPort类

QSerialPort 类提供了操作串口的各种接口。

头文件:

class MySerial : public QObject
{
    Q_OBJECT
public:
    MySerial(QString portName = "ttyUSB1", QObject *parent = nullptr);
    ~MySerial();
    bool WriteToSerial(QByteArray cmd);
    QByteArray ReadFromSerial();
    bool SerialIsOpen() { return m_SerialPort->isOpen(); }
    void closeSerial();
signals:
    void sig_SendTipInfo(bool result, QString info);
    void sig_SendReadData(QByteArray data);

private:
    QSerialPort *m_SerialPort = nullptr;
};

cpp文件:

MySerial::MySerial(QString portName, QObject *parent) :
    QObject(parent)
{
    m_SerialPort = new QSerialPort();
    m_SerialPort->setPortName(portName);                //设置串行端口的名称
    m_SerialPort->setBaudRate(QSerialPort::Baud115200); //波特率:115200 bps
    m_SerialPort->setDataBits(QSerialPort::Data8);      //数据位:8 位
    m_SerialPort->setStopBits(QSerialPort::OneStop);    //停止位:1 位
    m_SerialPort->setParity(QSerialPort::NoParity);     //校验位:无
    m_SerialPort->setFlowControl(QSerialPort::NoFlowControl);
    qDebug() << "Port Name:" << portName;
    if(!m_SerialPort->open(QIODevice::ReadWrite))
    {
        emit sig_SendTipInfo(false, "opened failed");
        qDebug() << "open failed";
    }
    else qDebug() << "open successfully";
}

MySerial::~MySerial()
{
    m_SerialPort->clear();    //丢弃缓冲区中的所有字符, 同时终止挂起的读取或写入操作
    m_SerialPort->close();
    m_SerialPort->deleteLater();
}

bool MySerial::WriteToSerial(QByteArray cmd)
{
    if(cmd.isEmpty()) return false;
//    qDebug() << "[ == MySerial == ] Send Data:" << cmd.toHex();
    this->m_SerialPort->clear();
    this->m_SerialPort->write(cmd);
    this->m_SerialPort->flush();    //尽可能多地从内部写缓冲区写入底层串口而不阻塞
    this->m_SerialPort->waitForBytesWritten(10);
    return true;
}

QByteArray MySerial::ReadFromSerial()
{
    QByteArray readData;
    this->m_SerialPort->waitForReadyRead(5);
    readData.append(this->m_SerialPort->readAll());
    while (this->m_SerialPort->waitForReadyRead(5)) readData.append(this->m_SerialPort->readAll());
    if(readData.isEmpty()) return QByteArray();
//    qDebug() << "[ == MySerial == ] Read Data:" << readData.toHex();
    return readData;
}

void MySerial::closeSerial()
{
    if(!m_SerialPort->isOpen()) return;
    m_SerialPort->clear();
    m_SerialPort->close();
}

到此这篇关于Qt5 串口类QSerialPort的实现的文章就介绍到这了,更多相关Qt5 串口类QSerialPort内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • PyQt5 QSerialPort子线程操作的实现

    环境: python3.6 pyqt5 只是简单的一个思路,请忽略脆弱的异常防护: # -*- coding: utf-8 -*- import sys from PyQt5.QtWidgets import * from PyQt5.QtSerialPort import QSerialPort, QSerialPortInfo from PyQt5.QtCore import pyqtSignal, QThread, QObject, QTimer class SerialWork(QObj

  • Qt5 串口类QSerialPort的实现

    目录 简述 1.QSerialPortInfo类 2.QSerialPort类 简述 在Qt5以上提供了QtSerialPort模块,方便编程人员快速的开发应用串口的应用程序. QtSerialPort模块中提供了两个C++类,分别是QSerialPort 和QSerialPortInfo. QSerialPort 类是Qt5封装的串口类,可与串口进行通信,提供了操作串口的各种接口. QSerialPortInfo类是一个辅助类,可以提供计算机中可用串口的各种信息.如可用的串口名称,描述,制造商

  • Qt串口通信开发之Qt串口通信模块QSerialPort开发完整实例(串口助手开发)

    之前自己写了用于上位机做基本收发的界面,独立出来相当于一个串口助手,先贴图: 功能作为串口助手来说还算完善,五个发送槽,一个接收槽,可以检测可用串口并加上相关标志,串口设置,记数功能,还有菜单栏上的文件操作和一些选择功能. 下面说一说这个项目: 做这个串口助手分为两步,第一步是设计界面,第二部是功能的代码实现. 一.界面设计 界面设计用Qt Designer,当然用Qt Creator的界面编辑器也可以,只不过感觉Qt Designer更好用一点,因为可以随时运行查看你的界面效果而不用编译整个项

  • Qt串口通信开发之QSerialPort模块详细使用方法与实例

    Qt串口通信基础及名词说明 串口通信(Serial Communications)的概念非常简单,串口按位(bit)发送和接收字节.尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据.它很简单并且能够实现远距离通信.比如IEEE488定义并行通行状态时,规定设备线总长不得超过20米,并且任意两个设备间的长度不得超过2米: 而对于串口而言,长度可达1200米.典型地,串口用于ASCII码字符的传输.通信使用3根线完成,分别是地线.发送.接收.由于串口通信

  • Qt串口通信开发之QSerialPort模块简单使用方法与实例

    我这里主要是对串口类的简单使用,实现的功能是以读写方式打开串口,点击发送数据按钮将发送区的数据发送到缓冲区,然后在接收区显示出来,界面如下:(源码可以在这里下载) 这里使用了QSerialPort模块提供的两个类:QSerialPort类和QSerialPortInfo类,QSerialPort类提供了对串口的操作,QSerialPortInfo类提供了对串口信息的获取.下面是主要代码,包含了对串口类的简单使用. 首先,一定要在.pro文件中添加:QT += serialport 串口初始化如下

  • Android串口操作方法实例

    1.首先下载一个libserial_port.so,新建目录libs/armeabi,将so文件放到该目录下. 2.定义串口类,在类的构建函数中修改权限,打开设备,创建输入流和输出流,通过native接口访问串口打开关闭函数 复制代码 代码如下: public class SerialPort {  /*Do not remove or rename the field mFd: it is used by native method close();*/  public SerialPort(

  • C#串口通信模块使用方法示例

    C#串口模块的使用.使用VS .net框架下WinForm程序应用开发. C#开发的串口通信小工具. 相比于QT添加的串口类,WinForm是通过组件的形式将串口加入到程序中.. 在创建完windows窗体之后,添加组件类,就可以将串口加入到其中. 然后就需要写数据成员,初始化和方法,实现串口的读写功能. 串口类数据成员 SerialPort SComm; // 使用构造函数取串口控件 TextBox MsgRc; // 接收数据成员 //构造函数初始化 public SerialComm(Se

  • .Net Core应用增强型跨平台串口类库CustomSerialPort()详解

    目录 摘要 引言 基础类库的选择 类库的实现 创建跨平台类库 实现机制/条件 .net core跨平台实现 主要代码 创建.net core控制台程序 类库地址 跨平台测试 Windows测试输出界面 ubuntu测试输出界面 源码地址 摘要 在使用SerialPort进行串口协议解析过程中,经常遇到接收单帧协议数据串口接收事件多次触发,协议解析麻烦的问题.针对此情况,基于开源跨平台串口类库SerialPortStrem进行了进一步封装,实现了一种接收超时响应事件机制,简化串口通讯的使用. 引言

  • .Net Core跨平台应用开发串口篇HelloArm

    目录 引言 硬件环境 硬件资源特性 支持的系统平台 系统平台 .NET Core支持的Linux版本 系统平台选择 连接嵌入式Linux系统 物理连接 串口连接 网络连接 .NET Core跨平台验证 验证程序设计 显示系统平台信息 串口资源列举 串口测试 跨平台发布 远程部署 Linux环境运行.Net Core程序 第三方串口类库 Linux串口类库编译 环境变量配置 Linux串口测试 配置程序开机运行 结束语 引言 为了验证采用dotnet core技术开发的物联网设备数据采集接入服务应

  • .NET Core使用flyfire.CustomSerialPort实现Windows/Linux跨平台串口通讯

    1,前言 开发环境:在 Visual Studio 2017,.NET Core 2.x 串口通讯用于设备之间,传递数据,物联网设备中广泛使用串口方式连接通讯,物联网通讯协议 :Modbus 协议 ASCII.RTU.TCP模式是应用层的协议,与通讯方式无关. 笔者现在实现的是 串口通信,实现后,可以在上层加上 Modbus 协议,笔者的另一篇文章即是在串口上实现 Modbus 协议,计算中心向物联网设备发送消息,要求设备响应,传送设备信息.检测状态等. 本文是 串口通讯 的实现. 2,安装虚拟

  • .NET Core跨平台串口通讯使用SerialPortStream基础类库问题解决

    说明 由于.net core 2.x 中,已经找不到 serialport 库,使用需要使用第三方框架,可以直接在 Nuget 中搜索 SerialPortStream 开源地址https://github.com/jcurl/SerialPortStream 为了方便使用,有人封装把它了起来,在 Nuget 中搜索 flyfire.CustomSerialPort 这是一个增强的自定义串口类,实现协议无关的数据帧完整接收功能,支持跨平台使用,使用 SerialPortStream 基础类库.

随机推荐