精华内容
下载资源
问答
  • Qt5.7串口编程

    2018-07-09 16:22:19
    Qt5.7串口编程Qt5.7串口编程Qt5.7串口编程Qt5.7串口编程Qt5.7串口编程
  • qt串口编程基础.pdf

    2020-08-17 10:07:25
    qt 串口基础 串口编程基础知识讲解了使用qt进行串口编程(跨平台)常用的qt相关编程技术入门资料,适合初学者学习
  • qextserialport-1.2win-alpha,QT串口编程第三方库,适合于windows、linux下的QT串口编程
  • QT串口编程

    2014-08-19 11:15:09
    QT串口编程,实现qt的串口通信,内含源码
  • 声明:这是我个人原创的Qt串口通信的代码,并且这只是适合Qt串口编程的入门学习的。在本代码中我实现了接受和发送中文和字符的,本例的特点是能够实现接受和发送汉字,也是我原创的代码。另外:还需要下位机的支持,...
  • 可以直接下载Qt 5的串口部分源码,注意是串口部分的源码,当然你也可以全部下载,那样就比较耗时,Qt很友好的给我们提供了模块下载,这真的是非常好的。
  • QT 串口编程

    2015-06-23 14:45:40
    该教程分三部分讲述,第一部分讲解qextserialport 的一些东东;...Windows 下使用qextserialport 实现串口通信的方法,这里将讲述两种不同的方法;第三部 分讲解在Linux 下利用qextserialport 实现串口通信的方法
  • QT串口编程总结

    2021-09-23 14:26:51
    最近在使用QT5进行一些嵌入式系统及Linux平台上的开发,对于QT我是一个入门者,最近在使用QT5开发一个串口读取设备配置的功能中遇到了一些问题,后来虽然最终解决了,想到可能后来者也会在这方面遇到问题,所以写下...

    目录

    一、准备

    二、预备知识

    QSerialPortInfo类

    QSerialPort类


    最近在使用QT5进行一些嵌入式系统及Linux平台上的开发,对于QT我是一个入门者,最近在使用QT5开发一个串口读取设备配置的功能中遇到了一些问题,后来虽然最终解决了,想到可能后来者也会在这方面遇到问题,所以写下这么一篇文章记录下来,供后来者参考和交流。

    一、准备

    首先说明一下,我使用的QT版本是Windows上的Qt5.14.1,编译环境是MinGW-64(好像是5.12之前MinGW默认是32位的),如下图所示:

    在Qt5中关于串口编程的主要有两个类:QSerialPort和QSerialPortInfo。其中QSerialPort提供了操作串口的一些方法(如打开、关闭等),而QSerialPortInfo用来表示串口的一系列静态属性(如获取所有串口)。题外话,在Qt中这样成双成对出现的类有很多,如QFile/QFileInfo、QFont/QFontInfo、QCamera/QCameraInfo、QPrinter/QPrinterInfo,其关联和区别也是类似。

    在QT5中要进行串口开发,首先需要引入相应的模块,具体做法就是在项目的pri或pro中添加serialport,如下面就是我进行串口开发的功能模块中的定义:

    QT       += core gui serialport

    上面的配置表示除了核心模块core之外还使用了gui和serialport模块。

    当然除了在代码项目级配置外,还需要在具体使用串口的代码处引入QSerialPortInfo或QSerialPort。

    一般用下面的方式即可:

    #include <QSerialPortInfo>
    #include <QSerialPort>

    二、预备知识

    QSerialPortInfo类

    QSerialPortInfo提供了获取设备串口的方法,QSerialPortInfo::availablePorts()方法可用于获取当前运行程序的系统上所有可连接的串口情况,下面的代码可以获取到当前系统上的所有串口信息:

        QString description;
        QString manufacturer;
        QString serialNumber;
        QString portName;
        const auto infos = QSerialPortInfo::availablePorts();
        for (const QSerialPortInfo &info : infos) {
            QStringList list;
            description = info.description();//串口描述
            manufacturer = info.manufacturer();//串口设备制造商
            serialNumber = info.serialNumber();//串口序列号
            portName=info.portName();//串口描述
    
        }

    QSerialPort类

    QSerialPort类继承自QIODevice类,提供了串口操作的功能,串口相关的属性有:串口对象(用PortName关联)、波特率(BaudRate)、数据位(DataBits)、停止位(StopBits)、奇偶校验(Parity)、硬件流控(FlowControl)等几个属性。

    以上属性出PortName外都有相应的枚举分别规定它们可能的取值,如下图:

     

     

    从每个枚举的最后一个value为-1的值就可以看得出上面每个枚举分别对应QSerialPort类的哪个属性了。

    QSerialPort类用父类QIODevice类提供的write()方法写入数据,用一系列read()读取数据,另外其本身提供了open(OpenMode mode)和close()方法来打开和关闭端口。同时还提供了两个有用信号(signal)用于数据读取和错误控制。readyRead()信号用于读取数据控制,每当收到新的数据时会触发这个信号。而当串口通信过程中发生错误会触发errorOccurred()信号。

    需要注意的是,我们向串口写入以数据后,串口设备的响应可能不是一次全部数据,你可以想象一下你用一个9600bit的Modem打开一个100KB网页的情况。比如我用来查询设备的某些配置信息,你在命令行上看到的这样的:

    下面是我用一个串口监听工具监听到的情况:

    两相对比,你可以看到输入一条命令,对方的响应可能是多个,有时候是几个字符,有时候可能是仅仅一个字符,但是每一次都会readyRead()信号事件。很多初次接触QT串口编程的人会踩到这个坑,从一些串口交互工具上看到的是输入一条命令就会得到一段响应数据,编写对应的槽函数与readyRead()信号关联,以为调用QSerialPort类的readAll()方法就可以读取到全部的响应数据了,结果发现根本不对。

    在我做的项目中有一个功能,就是通过数十条查询命令通过串口查询设备状态,然后再将每条查询命令对应的响应保存起来并进行分析,因此需要区分每条查询命令对应的响应。在这里有几种办法,第一种是通过waitForReadyRead(int msecs = 30000)方法来读取,也就是写入命令后等待msecs毫秒后触发readyRead(),然后在关联的槽函数中读取数据。还有一种办法就是通过计时器QTimer来实现,在我的项目中我就是通过这种方式来实现的。

    展开全文
  • Qt串口编程

    2012-10-08 21:09:31
    经我收集整理,网罗网上大部分经典串口编程资料与代码,绝对不后悔。欢迎下载学习,别看资源分高,我也付出很多终能收集好。
  • 用QT写的一个串口调试助手。学习QT串口编程必备。
  • linux下QT串口编程文件

    2017-01-01 16:22:20
    linux下QT串口编程文件
  • 利用第三方的运行在window操作系统的串口收发程序,编程软件是qt4.
  • 仿照成品制作一个自己用Qt编写的串口助手。 1. 布局UI界面 创建QWidget工程,布局UI界面:拖入2个 Plain Text Edit,作为串口数据的接收显示和发送框。 拖入几个 Combo Box 、Label 和 Push Button,使用两个...

     

    这章来学习串口数据流操作。仿照已有成品制作一个用Qt开发的串口调试助手。

    介于篇幅有限,本篇只介绍一个最简单的能收发的串口调试助手的制作。后续篇幅会陆续对剩余代码进行讲解,并添加各种功能,对显示、操作、功能的各方面继续优化,达成与市面上的成品一样的功能。目标精简、可靠、高效、便于当作框架二次开发,欢迎各位使用和作为框架进行二次开发,并提出改进意见。

    发布效果展示:Qt串口调试助手演示效果

    GitHub源码仓库:Qt串口调试助手源码下载

    更新:后期在原有串口功能上,使用了QCustomPlot绘图库,制作了串口波形绘图上位机,非常适合单片机上传波形进行调试。最多可显示20条曲线,支持滚轮Y轴缩放、左键拖拽。波形帧协议兼容匿名四轴调试上位机,并增加了16进制转换,支持GB2312中文编码。详细介绍见:波形绘图上位机源码下载

     

    GitHub中为最终发布代码,可能与讲解教程中略有不同,望自行对照。

    1. 布局UI界面

    • 创建QMainWindow工程。
    • 布局UI界面:拖入2个 Plain Text Edit,作为串口数据的接收显示和发送框。
    • 再拖入几个 Combo Box 、 Label 和 Push Button,使用两个Widget进行布局。如下所示。

     

    • 将接收区的 Plain Text Edit,属性勾选上 readOnly,使其运行时不会被人为的输入操作影响。

     

    • 加入一些弹簧,使布局美观。(有必要可以加设置,固定窗口大小,不能最大化。)

     

    2. 添加下拉列表项

    • 在ui设计界面中,双击 Combo Box添加列表项。

     

    • 更改下拉框的默认值。修改 currentIndex属性,改变默认值。

        

     

    3. 修改控件名称

    • 将控件的命名统一,方便管理和程序书写。

     

    4. 添加串口类,自动扫描可用串口

    • 在工程 .pro文件中,添加 "QT += core gui serialport",以支持串口功能。

     

    • 窗口构造函数中,添加自动扫描可用串口代码。(由于代码位于窗口构造函数中,故仅在应用刚打开时扫描串口,以后会增加点击下拉框时扫描,需要对鼠标点击事件进行重写)
    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include <QDebug>
    
    MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
        , ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    
        QStringList serialPortName;
    
        // 自动扫描当前可用串口,返回值追加到字符数组中
        foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts()){
            serialPortName << info.portName();
        }
        // 可用串口号,显示到串口选择下拉框中
        ui->cmbSerialPort->addItems(serialPortName);
    }

     

    • 如果电脑连接了串口设备,运行Qt应用,点击下拉框,会看到可用的串口号。

     

    • 与标准的串口助手对比,结果一致。

     

    5. 打开串口、翻转开关

    • 功能:点击 "打开串口" 按钮,初始化串口参数,并按照设置好的参数打开串口。
    • 在 "打开串口" 按钮位置,右键,转到槽...。编写串口配置代码。
    • 将字符串,转换为可以代码设置的枚举,根据当前值,设置参数。之后打开对应串口端口。
    // 打开/关闭串口 槽函数
    void MainWindow::on_btnSwitch_clicked()
    {
    
        QSerialPort::BaudRate baudRate;
        QSerialPort::DataBits dataBits;
        QSerialPort::StopBits stopBits;
        QSerialPort::Parity   checkBits;
    
        // 获取串口波特率
        // 有没有直接字符串转换为 int的方法???
        //baudRate = ui->cmbBaudRate->currentText().toInt();
        if(ui->cmbBaudRate->currentText() == "9600"){
            baudRate = QSerialPort::Baud9600;
        }else if(ui->cmbBaudRate->currentText() == "38400"){
            baudRate = QSerialPort::Baud38400;
        }else if(ui->cmbBaudRate->currentText() == "115200"){
            baudRate = QSerialPort::Baud115200;
        }else{
    
        }
    
        // 获取串口数据位
        if(ui->cmbData->currentText() == "5"){
            dataBits = QSerialPort::Data5;
        }else if(ui->cmbData->currentText() == "6"){
            dataBits = QSerialPort::Data6;
        }else if(ui->cmbData->currentText() == "7"){
            dataBits = QSerialPort::Data7;
        }else if(ui->cmbData->currentText() == "8"){
            dataBits = QSerialPort::Data8;
        }else{
    
        }
    
        // 获取串口停止位
        if(ui->cmbStop->currentText() == "1"){
            stopBits = QSerialPort::OneStop;
        }else if(ui->cmbStop->currentText() == "1.5"){
            stopBits = QSerialPort::OneAndHalfStop;
        }else if(ui->cmbStop->currentText() == "2"){
            stopBits = QSerialPort::TwoStop;
        }else{
    
        }
    
        // 获取串口奇偶校验位
        if(ui->cmbCheck->currentText() == "无"){
            checkBits = QSerialPort::NoParity;
        }else if(ui->cmbCheck->currentText() == "奇校验"){
            checkBits = QSerialPort::OddParity;
        }else if(ui->cmbCheck->currentText() == "偶校验"){
            checkBits = QSerialPort::EvenParity;
        }else{
    
        }
    
        // 想想用 substr strchr怎么从带有信息的字符串中提前串口号字符串
        // 初始化串口属性,设置 端口号、波特率、数据位、停止位、奇偶校验位数
        mySerialPort->setBaudRate(baudRate);
        mySerialPort->setDataBits(dataBits);
        mySerialPort->setStopBits(stopBits);
        mySerialPort->setParity(checkBits);
        mySerialPort->setPortName(ui->cmbSerialPort->currentText());// 不匹配带有串口设备信息的文本
    
        // 根据初始化好的串口属性,打开串口
        // 如果打开成功,反转打开按钮显示和功能。打开失败,无变化,并且弹出错误对话框。
        if(ui->btnSwitch->text() == "打开串口"){
            if(mySerialPort->open(QIODevice::ReadWrite) == true){
                //QMessageBox::
                ui->btnSwitch->setText("关闭串口");
                // 让端口号下拉框不可选,避免误操作(选择功能不可用,控件背景为灰色)
                ui->cmbSerialPort->setEnabled(false);
            }else{
                QMessageBox::critical(this, "错误提示", "串口打开失败!!!\r\n该串口可能被占用\r\n请选择正确的串口");
            }
        }else{
            mySerialPort->close();
            ui->btnSwitch->setText("打开串口");
            // 端口号下拉框恢复可选,避免误操作
            ui->cmbSerialPort->setEnabled(true);
        }
    
    }

     

    • 为了避免串口被占用,或者其他错误,我们对打开也做相应的处理:如果串口被占用,会弹出错误提示框。
    • 并且为了防止端口在打开时,被篡改参数,避免改动串口号,做了处理:端口在打开后,下拉框是灰色不可选的。
    • 最终实现 打开串口 / 关闭串口 的功能转换与翻转显示。

     

    6. 接收串口数据

    • 预计结果:接收到串口数据后,将其显示到接收文本框中。
    • 构造函数中建立信号槽,将串口读准备信号,关联接收区显示处理槽函数。
    • 文本框内容使用插入显示。并在每次追加后移动光标

     

    • 对于接收的显示处理方式,我总结了如下四种。各位有兴趣可以将注释打开,运行去了解。
    • 其中第3、4种都是将文本框全部读取再追加内容,运行效率很低,而网上很多开源代码是使用的这种处理方式。这正是使我想要搭建自己开发框架的原因,追求可靠、高效。
    • 我在代码中,使用的是第2种处理方式。解决了不同硬件的插入换行问题,兼容 CH340、CP2102等常用设备。(现象、成因和解决方法在后面序章有说)

     

    7. 发送串口数据

    发送按钮,右键,转到槽...。

    添加发送字符串代码。

     

    8. 清空收区、发区文本内容

    发送按钮,右键,转到槽...。

    添加清空代码。

     

    运行结果

    • 运行时是没有左上角图标的,这是我后来测试生成可执行文件时添加的。

     

    总结

    Qt编程串口调试助手的过程比较简单,但仍有很多地方待完善。例如端口扫描、16进制转换,硬件兼容性,这些会在后面的篇幅进行讲解和添加,力求精简、可靠、高效、便于当作框架二次开发。欢迎各位使用和作为框架进行二次开发,并提出改进意见。

    GitHub源码仓库:Qt串口调试助手源码下载
     

    展开全文
  • 用于学习QT平台开发串口通信的好例子,可以收发,可以记录收发字节个数
  • Qt5 串口编程 发送接收 简单入门资料 上手简单 代码清晰
  • ubuntu关于Qt串口通信编程

    千次阅读 2019-01-03 15:40:43
    在此之前,建议装ubuntu 64位, 因为Qt好像自哪个版本后Linux就只有64位的了 且配置的是USB转串口 1. 如何将windows下的串口映射到ubuntu中,当串口连接上pc后,在windows设备管理器中可以看到如下图所示 2. ...

    在此之前,建议装ubuntu 64位, 因为Qt好像自哪个版本后Linux就只有64位的了

    且配置的是USB转串口

    1. 如何将windows下的串口映射到ubuntu中,当串口连接上pc后,在windows设备管理器中可以看到如下图所示

    2. 打开虚拟机,开启ubuntu,然后按下图所示操作,当选择连接后,windows设备管理器中的USB Serial Port就会消失,

    若可以连接,则表示ubuntu可以使用此串口

    3. 安装minicom,注意使用sudo安装:

    sudo apt-get install minicom

    安装完成后,输入

    minicom -s

    配置串口相关信息,如下图所示

    1). 选择Serial port setup,按"Enter"

    2). 左边红色方框中的字母表示你想修改哪一项就输入哪个字母

    例如想修改Serial Device,那么直接输入"A"之后,按"Enter",光标会跳到你想要修改信息的地方,之后将名字改为

    /dev/ttyUSB0之后,再按"Enter",接着修改其他项即可,总体配置如下图所示

    3). 修改完之后,按"Enter键",返回如下界面,选择Save setup as dfl,等待保存完毕

    4). 之后再选择"Exit from Minicom"

    至于如何测试minicom,我没有试过,接下来直接Qt编程

     

    4. Qt编程,配置串口信息如下所示:

    需要注意的就是setPortName,要和刚刚设置的一样

     

    至此,全部配置结束

     

     

     

    展开全文
  • Qt 串口类QSerialPort

    2020-12-29 17:59:28
    Qt5.1 中提供了QtSerialPort模块,方便编程人员快速的开发应用串口的应用程序。 本文就简单的讲讲QtSerialPort模块的使用。 当前的QtSerialPort模块中提供了两个C++,分别是QSerialPort 和QSerialPortInfo。 ...

    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.	} 
    
    展开全文
  • 讲解QT串口编程方面的知识,并提供代码示例
  • QT4 串口编程

    2014-09-14 10:35:03
    本资料为在基于潜入式Linux操作系统的QT4串口编程,建立线程,实现收发。
  • qt串口编程

    千次阅读 2009-08-06 11:37:00
    qt串口编程管理提醒: 本帖被 XChinux 执行加亮操作(2008-04-22) [serial.cpp]#include #include #include "mainwindow.h"int main(int argc, char *argv[]){ QApplication a(argc,argv); 
  • QT5串口编程

    千次阅读 2016-04-29 18:10:53
    QT5串口编程,   官方概述: #include 提供使用串口的功能。 你可以使用QSerialPoartInfo帮助获取可用串口资源,(将会列举出系统中所有的口 对获取正确的串口号是很有帮助的,   使用 setPort()or ...
  • Qt 串口编程

    2019-08-22 16:24:29
    QT += serialport main.cpp #include <QCoreApplication> #include <QString> #include <QtSerialPort/QSerialPort> #include <QtSerialPort/QSerialPortInfo> #inc...
  • QT串口编程源码 1
  • QT串口编程的相关(QSerialPortInfo)

    万次阅读 2015-02-05 14:14:59
    QT Serial Port相关的只有两个QSerialPortInfo(#include) 和QserialPort(#include) 先来介绍QSerialPortInfo 1:QSerialPortInfo(#include)  该提供主要是提供系统已经存在串口的信息。 该中的静态函数...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,548
精华内容 1,819
关键字:

qt串口类编程