用qt写一个串口接收类
以下是一个简单的串口接收类的示例,使用Qt的QSerialPort类:
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>
#include <QTimer>
class SerialReceiver : public QObject
{
Q_OBJECT
public:
explicit SerialReceiver(QObject *parent = nullptr);
~SerialReceiver();
signals:
void receivedData(const QByteArray &data);
public slots:
void openSerialPort(QString portName, int baudRate);
void closeSerialPort();
private slots:
void readData();
private:
QSerialPort *m_serialPort;
QTimer *m_timer;
};
在实现文件中:
SerialReceiver::SerialReceiver(QObject *parent)
: QObject(parent)
, m_serialPort(nullptr)
, m_timer(nullptr)
{
}
SerialReceiver::~SerialReceiver()
{
closeSerialPort();
}
void SerialReceiver::openSerialPort(QString portName, int baudRate)
{
if (m_serialPort) {
closeSerialPort();
}
m_serialPort = new QSerialPort(portName, this);
m_serialPort->setBaudRate(baudRate);
if (m_serialPort->open(QIODevice::ReadOnly)) {
m_timer = new QTimer(this);
connect(m_timer, &QTimer::timeout, this, &SerialReceiver::readData);
m_timer->start(100); // 100ms定时读取
} else {
delete m_serialPort;
m_serialPort = nullptr;
}
}
void SerialReceiver::closeSerialPort()
{
if (m_serialPort) {
m_serialPort->close();
delete m_serialPort;
m_serialPort = nullptr;
}
if (m_timer) {
m_timer->stop();
delete m_timer;
m_timer = nullptr;
}
}
void SerialReceiver::readData()
{
if (m_serialPort && m_serialPort->bytesAvailable() > 0) {
QByteArray data = m_serialPort->readAll();
emit receivedData(data);
}
}
使用示例:
SerialReceiver *receiver = new SerialReceiver(this);
connect(receiver, &SerialReceiver::receivedData, this, &MyClass::onReceivedData);
receiver->openSerialPort("COM1", 9600);
void MyClass::onReceivedData(const QByteArray &data)
{
// 处理接收到的数据
}
原文地址: https://www.cveoy.top/t/topic/qYq 著作权归作者所有。请勿转载和采集!