Qt5--串口开发常用技巧
程序员文章站
2022-04-01 10:29:42
目录一、引用库1、.pro文件中添加2、引用头文件二、初始化1、初始化串口号函数三、定时更新串口号四、一个按键完成:打开、关闭的功能一、引用库1、.pro文件中添加QT += serialport2、引用头文件在mainwindow.h中添加头文件#include #include 二、初始化1、初始化串口号函数找出可以使用的串口号并添...
一、引用库
1、.pro文件中添加
QT += serialport
2、引用头文件
在mainwindow.h中添加头文件
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>
二、初始化
1、初始化串口号函数
- 找出可以使用的串口号并添加到串口列表中去
- 使用定时器定时调用该函数,实现及时更新出新的串口
void MainWindow::InitSerial()
{
QStringList newPortStringList;
static QStringList oldPortStringList;
const auto infos = QSerialPortInfo::availablePorts();
for (const QSerialPortInfo &info : infos)
{
newPortStringList += info.portName();
}
//更新串口号
if(newPortStringList.size() != oldPortStringList.size())
{
oldPortStringList = newPortStringList;
ui->portComBox->clear();
ui->portComBox->addItems(oldPortStringList);
}
}
三、定时更新串口号
int gUpdatePortTmr; // 标记定时器号
bool gSerialSwitchFlg; // 标记串口的开关状态
void MainWindow::InitTimer()
{
gUpdatePortTmr = startTimer(900, Qt::CoarseTimer);
}
// 定时器事件
void MainWindow::timerEvent(QTimerEvent *event)
{
if(event->timerId() == gUpdatePortTmr)
{
if(!gSerialSwitchFlg)// 串口是关闭的就可以定时更新串口号
InitSerial();
}
}
四、一个按键完成:打开、关闭的功能
配合定时更新串口号的功能,可以只用一个按键就完成打开、关闭的功能,实现界面的简洁。
bool gSerialSwitchFlg; // 标记串口的开关状态
QSerialPort *gSerialPort;
void MainWindow::on_openBtn_clicked()
{
if(!gSerialSwitchFlg) // 串口是关闭的
{
gSerialPort = new QSerialPort();
gSerialPort->setPortName(ui->portComBox->currentText());
gSerialPort->setBaudRate(ui->baudComBox->currentText().toInt());//波特率
gSerialPort->open(QIODevice::ReadWrite);//读写方式打开
gSerialPort->setDataBits(QSerialPort::Data8);//数据位
gSerialPort->setParity(QSerialPort::NoParity);//奇偶校验
gSerialPort->setStopBits(QSerialPort::OneStop);//停止位
gSerialPort->setFlowControl(QSerialPort::NoFlowControl);//控制位
connect(gSerialPort, SIGNAL(readyRead()), this, SLOT(ReadSerialData()), Qt::DirectConnection);
//关闭设置菜单使能
ui->portComBox->setEnabled(false);
ui->baudComBox->setEnabled(false);
ui->stopComBox->setEnabled(false);
ui->checkComBox->setEnabled(false);
ui->dataComBox->setEnabled(false);
ui->openBtn->setText("Close");
gSerialSwitchFlg = true;
ui->recvTextBro->append("Serial is Opening");
}
else
{
//关闭串口子线程
gSerialPort->clear();
gSerialPort->close();//关闭子线程
gSerialPort->deleteLater();
//恢复设置使能
ui->portComBox->setEnabled(true);
ui->baudComBox->setEnabled(true);
ui->stopComBox->setEnabled(true);
ui->checkComBox->setEnabled(true);
ui->dataComBox->setEnabled(true);
ui->openBtn->setText("Open");
gSerialSwitchFlg = false;
ui->recvTextBro->append("Serial is Closing");
}
}
void MainWindow::ReadSerialData()
{
static QByteArray sumData;
QByteArray tempData = gSerialPort->readAll();
if(!tempData.isEmpty())
{
qDebug() << tempData;
sumData.append(tempData);
if(sumData.contains("\n"))
{
// 数据处理
sumData.clear();
}
}
tempData.clear();
}
本文地址:https://blog.csdn.net/qq_28877125/article/details/109707459
上一篇: CocosCreator优化之DrawCall漫谈
下一篇: 贪心