16,813
社区成员




//----------------------serialwork.h ----------------------//
#include <QObject>
#include <QSerialPort>
void print_dataHex(unsigned char* pdatav,int len);
class serialwork : public QObject
{
Q_OBJECT
public:
explicit serialwork(QObject *parent = nullptr);
~serialwork();
unsigned char* obtainCache();
bool serialprepared();
signals:
void sendResultToGUI(int byteslen);
public slots:
void HandleWriteData(unsigned char *pin,int len);
void HandleReadData();
private:
QSerialPort *serl;
unsigned char pReadData[200];
int nReadcount;
};
//-----------------------serialwork.cpp ----------------------//
#include "serialwork.h"
#include <QDebug>
#include <QThread>
void print_dataHex(unsigned char* pdatav,int len)
{
if(!pdatav || len<1)
return;
char vvp[300];
int len2 = 300/3;
if(len2>=len)len2=len;
int i,k;
for(i=0;i<len2;i++)
{
k = 3*i;
sprintf_s(vvp+k,300-k," %02X",pdatav[i]);
}
qDebug()<<vvp;
}
serialwork::serialwork(QObject *parent)
: QObject{parent}
{
serl = new QSerialPort(this);
serl->setPortName("COM3");
serl->setBaudRate(9600);
serl->setStopBits(QSerialPort::OneStop);
serl->setDataBits(QSerialPort::Data8);
serl->setParity(QSerialPort::NoParity);
serl->setFlowControl(QSerialPort::NoFlowControl);
if(serl->open(QIODevice::ReadWrite))
{
qDebug()<<"串口打开成功";
}
else
qDebug()<<"串口打开失败";
memset(pReadData,0,200);
nReadcount = 0;
connect(serl,&QSerialPort::readyRead,this,&serialwork::HandleReadData);
}
serialwork::~serialwork()
{
if(serl)
{
serl->close();
delete serl;
qDebug()<<"the serialport released!";
}
}
unsigned char* serialwork::obtainCache()
{
return pReadData;
}
bool serialwork::serialprepared()
{
return true;
}
void serialwork::HandleWriteData(unsigned char *pin,int len)
{
serl->write((char*)pin,len);
qDebug()<<"Thread ID"<<QThread::currentThreadId()<<"send "<<len<<" bytes";
}
void serialwork::HandleReadData()
{
QByteArray ret = serl->readAll();
nReadcount = ret.length();
if(nReadcount>0)
{
if(nReadcount>200)nReadcount=200;
memcpy_s(pReadData,200,ret.data(),nReadcount);
qDebug()<<"Thread ID"<<QThread::currentThreadId()<<"get "<<nReadcount<<" bytes";
sendResultToGUI(nReadcount);
}
}
//------------------------mainwnd.h
//...
public:
QThread mthreads;
serialwork *pwork;
signals:
void processSend(unsigned char *pin,int len);
private slots:
void processRead(int getlen){qDebug()<<getlen;}
//-------------------------mainwnd.cpp初始化
pwork = new serialwork(this);
pwork->moveToThread(&mthreads);
connect(&mthreads,&QThread::finished,pwork,&serialwork::deleteLater);
connect(this,&MainWindow::processSend,pwork,&serialwork::HandleWriteData);
connect(pwork,&serialwork::sendResultToGUI,this,&MainWindow::processRead);
mthreads.start();
qDebug()<<"Thread ID"<<QThread::currentThreadId()<<" create the worker.";
// 发现这里打印的线程ID和work里面打印的线程ID是一样的?就是说没有成功放到子线程里面去
//请问这个怎么调整一下的,谢谢
参考的网友的代码,但是问题是测试时发现读写串口并没有在另一个子线程里面实施,求指导下,谢谢
pwork = new serialwork(this);
==》
pwork = new serialwork(0);
connect(&mthreads,&QThread::finished,pwork,&serialwork::deleteLater,Qt::queuedConnection);
connect(this,&MainWindow::processSend,pwork,&serialwork::HandleWriteData,Qt::queuedConnection);
connect(pwork,&serialwork::sendResultToGUI,this,&MainWindow::processRead,Qt::queuedConnection);