// .h
#ifndef TIMINGSYSWORKER_H
#define TIMINGSYSWORKER_H
#include <QObject>
#include <QSerialPort>
#include <QSerialPortInfo>
#include "setting/setting.h"
#include<qthread.h>
class TimingSysWorker : public QObject
{
Q_OBJECT
public:
explicit TimingSysWorker(QObject *parent = nullptr);
~TimingSysWorker();
void setPortName(const QString& strName);
void setBaudrate(int nBaudrate);
signals:
void sig_recv(QByteArray ba);
void serialOpenRes(int deviceId,bool);//串口打开结果
public slots:
//初始化并打开串口
void slot_initSerial(int deviceId);
void slot_readReady();
void slot_sendcmd(QByteArray);
private:
QSerialPort* m_pQSerialPort;
//串口名
QString m_strPortName;
//波特率
int m_nBaudrate;
bool m_isOpen = false;
QByteArray m_baBuff;
};
#endif // TIMINGSYSWORKER_H
// .cpp
#include "TimingSysWorker.h"
#include <QDebug>
TimingSysWorker::TimingSysWorker(QObject *parent) : QObject(parent)
{
m_pQSerialPort = nullptr;
}
TimingSysWorker::~TimingSysWorker()
{
if(m_pQSerialPort)
{
if(m_pQSerialPort->isOpen()){
m_pQSerialPort->close();
delete m_pQSerialPort;
m_pQSerialPort=nullptr;
}
}
}
void TimingSysWorker::setBaudrate(int nBaudrate)
{
m_nBaudrate = nBaudrate;
}
void TimingSysWorker::setPortName(const QString &strName)
{
m_strPortName = strName;
}
void TimingSysWorker::slot_initSerial(int deviceId)
{
if(nullptr==m_pQSerialPort)
{
m_pQSerialPort = new QSerialPort;
}
bool bExist=false;
foreach (const QSerialPortInfo&info, QSerialPortInfo::availablePorts())
{
if(info.portName()==m_strPortName)
{
m_pQSerialPort->setPortName(info.systemLocation());
bExist=true;
}
}
if(!bExist)
{
qDebug()<<QStringLiteral("串口%1不存在").arg(m_strPortName);
}
if(m_pQSerialPort)
{
//m_pQSerialPort->setRequestToSend(true);//设置422串口全双工通信,这个串口默认不是全双工,导致只能收,不能发
connect(m_pQSerialPort,&QSerialPort::readyRead,this,&TimingSysWorker::slot_readReady);
//设置波特率
m_pQSerialPort->setBaudRate(m_nBaudrate,QSerialPort::AllDirections);
//设置数据位
m_pQSerialPort->setDataBits(QSerialPort::Data8);
//设置校验位
m_pQSerialPort->setParity(QSerialPort::NoParity);
//设置停止位
m_pQSerialPort->setStopBits(QSerialPort::OneStop);
//流量控制
m_pQSerialPort->setFlowControl(QSerialPort::NoFlowControl);
bool bRet = m_pQSerialPort->open(QIODevice::ReadWrite);//打开串口并选择读写模式
if(bRet)
{
m_isOpen = true;
m_pQSerialPort->setRequestToSend(true);//设置串口全双工通信,这个串口默认不是全双工,导致只能收,不能发。
//qDebug()<<"Open serial "<<m_strPortName << "successfully";
}
else {
//qDebug()<<"Open serial "<<m_strPortName << "failed";
//serialOpenRes(deviceId,false);//打开失败,则重新绑定
}
}
}
void TimingSysWorker::slot_readReady()
{
//先缓存
m_baBuff.append(ba);
//判断缓存中第一个字符是不是$,最后一个字符是不是换行符,如果二者皆成立表示收到了一个完整帧
if('$' == m_baBuff.at(0) && '\n' == m_baBuff.at(m_baBuff.size()-1))
{
emit sig_timingData(m_baBuff);
m_baBuff.clear();
}
}
void TimingSysWorker::slot_sendcmd(QByteArray ba)
{
m_pQSerialPort->write(ba);
m_pQSerialPort->flush();
}