复制代码 复制代码

Qt串口通讯的学习

首先,需要在项目工程文件里添加一行:

QT       += serialport

然后,添加头文件

#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>

在串口通讯前,应该先使用QSerialPortInfo的静态函数查询串口信息:

    QStringList serialPortName;
    foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts())
    {
        serialPortName << info.portName();
        qDebug()<<info.portName()<<",BaudRates:"<<info.standardBaudRates()<<"\n";
    }

查询到想要的串口信息后,我们就可以初始化一个串口对象,然后设置它的名字、波特率等属性:

    portName=serialPortName[0];  
    qDebug()<<"现在使用的串口为:"<<portName;
    testport=new QSerialPort;
    //如果串口已经打开,先关闭它
    if(testport->isOpen()){
        testport->clear();
        testport->close();
    }
    testport->setPortName(portName);        //设置串口名
    if(!testport->open(QIODevice::ReadWrite))//用ReadWrite 的模式尝试打开串口
     {
         qDebug()<<portName<<"打开失败!";
         return;
     }
    testport->setBaudRate(QSerialPort::Baud9600,QSerialPort::AllDirections);//设置波特率和读写方向
    testport->setDataBits(QSerialPort::Data8);        //数据位为8位
    testport->setFlowControl(QSerialPort::NoFlowControl);//无流控制
    testport->setParity(QSerialPort::NoParity);    //无校验位
    testport->setStopBits(QSerialPort::OneStop); //一位停止位

读取串口信息: 串口在收到数据后,会把数据存入缓冲区,并发出一个readyRead信号,只要连接该信号和你自定义的槽函数即可。比如

    connect(testport,&QSerialPort::readyRead,this,&MainWindow::showMsg);
void MainWindow::showMsg()
{
    QByteArray data=testport->readAll();//先读取数据
    QTextCodec *codec=QTextCodec::codecForName("GBK");//采用GBK编码(因为我发的是中文)   
    QString msg=codec->toUnicode(data);//然后转为Qstring
    //英文直接QString msg=QString(data);即可完成QByteArray转QString
    qDebug()<<msg;
}

向串口发信息: 调用串口的wirte函数即可。

    QString sendMsg="hello world";
    QByteArray cmdMsg=sendMsg.toLatin1();
    testport->write(cmdMsg);

使用完毕后要记得关闭串口,通常在析构函数中操作:

MainWindow::~MainWindow()
{
    delete ui;
    if (testport->isOpen())
     {
        testport->close();
     }
     delete testport;
}

 

posted @ 2021-02-25 11:42  量子诗人  阅读(103)  评论(0编辑  收藏  举报
Live2D