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

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

...全文
123 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对应的多线程版本,网友可以帮忙改写一下吗?
C#串口介绍以及简单串口通信程序设计实现 源代码和串口程序介绍连接:https://www.cnblogs.com/JiYF/p/6618696.html 本站积分太贵,自己变得。。直接到连接地址下载代码 周末,没事干,写个简单的串口通信工具,也算是本周末曾来过,废话不多,直接到主题 串口介绍   串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方式的扩展接口。(至于再详细,自己百度) 串口应用:   工业领域使用较多,比如:数据采集,设备控制等等,好多都是用串口通信来实现!你要是细心的话,你会发现,目前家用国网智能电能表就具备RS485通信总线(串行总线的一种)与RS232可以相互转化(当然一般,非专业的谁也不会闲的蛋疼,趴电表上瞎看,最多也就看看走了多少度电) RS232 DB9介绍: 1.示意图 2.针脚介绍: 载波检测(DCD) 接受数据(RXD) 发出数据(TXD) 数据终端准备好(DTR) 信号地线(SG) 数据准备好(DSR) 求发送(RTS) 清除发送(CTS) 振铃指示(RI) 3.实物图: 以下是我购买XX公司的一个usb转串口线:这个头就是一个公头,另一端是一个usb口 笨小孩串口工具运行图: 1.开启程序 2.发送一行字符串HelloBenXH,直接将针脚的发送和接收链接起来就可以测试了(针脚2 接受数据(RXD) 和3 发出数据(TXD))直接链接, C#代码实现:采用SerialPort 1.实例化一个SerialPort [csharp] view plain copy 在CODE上查看代码片派生到我的代码片 private SerialPort ComDevice = new SerialPort(); 2.初始化参数绑定接收数据事件 [csharp] view plain copy 在CODE上查看代码片派生到我的代码片 public void init() { btnSend.Enabled = false; cbbComList.Items.AddRange(SerialPort.GetPortNames()); if (cbbComList.Items.Count > 0) { cbbComList.SelectedIndex = 0; } cbbBaudRate.SelectedIndex = 5; cbbDataBits.SelectedIndex = 0; cbbParity.SelectedIndex = 0; cbbStopBits.SelectedIndex = 0; pictureBox1.BackgroundImage = Properties.Resources.red; ComDevice.DataReceived += new SerialDataReceivedEventHandler(Com_DataReceived);//绑定事件 }

16,817

社区成员

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

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