QT串口收发

2023-11-07

串口扫描

将串口模块添加到工程中
在.pro文件中添加serialport
在这里插入图片描述
用到的头文件:

#include <QSerialPortInfo>
#include <QSerialPort>

QSerialPort类提供访问串口的功能,还可以通过QSerialPortInfo类获取可用串口的信息。
QSerialPortInfo类允许枚举系统中所有串口的信息,包括串口名称、系统位置、描述和制造商。
QSerialPortInfo::availablePorts();返回系统上可用串口的列表。


foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
{
			//这里只是临时读取可用串口不要在堆区直接开辟空间
	        QSerialPort port;
	        port.setPort(info);
	        //以可读可写的方式打开(临时打开,扫描可用串口)
	        if(port.open(QIODevice::ReadWrite))
	        {
	            //将扫描到的可用串口写入到comboBox里
	            ui->comboBox->addItem(port.portName());
	            //关闭串口
	            port.close();
	        }
}
foreach(variable, container)”可以看到,foreach有两个参数:
container:容器,即被遍历的对象
variable:当前元素,即遍历container过程中,当前的那个元素

在这里插入图片描述
声明QSerialPort成员变量
定义指针变量,用来承接在堆区开辟的对象,使之在全局范围内可用
在这里插入图片描述
在主窗口中实例化串口对象,和对可用串口进行扫描
在这里插入图片描述

配置串口信息

通过QSerialPort类型定义的串口对象 对串口参数设置
配置信息主要是在串口打开时设置的,所以我们可以设置在串口打开按钮槽函数里面

设置串口名称

void QSerialPort::setPortName(const QString &name)

//ui->comboBox->currentText()//是comboBox当前的文本内容
m_port->setPortName(ui->comboBox->currentText());

设置波特率

setBaudRate(qint32 baudRate, Directions directions = AllDirections)
baudRate:为int类型  的波特率
    m_port->setBaudRate(ui->comboBox_2->currentText().toInt());
    //ui->comboBox_2->currentText().toInt()//将comboBox_2当前文本内容转换为int

在这里插入图片描述

设置数据位

setDataBits(DataBits dataBits)

DataBits的类型为:
在这里插入图片描述

//comboBox_4数据位comboBox
        //设置数据位
        switch (ui->comboBox_4->currentText().toInt())
        {
        case 8:
            m_port->setDataBits(QSerialPort::Data8);

            break;
        case 7:
            m_port->setDataBits(QSerialPort::Data7);
            break;
        case 6:
            m_port->setDataBits(QSerialPort::Data6);
            break;
        case 5:
            m_port->setDataBits(QSerialPort::Data5);
            break;
        }

在这里插入图片描述

设置奇偶校验

在串口通信中一种简单的检错方式。有四种检错方式:偶、奇、高和低。当然没有校验位也是可以的。

bool setParity(Parity parity)

在这里插入图片描述

        if(ui->comboBox_5->currentText() == tr("无"))
            m_port->setParity(QSerialPort::NoParity);
        else if(ui->comboBox_5->currentText() == tr("奇校验"))
            m_port->setParity(QSerialPort::EvenParity);
        else if(ui->comboBox_5->currentText() == tr("偶校验"))
            m_port->setParity(QSerialPort::OddParity);
        else if(ui->comboBox_5->currentText() == tr("空格"))
            m_port->setParity(QSerialPort::SpaceParity);
        else if(ui->comboBox_5->currentText() == tr("标记"))
            m_port->setParity(QSerialPort::MarkParity);

在这里插入图片描述

设置停止位

bool  setStopBits(StopBits stopBits)

在这里插入图片描述

        if(ui->comboBox_3->currentText() == tr("1"))
            m_port->setStopBits(QSerialPort::OneStop);
        else if(ui->comboBox_3->currentText() == tr("1.5"))
            m_port->setStopBits(QSerialPort::OneAndHalfStop);
        else if(ui->comboBox_3->currentText() == tr("2"))
            m_port->setStopBits(QSerialPort::TwoStop);

在这里插入图片描述

设置流控制

bool setFlowControl(FlowControl flowControl)

在这里插入图片描述

        m_port->setFlowControl(QSerialPort::NoFlowControl);		//设置为无流控制

设置读取数据的缓存大小

它的大小决定了串口收到数据后可以缓存的数据的大小,如果长时间不将数据从缓冲区取出来,会出现溢出丢数据的情况。所以这个缓存的大小可以根据实际的通信速度和数据量进行设置。

        m_port->setReadBufferSize(40960);

打开串口

ReadWrite//可读可写
m_serialPort->open(QIODevice)

参数可以设置串口为只读、只写、读写三种方式。

串口打开并配置代码

这一过程我主要在串口打开按钮槽函数完成的

    m_port->setBaudRate(ui->comboBox_2->currentText().toInt());//设置波特率
    m_port->setPortName(ui->comboBox->currentText());
    if(m_port->open(QIODevice::ReadWrite))
    {
        //设置数据位
        switch (ui->comboBox_4->currentText().toInt())
        {
        case 8:
            m_port->setDataBits(QSerialPort::Data8);

            break;
        case 7:
            m_port->setDataBits(QSerialPort::Data7);
            break;
        case 6:
            m_port->setDataBits(QSerialPort::Data6);
            break;
        case 5:
            m_port->setDataBits(QSerialPort::Data5);
            break;
        }
        //设置停止位
        if(ui->comboBox_3->currentText() == tr("1"))
            m_port->setStopBits(QSerialPort::OneStop);
        else if(ui->comboBox_3->currentText() == tr("1.5"))
            m_port->setStopBits(QSerialPort::OneAndHalfStop);
        else if(ui->comboBox_3->currentText() == tr("2"))
            m_port->setStopBits(QSerialPort::TwoStop);
        //设置校验位
        if(ui->comboBox_5->currentText() == tr("无"))
            m_port->setParity(QSerialPort::NoParity);
        else if(ui->comboBox_5->currentText() == tr("奇校验"))
            m_port->setParity(QSerialPort::EvenParity);
        else if(ui->comboBox_5->currentText() == tr("偶校验"))
            m_port->setParity(QSerialPort::OddParity);
        else if(ui->comboBox_5->currentText() == tr("空格"))
            m_port->setParity(QSerialPort::SpaceParity);
        else if(ui->comboBox_5->currentText() == tr("标记"))
            m_port->setParity(QSerialPort::MarkParity);
        offAndOn(false);
        m_port->setFlowControl(QSerialPort::NoFlowControl);		//设置为无流控制
        m_port->setReadBufferSize(40960);
    }
    else {
       qDebug() << "串口打开失败";
    }

串口接收数据

串口接收数据 是通过信号readyRead信号,接收串口数据

信号:readyRead信号
//设置串口监听
    connect(m_port,SIGNAL(readyRead()),this,SLOT(ReadData()));
//ReadData()  //该槽函数需要用户自己完成

设置接收监听
在这里插入图片描述
在这里插入图片描述
checkBox为:
在这里插入图片描述
textEdit为
在这里插入图片描述

void Widget::ReadData()
{
    //关闭串口
    QByteArray arr;
    //判断串口接收方式
    if(ui->checkBox->checkState())
    {
        arr = m_port->readAll().toHex();//将数据转换成16进制
    }
    else
    {
       arr = m_port->readAll();
    }
    ui->textEdit->append(arr);//将数据打印到textEdit
}

串口发送数据

textEdit_2为:
在这里插入图片描述
checkBox_2为:
在这里插入图片描述
checkBox_3为:
在这里插入图片描述

    QByteArray Data_1;
    //获取输入窗口sendData的数据
    QString Data = ui->textEdit_2->toPlainText();
    if(ui->checkBox_3->checkState())
    {
        Data+='\r';Data+='\n';
    }
    if(ui->checkBox_2->checkState())
    {
        Data_1 = QByteArray::fromHex(Data.toLatin1().data());//按十六进制编码发送
    }
    else
    {
        Data_1 = Data.toUtf8();//转换成utf8格式的字节流发送
    }

    // 写入发送缓存区
    m_port->write(Data_1);

串口关闭

关闭应写在关闭槽函数中

    m_port->close();
    offAndOn(true);//自定义函数,

offAndOn自定义函数,使comboBox不可再选

void Widget::offAndOn(bool status)
{
    ui->comboBox->setEnabled(status);
    ui->comboBox_2->setEnabled(status);
    ui->comboBox_3->setEnabled(status);
    ui->comboBox_4 ->setEnabled(status);
    ui->comboBox_5 ->setEnabled(status);
}
status false不可选   true可选

ui->comboBox->clear();  //清空comboBox

源码:

链接:https://pan.baidu.com/s/1zgz6evCmnVrMW0CzBcjkYQ?pwd=2178
提取码:2178

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QT串口收发 的相关文章

  • 如何在 C++ 中的文件末尾添加数据?

    我已按照网上的说明进行操作 此代码应该将输入添加到文件 数据库 的末尾 但当我检查时 数据会覆盖现有数据 请帮忙 这是我的代码 int main string name string address string handphone cou
  • 用 C++ 进行服装建模 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在编写一些软件 最终会绘制一个人体框架 可以配置各种参数 并且计划是在假人身上放置某种衣服 我研究
  • std::cout 和 std::wcout 有什么区别?

    在c 中 有什么区别std cout and std wcout 它们都控制流缓冲区的输出或将内容打印到控制台 或者它们只是相似吗 它们作用于不同的字符类型 std cout uses char作为字符类型 std wcout uses w
  • 向 Nhibernate 发出 SQL 查询

    如何将此 SQL 查询发送给 Nhibernate SELECT Customer name FROM Company INNER JOIN Customer ON Company CompanyId Customer CompanyId
  • 如何在 C# 中从 UNIX 纪元时间转换并考虑夏令时?

    我有一个从 unix 纪元时间转换为 NET DateTime 值的函数 public static DateTime FromUnixEpochTime double unixTime DateTime d new DateTime 19
  • 如何修复此错误“GDI+ 中发生一般错误”?

    从默认名称打开图像并以默认名称保存 覆盖它 我需要从 Image Default jpg 制作图形 将其放在 picturebox1 image 上并在 picurebox1 上绘制一些图形 它有效 这不是我的问题 但我无法保存 pictu
  • 如何访问另一个窗体上的ListView控件

    当单击与 ListView 所在表单不同的表单中的按钮时 我试图填充 ListView 我在 Form1 中创建了一个方法以在 Form2 中使用 并将参数传递给 Form1 中的方法 然后填充 ListView 当我调试时 我得到了传递的
  • 在 C# 中循环遍历文件文件夹的最简单方法是什么?

    我尝试编写一个程序 使用包含相关文件路径的配置文件来导航本地文件系统 我的问题是 在 C 中执行文件 I O 这将是从桌面应用程序到服务器并返回 和文件系统导航时使用的最佳实践是什么 我知道如何谷歌 并且找到了几种解决方案 但我想知道各种功
  • 获取 WPF 控件的所有附加事件处理程序

    我正在开发一个应用程序 在其中动态分配按钮的事件 现在的问题是 我希望获取按钮单击事件的所有事件 因为我希望删除以前的处理程序 我尝试将事件处理程序设置为 null 如下所示 Button Click null 但是我收到了一个无法分配 n
  • 将 Excel 导入到 Datagridview

    我使用此代码打开 Excel 文件并将其保存在 DataGridView 中 string name Items string constr Provider Microsoft Jet OLEDB 4 0 Data Source Dial
  • C++:.bmp 到文件中的字节数组

    是的 我已经解决了与此相关的其他问题 但我发现它们没有太大帮助 他们提供了一些帮助 但我仍然有点困惑 所以这是我需要做的 我们有一个 132x65 的屏幕 我有一个 132x65 的 bmp 我想遍历 bmp 并将其分成小的 1x8 列以获
  • 批量更新 SQL Server C#

    我有一个 270k 行的数据库 带有主键mid和一个名为value 我有一个包含中值和值的文本文件 现在我想更新表格 以便将每个值分配给正确的中间值 我当前的方法是从 C 读取文本文件 并为我读取的每一行更新表中的一行 必须有更快的方法来做
  • 如何使用 Mongodb C# 驱动程序连接多个集合

    我需要将 3 个集合与多个集合合并在一起 lookup我在 C 驱动程序中尝试过 它允许我 lookup用户采集但无法执行秒 lookup用于设置集合 有人可以帮忙吗 db Transactions aggregate lookup fro
  • 私有模板函数

    我有一堂课 C h class C private template
  • (de)从 CSV 序列化为对象(或者最好是类型对象的列表)

    我是一名 C 程序员 试图学习 C 似乎有一些内置的对象序列化 但我在这里有点不知所措 我被要求将测试数据从 CSV 文件加载到对象集合中 CSV 比 xml 更受青睐 因为它更简单且更易于人类阅读 我们正在创建测试数据来运行单元测试 该集
  • 用于 C# 的 TripleDES IV?

    所以当我说这样的话 TripleDES tripledes TripleDES Create Rfc2898DeriveBytes pdb new Rfc2898DeriveBytes password plain tripledes Ke
  • Process.Start() 方法在什么情况下返回 false?

    From MSDN https msdn microsoft com en us library e8zac0ca v vs 110 aspx 返回值 true 表示有新的进程资源 开始了 如果由 FileName 成员指定的进程资源 St
  • 如何在 C# 中调整图像大小同时保持高质量?

    我从这里找到了一篇关于图像处理的文章 http www switchonthecode com tutorials csharp tutorial image editing saving cropping and resizing htt
  • 编译时“strlen()”有效吗?

    有时需要将字符串的长度与常量进行比较 例如 if line length gt 2 Do something 但我试图避免在代码中使用 魔法 常量 通常我使用这样的代码 if line length gt strlen Do somethi
  • 线程和 fork()。我该如何处理呢? [复制]

    这个问题在这里已经有答案了 可能的重复 多线程程序中的fork https stackoverflow com questions 1235516 fork in multi threaded program 如果我有一个使用 fork 的

随机推荐

  • STM32F767ZI-NUCLEO移植运行micropython过程记录

    注意 本教程移植microPython是通过烧写hex文件实现的 网上其他教程很多是介绍使用USB DFU方式 设备boot0至高电平 通过DfuSeDemo烧写 由于自己还不熟没有使用这种方式 后续有时间再尝试 另外本教程是基于STM32
  • 编译工程——词法分析

    词法分析主要是读入源程序的输入字符 区分成词素 生成词法单元序列 序列中的每个词法单元对应一个词素 此外 它还会完成其他的任务 如过滤掉源程序中的注释和空白 空格 换行符 制表符以及在输入中用于分割词法单元的其他字符 以及将编译器生成的错误
  • linux 平铺式桌面,Linux平铺窗口管理器:i3,sway,Qtile,dwm,awesome,附安装方法

    下面介绍五款 Linux 平铺窗口管理器 i3 sway Qtile dwm awesome 同时提供在 Fedora 系统中如何安装它们 在 Linux 桌面生态中有多种窗口管理器 WM 有些是作为桌面环境的一部分开发的 有的则被用作独立
  • oracle中的resetlog——还需理解

    关于resetlog的作用是将日志序列重置 这样以前的归档就作废 请高人指点 是什么样的一个工作机制 首先一定要明白oracle工作的基本原理 归档情况下 大家一定要同步 谁也不能滞后或者超前 也就是SCN号 如果学oracle不懂scn的
  • Centos Linux 清理磁盘占用空间:/dev/xvda1

    CnetOS7 磁盘空间不足 进行如下操作可释放空间 df h 查看磁盘占用率 df h 这时是100 截图是清理之后的 进入根目录cd 执行du sm sort n 磁盘占用的升序排列 或du h max depth 1du 进入占用空间
  • PDF Web Viewer

    https mozilla github io pdf js web viewer html
  • 编程每日一题_C程序设计_日K蜡烛图

    描述 来源 pintia 正确解法一 嵌套 if 条件判断 include
  • 华为OD机试 - 区间交集(Java)

    题目描述 给定一组闭区间 其中部分区间存在交集 任意两个给定区间的交集 称为公共区间 如 1 2 2 3 的公共区间为 2 2 3 5 3 6 的公共区间为 3 5 公共区间之间若存在交集 则需要合并 如 1 3 3 5 区间存在交集 3
  • 线性DP题目汇总(持续更新)

    一 前言 此篇章主要整理一些关于线性dp的题目 很多题目其实都可以被挂上线性dp的标志 比如最熟悉的最长上升子序列啊 最长公共子序列啊等等 并且线性dp在自己写力扣周赛的题目的时候 真的会时不时出几道 然后刚好利用这些题目加上dp分析的方法
  • uniapp中H5使用Vconsole调试

    下载与安装vconsole 1 1 选中你的项目 弄出终端 输入以下命令 npm install vconsole npm install vconsole 2 引用vconsole 找到main js文件中 加上以下代码 import V
  • PyPDF2 pdf 文件写入提示如下错误:PyPDF2.utils.PdfReadError: Illegal character in Name Object

    今天学习PyPDF2 pdf文件写入其他指定pdf 文件提示如下错误信息 Traceback most recent call last File D python35 Lib site packages PyPDF2 generic py
  • 强化学习基础

    强化学习 强化学习概念 强化学习 RL 就是智能体Agent与环境交互从而进行学习的一种机器学习方法 Agent执行一个动作后 会从环境中获得反馈 这个反馈就是环境对这个动作做出的评价 这个可以理解为当你拿100分时 你妈妈会给你一顿大餐的
  • 毕业设计 STM32单片机的GPS定位系统 - 物联网

    基于STM32单片机的定位系统 由 STM32F103C8T6单片机最小系统 GPS模块 ESP8266 系统内可以通过ESP8266无线传输模块将GPS传回来的数据在ONENET界面显示 ONENET界面可以显示行驶距离 速度 经纬度还可
  • 中望cad文字显示问号怎么办_CAD字体显示问号解决方法

    很多朋友查看CAD图纸的时候会出现很多问号 这到底是怎么回事呢 想要搞定也是很麻烦的 小编提供的这款CAD字体 问号修复工具采用lsp格式 加载后再命令行输入fs回车即可解决cad字体中出现问号的问题 遇到类似问题的朋友不妨下载试试 使用说
  • 算法导论学习--红黑树详解之删除(含完整红黑树代码)

    前面我们讨论了红黑树的插入的实现 基本思想是分类讨论 然后分情况讨论以后我们发现插入操作调整函数只需要处理三种情况 并不是太复杂 但是删除操作会更复杂一点 因为二叉搜索树的删除操作本身就分成了多种情况 这样在执行删除操作后要处理的情况会更多
  • tomcat 远程连接

    在catalina sh里面添加以下配置 JAVA OPTS server XX PermSize 1024m XX MaxPermSize 2048m Xms3072 Xmx5120m XX UseParallelGC XX Parall
  • 爆了!2023 年上半年全球程序员薪酬报告

    大家好 这里是 NewBeeNLP 近日 美国科技公司数据收集网站 Levels fyi 发布了 2023 年上半年全球程序员薪酬报告 并统计了各领域薪酬的增长比例 我们从上表可以看到各个领域当中 增强现实 虚拟现实 AR VR 总薪酬中位
  • PC汇编语言(NASM)

    http www drpaulcarter com pcasm 转载于 https www cnblogs com yuanping archive 2012 12 29 2838844 html
  • 归并排序,C++实现

    归并排序 采用分治法的一个典型应用 实现方法有两种 1 自上而下的递归 所有递归的方法都可以用迭代重写 2 自下而上的迭代 c 代码 递归版 include
  • QT串口收发

    QT串口收发 串口扫描 配置串口信息 设置串口名称 设置波特率 设置数据位 设置奇偶校验 设置停止位 设置流控制 设置读取数据的缓存大小 打开串口 串口打开并配置代码 串口接收数据 串口发送数据 串口关闭 offAndOn自定义函数 使co