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();
}
测试的时候要用串口调试工具发送数据。