请帮忙看看这个QSerialport串口通讯问题

公共马甲0315 2025-06-12 17:36:18

//----------------------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是一样的?就是说没有成功放到子线程里面去
//请问这个怎么调整一下的,谢谢

参考的网友的代码,但是问题是测试时发现读写串口并没有在另一个子线程里面实施,求指导下,谢谢

...全文
83 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复

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);

  • 举报
回复
@CEStudioAdmin 我下了一个源代码,看了一下QT里面的serialport类,实际上是有个QSerialport_p.h的头文件,然后在宏定义条件下,分别映射成QSerialport_win.cpp和QSerialport_unix.cpp来实现的,完了我想继承这个类,QSerialport_private(),然后改写unix.cpp的部分,让它不自动emit信号量,但是编译不通过,moc_XXX.cpp的路径不正确。。。。
  • 举报
回复
@公共马甲0315 https://blog.csdn.net/newTTTTTT/article/details/136270056?spm=1001.2014.3001.5502这里已经有windows QT多线程的版本了,现在我还缺少linux对应的多线程版本,网友可以帮忙改写一下吗?

16,813

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧