QT之串口通信和多线程处理

这篇具有很好参考价值的文章主要介绍了QT之串口通信和多线程处理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

  使用QT的多线程编程,完成串口通信助手的设计。

实施

Qt5下的串口编程

  使用QT5.12中自带的QSerialPort和QSerialPortInf的类实现对串口硬件的访问,通过对类的方法进行操作,完成整个串口的控制。整个操作基于类的实例,能够快速部署。这里需要明确层次的概念。串口类,提供了整个串口通信需要的方法,可以直接用于串口的使用。打开串口,即指示该类打开底层串口缓存区,建立连接,实现数据的访问。读取数据,在打开串口的条件下,对缓存区的数据进行操作,确保可以得到正确的数据。这三个层次就是串口编程的基本概念。为了降低数据处理对整个界面的影响,将数据通过变量传递给多线程下的数据处理模块。

串口部分的功能设计

//采用指针分配空间的方法实现类的操作
void DialogUart::on_btnUartOpen_clicked()
{
    serial = new QSerialPort;
    qDebug()<<"uart is open";
}


void DialogUart::on_btnUartClose_clicked()
{
    delete serial;
    qDebug()<<"uart is close";
}
//采用函数的方法实现串口配置及打开
void DialogUart::on_btnConnect_clicked()
{
    //设置串口名
    serial->setPortName("COM1");
    //设置波特率
    serial->setBaudRate(QSerialPort::Baud9600);
    //设置数据位数
    serial->setDataBits(QSerialPort::Data8);
    //设置奇偶校验
    serial->setParity(QSerialPort::NoParity);
    //设置停止位
    serial->setStopBits(QSerialPort::OneStop);
    //设置流控制
    serial->setFlowControl(QSerialPort::NoFlowControl);
    serial->open(QIODevice::ReadWrite);
}


void DialogUart::on_btnDisConnect_clicked()
{
    serial->close();
}

//采用按键控制接收数据(仅用于测试,实际使用中应使用信号触发,防止读取多余的数据)
void DialogUart::on_readAll_clicked()
{
    QByteArray buf_read;
    buf_read = serial->readAll();
    QString recv = ui->readText->toPlainText();
    recv += QString(buf_read);
    ui->readText->clear();
    ui->readText->append(recv);
}
//采用按键控制写入
void DialogUart::on_writeAll_clicked()
{
    QByteArray buf_write;
    buf_write = ui->writeText->text().toUtf8();
    serial->write(buf_write);
}

  整个控制还是比较清晰的。这里基本上满足了串口调试的常用需求,但是缺少一些控制界面。这些通过控件关联到参数即可。

串口 多线程,qt,ui,单片机

  在这个简单的串口控制的基础上,增加一些多线程控制的功能,用于实现一些数据的自动化处理。

多线程部分的编程

  这里多线程采用简单的继承QThread的方法,利用run函数的重构进行部分复杂功能的后台运行。根据需求,这里采用正则匹配的方法对串口自动接收的数据进行分割,确保串行数据可以转化为预期的并行数据。数据通过文件在不同的界面之间进行传输,暂时不协调,使用按钮模拟流程。

    QFile fil(QDir::currentPath()+".txt");
    fil.open(QIODevice::ReadOnly);
    char buf[3];
    qint64  addr;
    qint64  length;
    QString buf_exp;
    QRegExp exp("[0-9a-fA-F]");
    addr=0;
    while(!m_toStop)
    {
        fil.seek(addr);
        length = fil.read(buf,sizeof (buf));
        buf_exp = QString::fromLocal8Bit(buf);
        if(! exp.indexIn(buf_exp))
        {
            qDebug()<<buf_exp;
            addr=addr+length;
        }
        else
        {
            qDebug()<<"error";
            addr=addr+1;
        }
        if(addr>=fil.size())
        {
            fil.close();
            m_toStop = true;
        }
    }

重构的run函数可以用于持续读取和匹配字符函数。本段代码展示了单位宽度正则匹配字符的简易操作方法,主要用于记录和演示。

结果

初步验证了使用串口类完成数据通信和使用多线程完成通信后的数据匹配处理的操作,为下一步的QT增加处理模型提供了解决方法。文章来源地址https://www.toymoban.com/news/detail-729766.html

原文链接

QT之串口通信和多线程处理 -QT开发中文网QT之串口通信和多线程处理 https://qt.0voice.com/?id=771

到了这里,关于QT之串口通信和多线程处理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 51单片机串口通信

    串口通信(serial communication)是指外设和计算机间通过数据信号线、地线等按位进行传输数据的一种通信方式,属于串行通信方式。 接口标准:常用RS-232和RS-485 RS-232C有一种9针的非标准连接器口,简称DB9。串口通信使用的大多都是DB9接口。在串口通信中,通常我们只使用2、

    2024年02月05日
    浏览(49)
  • 51单片机-串口通信

    目录 1.什么是通信 1.1.通信的概念 1.2.传送方式 1.3.同步方式 1.4.传送方向 1.5.校验方式 2.单片机串口介绍 2.1.硬件电路 2.2.电平标准 2.3.常见接口 2.4.内部结构 2.5.相关寄存器 2.6.工作模式(模式1) 2.7.如何配置串口中断 3.实际应用 3.1.单片机向电脑发送数据 3.2.电脑向单片机发送

    2024年02月01日
    浏览(50)
  • 单片机串口通信程序

    本文总结了两种比较简单的关于串口发送接收的程序,以下是步骤: 定义数据: 首先要串口初始化:(以9600波特率为例) 串口中断:  在定时器0扫描里加入,或者主函数while(1)里加入: (其中++URX_tt=(1000/波特率),数要接近,否则会有小小干扰。) 接下来关于串口通信

    2024年02月10日
    浏览(49)
  • 单片机学习12-串口通信

    目录 串口通信实验 通信的基本概念 串行通信与并行通信 异步通信与同步通信 单工、半双工与全双工通信 通信速率(比特率) 单片机串口介绍 串口通信简介 串口相关寄存器 串口工作方式 方式 0  方式 1 方式 2 和方式 3 串口的使用方法 硬件设计 软件编程         我们

    2024年02月11日
    浏览(51)
  • 51单片机(八)串口通信

    ❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋

    2024年02月05日
    浏览(54)
  • 51单片机学习--串口通信

    首先需要配置寄存器: 下面这里SCON配0x40和0x50都可以,因为暂时还不需要接受信息,所以REN置1置0都可 在main中调用SendByte函数,每按下一次复位键,接收缓冲区就会收到一个11 这就是单向发送的一个简单实例,接下来实现每隔一秒发送一个递增的数据,只需要添加一个全局变

    2024年02月14日
    浏览(50)
  • 51单片机 | 串口通信实验

      这一节我们就来学习 51 单片机的串口通信。开发板上集成了 1 个串口通信电路,是 USB 转串口模块,它既可下载程序也可实现串口通信功能。本节要实现的功能是: 51 单片机通过串口( UART )实现与 PC 机对话, 51 单片机的串口收到 PC 机发来的数据后原封不动的返回给

    2024年02月04日
    浏览(64)
  • 51单片机(串口通信、蓝牙)

    串行接口简称串口,也称 串行通信接口 或串行通讯接口(通常指COM接口),是采用串行通信方 式的扩展接口。串行接口(Serial Interface)是指 数据一位一位地顺序传送。 其特点是通信线路简 单,只要一对传输线就可以实现 双向通信( 可以直接利用电话线作为传输线),从

    2024年02月15日
    浏览(45)
  • 【51单片机系列】proteus仿真单片机的串口通信

    本文参考:https://zhuanlan.zhihu.com/p/425809292。 在proteus之外使用串口软件和单片机通信。通过在proteus设计一个单片机接收PC发送的数据,并将接收的数据发送出去,利用软件【Configure Virtual Serial Port Driver】创建一对虚拟串口,利用软件【串口助手】向单片机发送数据。 proteus仿真

    2024年01月17日
    浏览(53)
  • 【PROTEUS-51单片机串口通信仿真】

    本次实验对51单片机的串口进行了双机通信的仿真,实现了51单片机的简单双机通信;现对本次仿真的结构及实现的功能做简要的介绍, 本次仿真主要构成:主机U1-MASTER、从机U2-SLAVE、以及LED显示部分(第一部分显示主机接收到的信息、第二部分显示从机接收到的信号); 实

    2024年01月15日
    浏览(75)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包