初次使用QT5串口类QSerialPort

2023-10-30

        因为工作需要,现在正在学习Qt的串口通信。Qt4的话需要使用第三方类,使用起来也非常简单,只需要把对应的文件添加到自己的项目中就可以了,我参考的是Qt论坛上的demo,刘大师和yafei的demo都非常详细,网上都可以下载到。不过,Qt5添加了串口类,使用起来就更方便了。

 

        我这里主要是对串口类的简单使用,实现的功能是以读写方式打开串口,点击发送数据按钮将发送区的数据发送到缓冲区,然后在接收区显示出来,界面如下:(源码可以在这里下载)

 

                                                             

 

        这里使用了QSerialPort模块提供的两个类:QSerialPort类和QSerialPortInfo类,QSerialPort类提供了对串口的操作,QSerialPortInfo类提供了对串口信息的获取。下面是主要代码,包含了对串口类的简单使用。

 

        首先,一定要在.pro文件中添加:QT += serialport

 

        串口初始化如下:

 

/****************************串口初始化*****************************/
void MainWindow::initPort()
{
    //读取串口信息
    foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
    {
        qDebug()<<"Name:"<<info.portName();
        qDebug()<<"Description:"<<info.description();
        qDebug()<<"Manufacturer:"<<info.manufacturer();

        //这里相当于自动识别串口号之后添加到了cmb,如果要手动选择可以用下面列表的方式添加进去
        QSerialPort serial;
        serial.setPort(info);
        if(serial.open(QIODevice::ReadWrite))
        {
            //将串口号添加到cmb
            ui->cmbPortName->addItem(info.portName());
            //关闭串口等待人为(打开串口按钮)打开
            serial.close();
        }
    }

    QStringList baudList;//波特率
    QStringList parityList;//校验位
    QStringList dataBitsList;//数据位
    QStringList stopBitsList;//停止位

    baudList<<"50"<<"75"<<"100"<<"134"<<"150"<<"200"<<"300"
           <<"600"<<"1200"<<"1800"<<"2400"<<"4800"<<"9600"
          <<"14400"<<"19200"<<"38400"<<"56000"<<"57600"
         <<"76800"<<"115200"<<"128000"<<"256000";

    ui->cmbBaudRate->addItems(baudList);
    ui->cmbBaudRate->setCurrentIndex(12);

    parityList<<"无"<<"奇"<<"偶";
    parityList<<"标志";
    parityList<<"空格";

    ui->cmbParity->addItems(parityList);
    ui->cmbParity->setCurrentIndex(0);

    dataBitsList<<"5"<<"6"<<"7"<<"8";
    ui->cmbDataBits->addItems(dataBitsList);
    ui->cmbDataBits->setCurrentIndex(3);

    stopBitsList<<"1";
    stopBitsList<<"1.5";
    stopBitsList<<"2";

    ui->cmbStopBits->addItems(stopBitsList);
    ui->cmbStopBits->setCurrentIndex(0);

    //设置按钮可以被按下
    ui->btnOpen->setCheckable(true);
}

 

 

        这里通过遍历所有串口将我们需要使用的串口添加到了combox中,如果想要手动选择可以将串口名称通过列表的方式添加到combox中,到使用的时候再选择。

 

 

        串口设置如下:

 

/****************************串口设置******************************/
void MainWindow::on_btnOpen_clicked()
{
    if(ui->btnOpen->text() == "打开串口")
    {
        my_serialport = new QSerialPort(this);

        //设置串口号
        my_serialport->setPortName(ui->cmbPortName->currentText());
        //以读写方式打开串口
        if(my_serialport->open(QIODevice::ReadWrite))
        {
            //设置波特率
            my_serialport->setBaudRate(ui->cmbBaudRate->currentText().toInt());
            //设置数据位
            my_serialport->setDataBits(QSerialPort::Data8);
            //设置校验位
            my_serialport->setParity(QSerialPort::NoParity);
            //设置流控制
            my_serialport->setFlowControl(QSerialPort::NoFlowControl);
            //设置停止位
            my_serialport->setStopBits(QSerialPort::OneStop);

            //每秒读一次
            timer = new QTimer(this);
            connect(timer, SIGNAL(timeout()), this, SLOT(readComDataSlot()));
            timer->start(1000);

            setNonSelectable();
        }
        else
        {
            QMessageBox::about(NULL, "提示", "串口没有打开!");
            return;
        }
    }
    else
    {
        timer->stop();
        setSelectable();
        my_serialport->close();
    }
}

 

 

        这里是对串口的设置,需要先打开串口才能设置串口参数。参数设置好之后就可以通过read()和write()函数进行数据的读写,我这里用的是1秒的定时器来读缓冲区的数据。

 

 

        数据收发如下:

 

/****************************数据传输******************************/
void MainWindow::readComDataSlot()
{
    //读取串口数据
    QByteArray readComData = my_serialport->readAll();

    //将读到的数据显示到数据接收区的te中
    if(readComData != NULL)
    {
        ui->teReceiveData->append(readComData);
    }

    //清除缓冲区
    readComData.clear();
}

void MainWindow::on_btnSend_clicked()
{
    //获取发送区的数据
    QString sendData = ui->teSendData->toPlainText();
    QByteArray sendData_2 = sendData.toLatin1();

    //写入缓冲区
    my_serialport->write(sendData_2);
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

    

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

初次使用QT5串口类QSerialPort 的相关文章

随机推荐

  • Qt学习总结——飞机大战小游戏制作

    Qt学习总结 飞机大战小游戏制作 1 需求分析 这篇文章写于2020年暑假 完成学校实训项目之后 对自己的项目实践做了一个总结 回顾整个项目的制作过程 同时也复习一下Qt的相关知识 总结项目制作过程中出现的不足之处 如果有同学想尝试使用Qt
  • 深度强化学习系列(2): ERROR: GLEW initalization error: Missing GL version

    当深度强化学习之 6 中的环境安装好之后 一阵欣喜 觉得可以干大事了 于是激动的不行 迫不及待的想看效果 然而幸福来的太快就容易让人失望的越厉害 因此美好的事情总是值得多次磨砺 废话不说了 爆出的错误是这样的 Running trained
  • 从零使用electron搭建桌面端可视化编辑器Dooring

    之前有朋友希望我基于H5 Dooring开发一款桌面端应用 最近刚好有时间 就花了小半天时间从零使用electron开发了桌面端的离线软件Dooring electron 因为之前用electron比较少 今天刚好学了一下 也基本把前后端打
  • sklearn中的make_moons函数使用

    主要参数作用如下 n numbers 生成样本数量 shuffle 是否打乱 类似于将数据集random一下 noise 默认是false 数据集是否加入高斯噪声 random state 生成随机种子 给定一个int型数据 能够保证每次生
  • Weblogic 12c 负载均衡和session复制

    在上一篇 我们介绍了weblogic集群的部署和session的复制 如何将请求负载均衡到这个三个服务器上呢 这里提供两种方式 1 weblogic自带的proxy代理 2 nginx实现负载均衡 一 通过proxy实现负载均衡 1 创建p
  • PyTorch动态神经网络

    PyTorch 是 PyTorch 在 Python 上的衍生 因为 PyTorch 是一个使用 PyTorch 语言的神经网络库 Torch 很好用 但是 Lua 又不是特别流行 所有开发团队将 Lua 的 Torch 移植到了更流行的语
  • 在linux下启动tomcat命令

    操作步骤 第一步 进入tomcat的bin目录 cd usr local tomcat bin 第二步 使用tomcat关闭命令 shutdown sh 第三步 查看tomcat是否关闭 ps ef grep java如果显示以下信息 则说
  • cherry-pick的定义和使用方法

    1 定义 使用遴选 cherry pick 命令 Git 可以让你将任何分支中的个别提交合并到你当前的 Git HEAD 分支中 当执行 git merge 或者 git rebase 时 一个分支的所有提交都会被合并 cherry pic
  • 使用jdbc连接oracle数据库

    1 导入架包ojdbc14 2 编写工具类 package utils import java sql Connection import java sql DriverManager import java sql SQLExceptio
  • Axure RP 9最新版的授权码(专业版)亲测可用

    分享AxureRP9授权码和密钥 Axure RP9分为专业版 Pro 团队版 Team 和企业版 Enterprise 其中企业版功能最为强大 下面分享几个Axure RP 9最新版的授权码 专业版 亲测可用 被授权人 License A
  • Gof23设计模式之简单工厂/静态工厂模式

    在java中 万物皆对象 这些对象都需要创建 如果创建的时候直接new该对象 就会对该对象耦合严重 假如我们要更换对象 所有new对象的地方都需要修改一遍 这显然违背了软件设计的开闭原则 如果我们使用工厂来生产对象 我们就只和工厂打交道就可
  • JavaScript 检查变量是否为 null 或 undefined

    当它的左侧操作数为null 或 undefined时 返回右侧的操作数 否则返回其左侧的操作数 用法 想检查一个变量是否为 null 或 undefined 时 操作符很有用 const foo null Hello console log
  • python小游戏 推箱子小游戏设计与实现

    文章目录 0 项目简介 1 游戏介绍 2 实现效果 3 开发工具 3 1 环境配置 3 2 Pygame介绍 4 具体实现 5 最后 0 项目简介 Hi 各位同学好呀 这里是L学长 今天向大家分享一个今年 2022 最新完成的毕业设计项目作
  • Spring之@AutoWired注解

    开发中依赖注入一般用 AutoWired 首先需要bean xml文件中需要配置
  • C语言字符串必备练习题

    1 作业标题 633 字符串的结束标志是 作业内容 A 是 0 B 是EOF C 是 0 D 是空格 答案解析 C语言规定 以 0 作为有效字符串的结尾标记 A 错误 是 0 不是字符0 B EOF一般用来作为检测文本文件的末尾 C 正确
  • 机器学习笔试题汇总

    文章目录 树 特征工程 样本处理 K近邻 聚类 深度学习 分类 距离 相似度 指标性能评价 HMM 数学 为什么将回归问题转化成分类问题 解空间变小 softmax和sigmoid的区别 为什么用多项分布 多项分布能天然刻画值域变化趋势的
  • 演讲文档和视频《元宇宙与区块链IT基础设施》下载

    当今科技迅猛发展 知识爆炸的时代 有些知识 非公司保密信息 及那些不需要申请知识产权 构建护城河的信息 不及时分享 就过期了 重要的是 构建个人知识壁垒的根本是 快速迭代学习和交流碰撞 另外 我希望能遇到更多有共鸣 相互启发的朋友 我的QQ
  • RESETLOGS

    使用resetlogs选项 会把当前的日志序号 log sequence number 重设为1 并抛弃所有日志信息 在以下条件时需要使用resetlogs选项 在不完全恢复 介质恢复 使用备份控制文件 使用resetlogs打开数据库后
  • AttributeError: module ‘networkx‘ has no attribute ‘from_numpy_matrix‘解决方法

    在我学习louvain算法时 运行了这样一段代码 from communities algorithms import louvain method from communities visualization import draw co
  • 初次使用QT5串口类QSerialPort

    因为工作需要 现在正在学习Qt的串口通信 Qt4的话需要使用第三方类 使用起来也非常简单 只需要把对应的文件添加到自己的项目中就可以了 我参考的是Qt论坛上的demo 刘大师和yafei的demo都非常详细 网上都可以下载到 不过 Qt5添