Qt串口编程

         Qt提供了QSerialPort类供我们读写串口,使用该类可以方便的对串口进行读写,下面是一个简单的例子:

#ifndef SERIAL_PORT_H
#define SERIAL_PORT_H

#include <QObject>
#include <QtSerialPort/QSerialPort>

class SerialPort : public QObject
{
    Q_OBJECT
signals:
    void GetData(const QByteArray &Data);

public:
    SerialPort();
    void Setup(const QString &PortName, int BaudRate, int ByteSize, int Parity, int StopBits);
    bool CheckData(const QByteArray &Data);
    virtual ~SerialPort();

public slots:
    void ReadData();
    void WriteData(const QByteArray &Data);
    void HandleError(QSerialPort::SerialPortError Err);

private:
    QSerialPort *m_Serial;
    QByteArray  m_RecvData;
};

#endif


#include "SerialPort.h"

#include <QDebug>
//Message Format: head:2 bytes(0xFF,0xEE) | Command:1 byte | Data Size:1 byte  | Data:DataSize bytes 
SerialPort::SerialPort()
{
    m_Serial = NULL;
}


SerialPort::~SerialPort()
{
    m_Serial->close();
}

void SerialPort::Setup(const QString &PortName, int BaudRate, int ByteSize, int Parity, int StopBits)
{
    m_Serial = new QSerialPort(this);
    m_Serial->setPortName(PortName);
    m_Serial->setBaudRate(BaudRate);
    m_Serial->setDataBits(QSerialPort::DataBits(ByteSize));
    m_Serial->setParity(QSerialPort::Parity(Parity));
    m_Serial->setStopBits(QSerialPort::StopBits(StopBits));
    m_Serial->open(QIODevice::ReadWrite);
    
    connect(m_Serial, SIGNAL(error(QSerialPort::SerialPortError)), this, SLOT(HandleError(QSerialPort::SerialPortError)));
    connect(m_Serial, SIGNAL(readyRead()), this, SLOT(ReadData()));
    connect(this, SIGNAL(GetData(QByteArray)), this, SLOT(WriteData(QByteArray)));
}

void SerialPort::ReadData()
{
    m_RecvData += m_Serial->readAll();
    
    if (CheckData(m_RecvData))
    {
        int TotalLen = 2 + 1 + 1 + m_RecvData.at(3);

        QByteArray DataForSend = m_RecvData.left(TotalLen);
        m_RecvData.remove(0, TotalLen);

        qDebug() << DataForSend.toHex() << "\n";

        emit GetData(DataForSend);
    }

}

void SerialPort::WriteData(const QByteArray &Data)
{
    int m = m_Serial->write(Data);
}

void SerialPort::HandleError(QSerialPort::SerialPortError Err)
{
    qDebug() << "Error Occure" << "\n";
}

bool SerialPort::CheckData(const QByteArray &Data)
{
    bool Ret = false;
    if (Data.size() >= 4)
    {
        const char *ConstData = Data.constData();
        int TotalLen = 2 + 1 + 1 + ConstData[3];

        Ret = ((unsigned char)ConstData[0] == 0xFF && (unsigned char)ConstData[1] == 0xEE && 
            Data.size() >= TotalLen );
    }

    return Ret;
}

测试代码:

#include "SerialPort.h"

#include <Windows.h>
#include <QtCore/QCoreApplication>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    SerialPort Port;
    Port.Setup(QString("COM7"), 9600, 8, 0, 0);

//     char m[] = {0xFF, 0xEE, 0x0A, 0x09, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, '\0'};
//     QByteArray Data(m, 13); 
// 
//     for (int i = 0; i < 100; i++)
//     {
//         Sleep(1000);
//         Port.WriteData(Data);
//     }
    return a.exec();
}

测试的时候要用串口调试工具发送数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值