二段归刃——4十刃 2023-10-30 16:54 采纳率: 50%
浏览 9
已结题

QT串口在槽函数没有结束前把数据发送

请问有没有人知道QT能不能在一个按钮槽函数内进行串口数据交互

void RTU::on_pushButton_2_clicked()
{
        openarray[0] = 0xC4;
        openarray[1] = 0xC4;
        openarray[2] = 0xC4;
        serial->write(openarray);
        QThread::msleep(300);
        recv_array = serial->readAll();
        while(1)
        {
              if(recv_array[0] == (char)0xff) break;
        }
}

如上,如果这是一个槽函数,槽函数没结束之前是发不出数据也收不到数据的,上面这个循环永远不能退出
要做什么操作才能实现这个功能?

注意:相应串口设置是已经完成的了,正常打开串口也能发送和接收,现在是想在按钮按下就能发送数据出去;
并且接收回我想要的数据这个槽函数才算完成,才会退出。

  • 写回答

4条回答 默认 最新

  • Minuw 2023-10-30 17:28
    关注

    参考gpt
    在Qt中,槽函数是在主线程中执行的,如果在槽函数中执行一个长时间的操作,会导致界面无响应,因为主线程被阻塞了。

    为了避免阻塞主线程,可以考虑使用多线程来处理串口数据交互。可以将串口通信的操作放在一个单独的线程中进行,而不是在槽函数中执行。

    以下是一个简单的示例代码,演示了如何在一个按钮槽函数内进行串口数据交互,并在接收到指定数据后退出槽函数:

    // 在类的头文件中定义一个QThread子类,用于处理串口通信
    class SerialThread : public QThread
    {
        Q_OBJECT
    public:
        explicit SerialThread(QObject* parent = nullptr);
        void run() override;
    
    signals:
        void receivedData(const QByteArray& data);
    };
    
    // 在类的源文件中实现SerialThread类
    SerialThread::SerialThread(QObject* parent) : QThread(parent)
    {
    }
    
    void SerialThread::run()
    {
        QByteArray openarray;
        openarray.append(0xC4);
        openarray.append(0xC4);
        openarray.append(0xC4);
    
        // 在这里执行串口通信操作,发送数据并接收数据
        // 你可以使用Qt的QSerialPort类来进行串口通信
    
        // 发送数据
        serial->write(openarray);
        serial->waitForBytesWritten(300);
    
        // 接收数据
        QByteArray recv_array;
        while (true)
        {
            recv_array = serial->readAll();
            if (recv_array[0] == (char)0xff)
                break;
        }
    
        // 发送接收到的数据给主线程
        emit receivedData(recv_array);
    }
    
    // 在类的头文件中定义一个槽函数,用于接收SerialThread发送的数据
    public slots:
        void handleReceivedData(const QByteArray& data);
    
    // 在类的源文件中实现槽函数
    void YourClass::handleReceivedData(const QByteArray& data)
    {
        // 处理接收到的数据
        // 这里可以更新界面或者执行其他操作
    }
    
    // 在按钮的槽函数中创建并启动SerialThread
    void YourClass::on_pushButton_2_clicked()
    {
        // 创建SerialThread对象
        SerialThread* serialThread = new SerialThread(this);
    
        // 连接SerialThread的receivedData信号到handleReceivedData槽函数
        connect(serialThread, &SerialThread::receivedData, this, &YourClass::handleReceivedData);
    
        // 启动SerialThread
        serialThread->start();
    }
    

    在上述示例代码中,我们将串口通信的操作放在了一个单独的线程SerialThread中,通过信号和槽机制将接收到的数据发送给主线程进行处理。这样就避免了在槽函数中阻塞主线程的问题。

    请注意,上述示例代码中的串口通信部分需要根据你的具体情况进行修改,例如使用Qt的QSerialPort类来进行串口通信操作。

    希望这个示例能对你有所帮助!如果有任何其他问题,请随时提问。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 11月7日
  • 已采纳回答 10月30日
  • 修改了问题 10月30日
  • 创建了问题 10月30日

悬赏问题

  • ¥20 python忆阻器数字识别
  • ¥15 无法输出helloworld
  • ¥15 高通uboot 打印ubi init err 22
  • ¥20 PDF元数据中的XMP媒体管理属性
  • ¥15 R语言中lasso回归报错
  • ¥15 网站突然不能访问了,上午还好好的
  • ¥15 有没有dl可以帮弄”我去图书馆”秒选道具和积分
  • ¥15 semrush,SEO,内嵌网站,api
  • ¥15 Stata:为什么reghdfe后的因变量没有被发现识别啊
  • ¥15 振荡电路,ADS仿真