专栏首页Pou光明Qt串口调试助手

Qt串口调试助手

如果大家以前搞过单片机,那么对串口调试助手一定不陌生。各种助手可以方便我们做一些测试、定位一些问题。今天和大家分享一下用Qt开发的跨平台串口调试助手。

先来一张效果图:

其他串口调试助手:

程序的主体构成:

PortSettings:类封装了串口的名称、波特率、数据位、校验位、停止位和流控等一系列属性;

CommunicationThread:类在线程中接收和发送数据,防止数据量大的时候阻塞主UI线程。

SerialPortMainWindow:UI类,设置串口通信属性、数据收发属性等。

重点说几个函数:

①主UI中打开串口

void SerialPortMainWindow::on_pbn_openSerialport_clicked()
{
    updatePortSettings();

    if(!m_serialportStatus)
    {
        m_communicationThread = new CommunicationThread;

      connect(m_communicationThread,SIGNAL(signal_serialportStatus(bool)),
                this,SLOT(slot_serialportStatus(bool)));

        connect(m_communicationThread,SIGNAL(signal_recvData(QByteArray)),
                this,SLOT(slot_recvData(QByteArray)));

        m_communicationThread->setSerialportParam(m_portSetting);

        if(!m_communicationThread->isRunning())
        {
            m_communicationThread->start();
        }
    }
    else
    {
        m_serialportStatus = false;
        m_communicationThread->stopThread();
        delete m_communicationThread;
        m_communicationThread = NULL;

        QIcon buttonIcon(":/myresources/Resources/led/open.png");
        ui->pbn_openSerialport->setIcon(buttonIcon);
        ui->pbn_openSerialport->setIconSize(QSize(130,40));
    }
}

打开/关闭串口,如果串口是关闭状态,则打开串口,反之则关闭串口。注意这里面没有检查是否有可用串口。如果有可用串口,则创建新的串口通信实例,建立相关信号和槽。

串口打开成功显示绿色的灯,是通过给按钮添加图标来实现的。

这里提一下,Ascii与Hex的转换需要通过一个封装的函数实现。

②通信线程中的处理

void CommunicationThread::run()
{
    m_serialPort = new QSerialPort;
    bool ret = m_serialPort->open(QIODevice::ReadWrite);
    emit signal_serialportStatus(ret);

    while(!m_quitThread && ret)
    {
        QByteArray readData = m_serialPort->readAll();
        while (m_serialPort->waitForReadyRead(5))
            readData += m_serialPort->readAll();

        if(!readData.isEmpty())
        {
            emit signal_recvData(readData);
        }
        if(!m_sendDataQueue.isEmpty())
        {
            m_serialPort->write(m_sendDataQueue.dequeue());
        }
    }
}

在run()中实例化m_serialPort,继承QThread重新实现run()函数,只有run()中的部分运行在线程中。主UI中如果要发送数据,则先让数据进入m_sendDataQueue队列中,m_serialPort再将队列中数据发送出去。使用readAll()读取数据,通过信号将数据发送出去。

Qt中线程间通讯可以使用信号和槽、队列等通讯方式。

Windows下为程序设置图标:

pro中添加 RC_FILE = Resources/serialIcon.rc

serialIcon.rc 中的内容:

IDI_ICON1 ICON DISCARDABLE "icon/serialPortAssistant.ico"

Ubuntu 下为程序设置桌面图标:

具体方法可参见之前的文章。

Linux下Qt程序打包发布并设置图标

UI布局效果:

程序无需修改,可直接在Windows与ubuntu下直接运行。

本文分享自微信公众号 - Pou光明(pou0230),作者:PouG

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-10-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Qt线程中使用Socket客户端通信

    在编写一般程序中,通常将通信部分与数据处理部分单独放到一个线程或进程(Python由于GIL锁需要使用进程),这样可保证程序的快速响应,数据处理不会对其他部分造...

    用户5908113
  • Linux C Socket Api详解

    以前都只是在网上搜的能用的例子,对一些参数不是很清楚,这次汇总。而且网络通信还是很常用的通信手段。

    用户5908113
  • python 日志输出到终端与文件配置

    最近一段时间由于工作原因,用了一段时间python。接触到了坑爹的GIL锁、python日志,多进程、进程间通讯等。这次主要和大家聊一聊python日志。

    用户5908113
  • Linux基础(串口编程)

    虽然以太网接口和USB接口也是以一个串行流进行数据传送的,但是串口连接通常特指那些与RS-232标准兼容的硬件或者调制解调器的接口。废话少讲,今天来解剖使用串口...

    用户2617681
  • tcp回显客户端发送的数据

    skylark
  • python编写简单聊天程序

    渔父歌
  • 不可描述⁄( ⁄•⁄ω⁄•⁄ )⁄!亚马逊用机器学习找有声书中情色片段

    安妮 编译整理 量子位 出品 | 公众号 QbitAI ? 醉翁之意不在酒(〃∇〃) 你得承认,有的时候看言情小说不是因为里面的情节有多赞,也不是因为它的文学价...

    量子位
  • k8s部署Kafka集群

    本次的目的是通过使用k8s搭建一个三节点的kafka集群,因为kafka集群需要用到存储,所以我们需要准备三个持久卷(Persistent Volume) 简称...

    yukong
  • Java8学习(4)-Stream流

    Stream和Collection的区别是什么 流和集合的区别是什么? 粗略地说, 集合和流之间的差异就在于什么时候进行计算。集合是一个内存中的数据结构,它包...

    Ryan-Miao
  • “刷一波” 程序员面试题,掌握八成便可BATJ一试~

    最近看见了很多程序员成功入的BAT,小编这里在网上搜集了一些国内一线互联网公司的面试题和面试技巧,特此整理分享给需要的技术人员,看你和BAT之间差了多少!

    Java架构技术

扫码关注云+社区

领取腾讯云代金券