资讯专栏INFORMATION COLUMN

QT5串口编程

xcc3641 / 2576人阅读

摘要:串口编程添加库,添加类设置和打开串口读取数据发送数据关闭串口这里使用了模块提供的两个类类和类,类提供了对串口的操作,类提供了对串口信息的获取。下面,总结了一下借助对串口进行设置打开读写和关闭的过程。

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

1 添加库,添加类

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

首先,QT5是自带QSerialPort这个类的,使用时需要在pro文件里面添加一行:

QT       += serialport

然后直接引用头文件就可以了。

#include         //提供访问串口的功能 #include     //提供系统中存在的串口的信息

在QT5中,串口通信是借助一个QSerialPort的对象来实现的,在设置QSerialPort对象对串口的名称、波特率、数据位、校验位、停止位等参数后,方能对串口进行读写。下面,总结了一下借助QSerailPort对串口进行设置、打开、读、写和关闭的过程。

2 设置和打开串口

串口初始化如下:

/****************************串口初始化*****************************/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();    }}
#include "widget.h"#include "ui_widget.h"#include #include Widget::Widget(QWidget *parent) :    QWidget(parent),    ui(new Ui::Widget){    ui->setupUi(this);    m_serialPort = new QSerialPort();    initUI();    m_portNameList = getPortNameList();    m_PortNameComboBox->addItems(m_portNameList);    connect(m_OpenPortButton,&QPushButton::clicked,this,&Widget::openPort);}Widget::~Widget(){    if (m_serialPort->isOpen())    {        m_serialPort->close();    }    delete m_serialPort;    delete ui;}void Widget::initUI(){    this->setWindowTitle("码农小明 test QSerialPort");    m_OpenPortButton = new QPushButton();    m_OpenPortButton->setText("打开串口");    m_PortNameComboBox  = new QComboBox();    QHBoxLayout *m_layout = new QHBoxLayout();    m_layout->addWidget(m_PortNameComboBox);    m_layout->addWidget(m_OpenPortButton);    this->setLayout(m_layout);}QStringList Widget::getPortNameList(){    QStringList m_serialPortName;    foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts())    {        m_serialPortName << info.portName();        qDebug()<<"serialPortName:"<<info.portName();    }    return m_serialPortName;}void Widget::openPort(){    if(m_serialPort->isOpen())//如果串口已经打开了 先给他关闭了    {        m_serialPort->clear();        m_serialPort->close();    }    m_serialPort->setPortName(m_PortNameComboBox->currentText());//当前选择的串口名字    if(!m_serialPort->open(QIODevice::ReadWrite))//用ReadWrite 的模式尝试打开串口    {        qDebug()<<"打开失败!";        return;    }    qDebug()<<"串口打开成功!";    m_serialPort->setBaudRate(QSerialPort::Baud115200,QSerialPort::AllDirections);//设置波特率和读写方向    m_serialPort->setDataBits(QSerialPort::Data8);      //数据位为8位    m_serialPort->setFlowControl(QSerialPort::NoFlowControl);//无流控制    m_serialPort->setParity(QSerialPort::NoParity); //无校验位    m_serialPort->setStopBits(QSerialPort::OneStop); //一位停止位    connect(m_serialPort,SIGNAL(readyRead()),this,SLOT(receiveInfo()));}//接收到单片机发送的数据进行解析void Widget::receiveInfo(){    QByteArray info = m_serialPort->readAll();    qDebug()<<"receive info:"<<info;}

原文链接:
https://shenmingyi.blog.csdn.net/article/details/81669540?spm=1001.2101.3001.6650.16&utm_medium=distribute.pc_relevant.none-task-blog-2defaultBlogCommendFromBaidudefault-16.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2defaultBlogCommendFromBaidudefault-16.no_search_link

3 读取数据

//从接收缓冲区中读取数据QByteArray buffer = serial.readAll();

串口在收到数据后,会将数据存入接收缓冲区。此时,我们可以通过readAll()函数将接收缓冲区的数据读出来。当串口的接收缓冲区有数据时,QSerilaPort对象会发出一个readyRead()的信号。因此,我们可以编写一个槽函数来读数据,例如:

//连接信号和槽QObject::connect(&serial, &QSerialPort::readyRead, this, &MainWindow::serialPort_readyRead);//……//编写的槽函数void MainWindow::serialPort_readyRead(){//从接收缓冲区中读取数据QByteArray buffer = serial.readAll();//处理数据//……}

这里是对串口的设置,需要先打开串口才能设置串口参数。参数设置好之后就可以通过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);}

4 发送数据

serial->write(data);

使用write函数便可以把字节数组中的字节发送出去。

//串口接收void MainWindow::serialPort_readyRead(){    //从接收缓冲区中读取数据    QByteArray buffer = serial.readAll();    //从界面中读取以前收到的数据    QString recv = ui->textEdit->toPlainText();    recv += QString(buffer);    //清空以前的显示    ui->textEdit->clear();    //重新显示    ui->textEdit->append(recv);}

5 关闭串口

serial->close();

原文链接:
https://blog.csdn.net/qq_41068712/article/details/89317764?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163763632016780357243611%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=163763632016780357243611&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-1-89317764.pc_search_result_control_group&utm_term=qt5+%E4%B8%B2%E5%8F%A3&spm=1018.2226.3001.4187

https://blog.csdn.net/zbw1185/article/details/51496663#

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/124996.html

相关文章

  • Qt智能家居应用开发:硬件设备实现智能网络配置时候,如何使用第三方smart config 库

    摘要:串口配置大部分芯片都支持串口命令控制芯片的所有功能。是一个面向软件开发者的智能网络配置功能。电路设计按情况,留出串口和复位键,就可以当作官方评估版使用了。 背景 阅读前预备知识: 学习安晓辉老师的qt for android 核心编程(了解怎么在Qt 里边c++ 调用java,java库怎么加进qt工程中) qt android wifi 开发篇 现在做智能硬件设备,都是使用模块化...

    kuangcaibao 评论0 收藏0
  • Serialport.js 连接 web 和硬件设备编程

    摘要:连接建立成功,就会触发事件事件稍后再解说。当连接建立时当接收到数据时当出现错误时事件监听,主要用来在合适的时间点发送数据,以及处理接收到来自串口的数据信息。数据会经串口发送至与连接的硬件设备,比如板,或者板等等。 Serialport 简介 想象这样一个世界,在那里你能用 JavaScript 代码控制榨汁机,灯,安防系统,甚至机器人。嗯,是机器人!你会不会觉得很新奇以致兴奋? Ser...

    myshell 评论0 收藏0
  • 树莓派学习笔记(五)串口通信

    摘要:观看学习上官可编程陈立臣老师的树莓派视频,在其过程中所记录的学习笔记一串口通信概念串口通信用于多机通信串口通信属于全双工通信,即双方可以同时进行交流半双工通信,一次只允许一方进行通信树莓派进行串口通信一般要连接两根线和 ...

    levinit 评论0 收藏0
  • VS2015配置QT5.X环境

    摘要:最近支持了最近在配置环境,网上教程几乎千篇一律,总结起来几乎都是安装,安装最麻烦还要手动设置环境变量,最后好像还有安装个什么插件。上述两步完成之后,中是不会包含的环境的,解决办法进入选择下载,下载完成之后直接安装即可。 最近VS2015支持qt-vs-addin了 最近在配置VS2015+QT5环境,网上教程几乎千篇一律,总结起来几乎都是:安装VS2015,安装qt5,最麻烦还要手动设...

    hellowoody 评论0 收藏0
  • VS2015配置QT5.X环境

    摘要:最近支持了最近在配置环境,网上教程几乎千篇一律,总结起来几乎都是安装,安装最麻烦还要手动设置环境变量,最后好像还有安装个什么插件。上述两步完成之后,中是不会包含的环境的,解决办法进入选择下载,下载完成之后直接安装即可。 最近VS2015支持qt-vs-addin了 最近在配置VS2015+QT5环境,网上教程几乎千篇一律,总结起来几乎都是:安装VS2015,安装qt5,最麻烦还要手动设...

    asoren 评论0 收藏0

发表评论

0条评论

xcc3641

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<