.h文件
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QDebug>
#include <QQueue>
#include <QTimer>
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>
#include "ConfigFileXiaoNiao.h"
/************************************************************************/
/* 串口通道,向转发客户端发送 */
/************************************************************************/
class MsgSendBySerialPortPass : public QObject
{
Q_OBJECT
public:
MsgSendBySerialPortPass(const SERIALPASSLIST&);
MsgSendBySerialPortPass(QObject * ptr = NULL);
void initPass();
static MsgSendBySerialPortPass *GetInstance();
~MsgSendBySerialPortPass();
void setSerialInfo(SERIALPASSLIST);
void manageRecvMsg(QByteArray msg);//指令处理
void callBackSendData(QByteArray strData);
void sendMsgToTarget(QByteArray);//往目标发送指令
QString getPassID() { return m_passId; }//获取通道ID
private slots:
void slotSengDealMsg(QByteArray);//发送处理数据
void slotRecvData();//接收指令
void startTimers();
signals:
void sigUpdateWidget(QString);
private:
QSerialPort *serial;//串口通信
QString m_passId;//通道ID
int iBagNum;//包个数
QQueue<QByteArray> m_MessageQueue;//控制命令消息队列
QTimer *timer;
};
#endif // MAINWINDOW_H
.cpp文件
#include "MsgSendBySerialPortPass.h"
#include <windows.h>
MsgSendBySerialPortPass::MsgSendBySerialPortPass(const SERIALPASSLIST& info)
{
}
MsgSendBySerialPortPass::MsgSendBySerialPortPass(QObject * ptr /*= NULL*/)
{
}
void MsgSendBySerialPortPass::initPass()
{
timer = new QTimer(this);
timer->setTimerType(Qt::PreciseTimer);
connect(timer, SIGNAL(timeout()), this, SLOT(startTimers()));
timer->start(150);
SERIALPASSLIST serialInfo = ConfigFile::GetInstance()->getSerialPass();//读取串口配置信息
setSerialInfo(serialInfo);
}
MsgSendBySerialPortPass *MsgSendBySerialPortPass::GetInstance()
{
static MsgSendBySerialPortPass* pInstance = NULL;
if (pInstance == NULL)
{
pInstance = new MsgSendBySerialPortPass();
}
return pInstance;
}
MsgSendBySerialPortPass::~MsgSendBySerialPortPass()
{
if (serial->isOpen())
{
serial->close();
}
delete serial;
}
void MsgSendBySerialPortPass::setSerialInfo(SERIALPASSLIST info)
{
serial = new QSerialPort;
//设置串口名
serial->setPortName(info.passName);
//打开串口
bool bopen = serial->open(QIODevice::ReadWrite);
if (!bopen)
{
//串口打开失败
return;
}
//设置波特率
serial->setBaudRate(info.passBaud.toInt());
//设置数据位数
if (info.passData == "5")
{
serial->setDataBits(QSerialPort::Data5);
}
else if (info.passData == "6")
{
serial->setDataBits(QSerialPort::Data6);
}
else if (info.passData == "6")
{
serial->setDataBits(QSerialPort::Data7);
}
else
{
serial->setDataBits(QSerialPort::Data8);
}
//设置奇偶校验
if (info.passParity == "None")
{
serial->setParity(QSerialPort::NoParity);
}
//设置停止位
if (info.passStop == "1")
{
serial->setStopBits(QSerialPort::OneStop);
}
else if (info.passStop == "2")
{
serial->setStopBits(QSerialPort::TwoStop);
}
//设置流控制
serial->setFlowControl(QSerialPort::NoFlowControl);
//连接信号槽
connect(serial, &QSerialPort::readyRead, this, &MsgSendBySerialPortPass::slotRecvData);
}
void MsgSendBySerialPortPass::manageRecvMsg(QByteArray msg)
{
if (msg.size() > 4096)
{
callBackSendData(msg);
}
else
{
sendMsgToTarget(msg);
}
}
void MsgSendBySerialPortPass::callBackSendData(QByteArray strData)
{
QByteArray msg = strData.left(4096);
sendMsgToTarget(msg);
//延时发送,防止丢包
QByteArray rightdata = strData.remove(0,4096);
if (rightdata.size() > 4096)
{
callBackSendData(rightdata);
}
else
{
sendMsgToTarget(rightdata);
}
}
void MsgSendBySerialPortPass::sendMsgToTarget(QByteArray array)
{
serial->write(array,array.length());
serial->flush();
}
//发送数据
void MsgSendBySerialPortPass::slotSengDealMsg(QByteArray array)
{
if (m_MessageQueue.size() < 10)
{
m_MessageQueue.enqueue(array);
}
}
//读取接收到的数据
void MsgSendBySerialPortPass::slotRecvData()
{
QByteArray buf;
buf = serial->readAll();
if (!buf.isEmpty())
{
QString str = QString::fromLocal8Bit(buf);
sigUpdateWidget(str);
}
buf.clear();
}
void MsgSendBySerialPortPass::startTimers()
{
if (m_MessageQueue.size()>0)
{
QByteArray array = m_MessageQueue.dequeue();
manageRecvMsg(array);
}
}