Qt 线程串口

文章目录

  • ui设置
  • 创建线程函数
  • 初始串口
  • run函数接收发送数据
    • 读取数据
    • 处理读取的数据
    • 写入数据
    • 写入启动的命令
  • 主线程

在这里插入图片描述

ui设置

在这里插入图片描述

创建线程函数

#include <QObject>
#include <QThread>
#include <QSerialPort>
#include <QSerialPortInfo>class SerialPort : public QThread
{Q_OBJECT
public:SerialPort();~SerialPort();public:void InitPort(QString PortName);void wirteData();//写入数据void ProcessReceivedData(QByteArray);//处理数据quint8  CalculateChecksum(const QByteArray& data);//计算校验和
signals:void SendData(float m_fVol[10]);//发送数据protected:void run();public slots:void readData();void handleBytesWritten(quint64 bytes);public:QSerialPort* port;QStringList serialPortNameList;//串口列表float m_fVol[10];//电压QByteArray m_receivedBuffer[4096];QByteArray receivedData;//接收到的数据
};

初始串口

void SerialPort::InitPort(QString PortName)
{// 查询所有串口设备
//    QList<QSerialPortInfo> serialList = QSerialPortInfo::availablePorts();//    foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts())
//    {
//        serialPortNameList << info.portName();
//        qDebug()<<"serialPortName: "<<info.portName();
//    }//qDebug()<<PortName;port->setPortName(PortName);port->setBaudRate(19200, QSerialPort::AllDirections);//波特率port->setDataBits(QSerialPort::Data8);             // 数据位为8位port->setFlowControl(QSerialPort::NoFlowControl);  // 无流控制port->setParity(QSerialPort::NoParity);            // 无校验位port->setStopBits(QSerialPort::OneStop);           // 一位停止位if (port->open(QIODevice::ReadWrite)){qDebug() << "Port have been opened";wirteData();}else{qDebug() << "open it failed";return;}
}

run函数接收发送数据

void SerialPort::run()
{connect(port, &QSerialPort::bytesWritten, this, &SerialPort::handleBytesWritten);//向串口写数据connect(port, &QSerialPort::readyRead, this, &SerialPort::readData);//向串口读数据exec();
}

读取数据

void SerialPort::readData()
{if (port->bytesAvailable() > 0){qint64 nReadSize = 4096;if(port->isOpen()){QByteArray receivedData = port->read(nReadSize);//qDebug()<<receivedData.size();if (receivedData.size() >= 26){ProcessReceivedData(receivedData); // 处理接收到的数据}}}
}

处理读取的数据

void SerialPort::ProcessReceivedData(QByteArray receivedData)
{//qDebug()<<receivedData;//qDebug()<<receivedData.size();if(receivedData.size() >= 26){if (receivedData.at(0) == 'U' && receivedData.at(receivedData.length() - 1) == '\xAA'){// 检验校验和//qDebug()<<receivedData;QByteArray dataContent = receivedData.mid(1, 23);quint8 receivedChecksum = static_cast<quint8>(receivedData.at(24)); // 获取接收到的校验和quint8 calculatedChecksum = CalculateChecksum(dataContent); // 计算校验和if(receivedChecksum ==calculatedChecksum )//数据正确{quint16 wT;for (int j = 0; j < 10; ++j){wT = static_cast<quint8>(receivedData[j*2+2]);wT <<= 8;wT += static_cast<quint8>(receivedData[j*2+1]);m_fVol[j] = wT * 5000.0f / 1024;emit SendData(m_fVol);}}}else{receivedData.remove(0, 1);}}}quint8 SerialPort::CalculateChecksum(const QByteArray &data)
{quint8 checksum = 0;for (int i = 0; i < data.size(); ++i){checksum += static_cast<quint8>(data.at(i));}return checksum;
}

写入数据

void SerialPort::handleBytesWritten(quint64 bytes)
{if (bytes > 0){// 数据写入成功//qDebug()<<bytes;connect(port, &QSerialPort::readyRead, this, &SerialPort::readData);//向串口读数据} else {// 数据写入失败wirteData();//再次写入}
}

写入启动的命令

void SerialPort::wirteData()
{if (port->isOpen()){QByteArray data;data.append(char(0x55)); // 添加数据 0x55 到数组data.append(char(0x01)); // 添加数据 0x01 到数组data.append(char(0x01)); // 添加数据 0x01 到数组data.append(char(0x00)); // 添加数据 0x00 到数组data.append(char(0x00)); // 添加数据 0x00 到数组data.append(char(0x00)); // 添加数据 0x00 到数组data.append(char(0x02)); // 添加数据 0x02 到数组data.append(char(0xAA)); // 添加数据 0xAA 到数组//qDebug()<<char(0x55);port->clear(QSerialPort::Output); // 清除输出缓冲区port->write(data);                // 写入数据到串口}
}

主线程

#include <QWidget>
#include "serialport.h"QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private:Ui::Widget *ui;public slots:void ReadData(float m_fVol[10]);public:SerialPort* m_Port;private slots:void on_pushButton_clicked();
};
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);m_Port =new SerialPort();ui->comboBox->addItem("COM1");ui->comboBox->addItem("COM2");ui->comboBox->addItem("COM3");ui->comboBox->addItem("COM4");ui->comboBox->addItem("COM5");ui->comboBox->addItem("COM6");ui->comboBox->addItem("COM7");ui->comboBox->addItem("COM8");}Widget::~Widget()
{delete ui;
}void Widget::ReadData(float m_fVol[10])
{QTextCursor tc = ui->textBrowser->textCursor();tc.movePosition(QTextCursor::End);//qDebug()<<m_fovl;for(int i=0;i<10;i++){tc.insertText(QString::number(m_fVol[i])+"mv\n");tc.insertText("\n");}tc.insertText("----------\n");ui->textBrowser->moveCursor(QTextCursor::End);
}void Widget::on_pushButton_clicked()
{if(ui->pushButton->text() == "连接"){m_Port->InitPort(ui->comboBox->currentText());connect(m_Port,&SerialPort::SendData,this,&Widget::ReadData);m_Port->start();ui->pushButton->setText("断开连接");}else {m_Port->port->close();disconnect(m_Port, &SerialPort::SendData, this, &Widget::ReadData); // 断开连接ui->pushButton->setText("连接");}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/143513.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第12章 关于 Micro SaaS 的结论

从时间和地点的自由到一种新鲜的独立感,开发 Micro SaaS 应用程序有很多好处。 获得 6 位数的订阅收入。辞掉我朝九晚五的令人丧命的工作。消除毫无意义的会议、办公室政治、混乱和救火。想工作就工作。随时随地使用我想要的任何技术工作。花更多时间陪伴家人。与我开发的应用…

【Python】Matplotlib-多张图像的显示

一&#xff0c;情景描述 大家在写论文或者实验报告的时候&#xff0c;经常会放多张图片或数据图像在一起形成对比。比如&#xff0c;我现在有一张经过椒盐噪声处理的图像&#xff0c;现在进行三种滤波&#xff0c;分别是均值&#xff0c;高斯&#xff0c;中值滤波&#xff0c;…

axios不经过全局拦截器策略

项目中使用的axios请求通常会根据项目情况进行请求拦截request和响应拦截response设置&#xff0c;比如对响应拦截的值具体值返回给调用请求部分直接使用 // 部分代码展示 const request axios.create({baseURL: /proxy/,timeout: 1000 * 600,responseType: json, }) // requ…

面试算法题之跳跃游戏,“You Jump, I Jump”

跳跃游戏 给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。 解题思路 我们从末尾倒着看,例如: [3,2,2,0,4]。 初始需要…

ElementUI表格el-table自适应高度(表头表尾固定不动)

ElementUI表格el-table自适应高度&#xff08;表头表尾固定不动&#xff09;&#xff0c;内容只在中间滚动&#xff0c;效果如图&#xff1a; 实现代码 <div class"mt-10" :style"{height:tableHeight}"><div class"operation-bar">…

腾讯云入侵

早上8点左右收到腾讯云的相关短信&#xff0c;提示机器可能存在挖坑风险。马上登录机器看了一下&#xff0c;发现crontab有个比较诡异的任务 [devVM_0_12_centos ~]$ crontab -l 11 * * * * /home/dev/.config/systemd/user/systemd-tmpfiles-cleanup/systemd-tmpfiles-cleanu…

bug-xss 攻击漏洞问题

XSS 攻击漏洞是什么 XSS(Cross-Site Scripting)攻击&#xff1a;通过在网站上植入恶意脚本来攻击用户 举例说明 在留言板发布评论&#xff0c;评论内容包含恶意脚本&#xff1a; <script>document.location "http://xxx.com/getCookie?cookie" document…

VScode+python开发,多个解释器切换问题

内容&#xff1a;主要VScode使用多个解释器 环境准备 VScode编辑器&#xff0c;两个版本python解释器 python3.7.2 python3.11.6 问题&#xff1a; 目前我们的电脑安装了python3.7.2、python3.11.6两个解释器&#xff0c;在vscode编辑器中&#xff0c;无法切换解释器使用如…

【蓝桥杯软件赛 零基础备赛20周】第3周——填空题

报名明年4月蓝桥杯软件赛的同学们&#xff0c;如果你是大一零基础&#xff0c;目前懵懂中&#xff0c;不知该怎么办&#xff0c;可以看看本博客系列&#xff1a;备赛20周合集 20周的完整安排请点击&#xff1a;20周计划 文章目录 00. 2023年第14届参赛数据0. 上一周答疑1. 填空…

RequestContextHolder详解

最近遇到的问题是在service获取request和response,正常来说在service层是没有request的,然而直接从controlller传过来的话解决方法太粗暴,后来发现了SpringMVC提供的RequestContextHolder遂去分析一番,并借此对SpringMVC的结构深入了解一下,后面会再发文章详细分析源码 1.Reque…

【函数】各种函数收集,持续更新~

文章目录 各种函数收集&#xff0c;持续更新~1. 数组对象去重2. 时间转换函数3. 深拷贝4. js精度问题解决&#xff08;加减乘除&#xff09;5. toFiexed函数重写6.手机号校验与隐藏手机号中间4位7. 身份证号校验与加密校验位检测15位转18位身份证8. 千位符格式化&#xff08;12…

anaconda中安装pytorch和TensorFlow环境并在不同环境中安装kernel

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

单链表的实现

CSDN主页&#xff1a;醋溜马桶圈_C语言进阶,初始C语言,数据结构-CSDN博客 Gitee主页&#xff1a;mnxcc (mnxcc) - Gitee.com 专栏&#xff1a;数据结构_醋溜马桶圈的博客-CSDN博客 目录 1.认识单链表 2.创建单链表 3.单链表的操作 3.1打印单链表 3.2开辟新空间 3.3尾插 3.4头插…

深入探讨Linux中的文本文件查看命令

目录 前言1 cat命令2 less命令3 more命令4 head命令5 tail命令6 总结 前言 在Linux系统中&#xff0c;文本文件是日常工作中不可或缺的一部分&#xff0c;无论是配置文件、日志文件还是代码文件&#xff0c;都需要用到文本文件查看命令。在本文中&#xff0c;我们将深入研究一…

AI创作系统ChatGPT源码+AI绘画系统+支持OpenAI DALL-E3文生图,可直接对话文生图

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。新增支…

桶装水订水小程序app,线上预约订水更便捷

桶装水订水小程序app&#xff0c;线上预约订水更便捷。设置好地址&#xff0c;一键订水&#xff0c;工作人员送水到家。还能配送新鲜果蔬&#xff0c;绿色健康有保证。送水软件手机版&#xff0c;提供各种品牌桶装水&#xff0c;在线发起订水服务&#xff0c;由服务人员送水到家…

QT windows与linux之间sokcet通信中文乱码问题解决方法

QT windows与linux之间sokcet通信中文乱码问题解决方法 linux发送与接收都转码utf-8: tcpClient ->write( send_msg.toUtf8());//解决乱码&#xff0c;发送转码 接收&#xff1a; QByteArray buffer tcpClient->readAll(); if(!buffer.isEmpty()) { // ui->plain…

ipad可能会在iOS 16中失去智能家居中心功能

在iOS 16测试版代码中发现的文本表明苹果将放弃对iPad家庭中心的支持 家庭app迎来重大改版&#xff0c;未来更将对智能家居互联互通标准Matter提供支持。 即使某一款智能家居设备再优秀&#xff0c;只要它没有接入HomeKit&#xff0c;那么就不能在苹果的家庭app中直接管理控制。…

双十一买高画质投影仪,当贝F6还是极米H6?

如果你想购买一台4K画质的投影仪,那么在各大平台搜索“双十一最值得买的4K投影仪”时,一定会注意到当贝F6和极米H6这两个型号投影仪。个人认为当贝F6和极米H6都分别是当贝和极米两个品牌非常具有性价比的4K投影仪。那么到底哪一台更适合你。 首先放一张参数对比图,方便参数控研…

登上CMMLU性能评测榜单第一 四大维度解码夸克自研大模型

11月14日&#xff0c;拥有千亿参数的夸克自研大模型正式发布&#xff0c;立刻占据CMMLU榜单第一名。夸克大模型将应用于通用搜索、医疗健康、教育学习、职场办公等多个场景。性能方面&#xff0c;其整体水平已经超过GPT-3.5&#xff0c;其中在写作、考试等部分场景中可以超过GP…