主要用到了串口、保存配置、还有一个线程
QSerialPort、QSettings、QThread
使用串口要注意,再工程文件里添加
QT += serialport
代码我放上来了,编译环境
演示
开了三个线程,一个线程用于串口,一个线程是主窗口,一个线程是保存数据,串口的线程通过信号将数据传递给主程序。
串口:
serialthread.h
#ifndef SERIALTHREAD_H
#define SERIALTHREAD_H
#include <QObject>
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>
const int SERIAL_READ_BUFF = 1200;
class SerialThread : public QObject
{
Q_OBJECT
public:
explicit SerialThread(QObject *parent = nullptr);
~SerialThread();
void initSerial();
bool isOpenPort();
void closePort();
void getPortNum();//获取串口号
void handleSerialError(QSerialPort::SerialPortError error);
bool openSerial(QString strPortNum, int nBaudRate,int nParityType,int nDataBits,int nStopBits,int nFlowCtrl);//打开串口
void receiveData();//接收数据
void writeData(QByteArray byteArray);//发送数据
private:
QSerialPort *m_serial; // 串口通信类对象
QStringList CommPortList; //串口号字符串
signals:
void getcomPortList(QStringList CommPortList);//发送串口号字符串
void linkError(QSerialPort::SerialPortError error);//连接错误
void receData(QByteArray data,int length);//接收数据
};
#endif // SERIALTHREAD_H
serialthread.cpp
#include "serialthread.h"
#include <QDebug>
#include <QThread>
SerialThread::SerialThread(QObject *parent) : QObject(parent)
{
initSerial();
}
SerialThread::~SerialThread()
{
if(m_serial!=nullptr)
{
delete m_serial;
}
}
void SerialThread::initSerial()
{
m_serial = new QSerialPort(/*this*/);
getPortNum();
// connect(m_serial, static_cast<void (QSerialPort::*)(QSerialPort::SerialPortError)>(&QSerialPort::error), this, &SerialThread::handleSerialError);
connect(m_serial, &QSerialPort::readyRead, this, &SerialThread::receiveData);
}
bool SerialThread::isOpenPort()
{
if(m_serial->isOpen())
return true;
else
return false;
}
void SerialThread::closePort()
{
m_serial->close();
}
void SerialThread::getPortNum()
{
if(!CommPortList.isEmpty())
CommPortList.clear();
//遍历串口号保存
foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
{
CommPortList.append(info.portName());
}
emit getcomPortList(CommPortList);
}
void SerialThread::handleSerialError(QSerialPort::SerialPortError error)
{
if(error == QSerialPort::ResourceError)
{
emit linkError(error);
}
}
bool SerialThread::openSerial(QString strPortNum, int nBaudRate, int nParityType, int nDataBits, int nStopBits, int nFlowCtrl)
{
m_serial->setPortName(strPortNum);
m_serial->setBaudRate(nBaudRate);
switch (nParityType)
{
case 0:
m_serial->setParity(QSerialPort::NoParity);
break;
case 1:
m_serial->setParity(QSerialPort::OddParity);
break;
case 2:
m_serial->setParity(QSerialPort::EvenParity);
break;
case 3:
m_serial->setParity(QSerialPort::MarkParity);
break;
case 4:
m_serial->setParity(QSerialPort::SpaceParity);
break;
default:
m_serial->setParity(QSerialPort::UnknownParity);
break;
}
switch (nDataBits)
{
case 5:
m_serial->setDataBits(QSerialPort::Data5);
break;
case 6:
m_serial->setDataBits(QSerialPort::Data6);
break;
case 7:
m_serial->setDataBits(QSerialPort::Data7);
break;
case 8:
m_serial->setDataBits(QSerialPort::Data8);
break;
default:
m_serial->setDataBits(QSerialPort::UnknownDataBits);
break;
}
switch (nStopBits)
{
case 0:
m_serial->setStopBits(QSerialPort::OneStop);
break;
case 1:
m_serial->setStopBits(QSerialPort::OneAndHalfStop);
break;
case 2:
m_serial->setStopBits(QSerialPort::TwoStop);
break;
default:
m_serial->setStopBits(QSerialPort::UnknownStopBits);
break;
}
switch (nFlowCtrl)
{
case 0:
m_serial->setFlowControl(QSerialPort::NoFlowControl);
break;
case 1:
m_serial->setFlowControl(QSerialPort::HardwareControl);
break;
case 2:
m_serial->setFlowControl(QSerialPort::SoftwareControl);
break;
default:
m_serial->setFlowControl(QSerialPort::UnknownFlowControl);
break;
}
if( !m_serial->open((QIODevice::ReadWrite)) )//打开失败
{
return false;
}
m_serial->setReadBufferSize(SERIAL_READ_BUFF);
return true;
}
void SerialThread::receiveData()
{
m_serial->waitForReadyRead(10);
QByteArray bytes = m_serial->readAll();
emit receData(bytes,bytes.length());
}
void SerialThread::writeData(QByteArray byteArray)
{
m_serial->write(byteArray);
}
保存数据
saveconfigthread.h
#ifndef SAVECONFIGTHREAD_H
#define SAVECONFIGTHREAD_H
#include <QObject>
#include <QSettings>
class SaveConfigThread : public QObject
{
Q_OBJECT
public:
explicit SaveConfigThread(QObject *parent = nullptr);
~SaveConfigThread();
void WriteInit(QString key, QString value);
void ReadInit(QString key, QString &value);
signals:
private:
QSettings *saveConfig;
};
#endif // SAVECONFIGTHREAD_H
#include "saveconfigthread.h"
SaveConfigThread::SaveConfigThread(QObject *parent) : QObject(parent)
{
QString path = "config.ini";
//创建配置文件操作对象
saveConfig = new QSettings(path, QSettings::IniFormat);
}
SaveConfigThread::~SaveConfigThread()
{
if(saveConfig!=nullptr)
{
delete saveConfig;
}
}
void SaveConfigThread::WriteInit(QString key, QString value)
{
QString path = "config.ini";
//将信息写入配置文件
saveConfig->beginGroup("config");
saveConfig->setValue(key, value);
saveConfig->endGroup();
}
void SaveConfigThread::ReadInit(QString key, QString &value)
{
value = QString("");
//读取配置信息
value = saveConfig->value(QString("config/") + key).toString();
}