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.hqwc.cn/news/177661.html

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

相关文章

2023年10月国产数据库大事记-墨天轮

本文为墨天轮社区整理的2023年10月国产数据库大事件和重要产品发布消息。 目录 10月国产数据库大事记 TOP1010月国产数据库大事记&#xff08;时间线&#xff09;产品/版本发布兼容认证代表厂商大事记厂商活动排行榜新增数据库相关资料 10月国产数据库大事记 TOP10 10月国产…

分享一个在线免费制作和视频合成gif的网站

一、打开网站 在线制作高清gif动图-视频转gif表情工具-图片合成软件-gif.cn_GIF中文网 如图 二、可以选择gif合成&#xff0c;也就是把多张图片合成gif 效果图&#xff0c;我用了三张图片。 三、可以选择视频转gif。 效果图 四、完

公益SRC实战|SQL注入漏洞攻略

目录 一、信息收集 二、实战演示 三、使用sqlmap进行验证 四、总结 一、信息收集 1.查找带有ID传参的网站&#xff08;可以查找sql注入漏洞&#xff09; inurl:asp idxx 2.查找网站后台&#xff08;多数有登陆框&#xff0c;可以查找弱口令&#xff0c;暴力破解等漏洞&…

足底筋膜炎怎么治疗治愈

足底筋膜炎又称为跖筋膜炎&#xff0c;跖筋膜主要在足弓下方&#xff0c;它维持足弓稳定性&#xff0c;对于喜欢长期长跑、跳远&#xff0c;或者越野运动&#xff0c;或者部队中的士兵进行拉练&#xff0c;还有需要久坐或者久站的人群中&#xff0c;容易发生跖筋膜炎。治疗方法…

如何准备2024年的系统设计面试?

1 前言 如果你正在准备软件工程师或软件开发人员的面试,那么你可能知道由于其开放性质和广泛性,准备系统设计是多么困难,但同时你也不能忽略它。在软件工程界,如果你正在申请高级工程师/主管/架构师或更高级别的角色,系统设计是最受追捧的技能,也是整个过程中最重要的环节之一…

学习c#的第五天

目录 C# 运算符 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 其他运算符 C# 中的运算符优先级 C# 运算符 算术运算符 下表显示了 C# 支持的所有算术运算符。假设变量 A 的值为 10&#xff0c;变量 B 的值为 20&#xff0c;则&#xff1a; 运算符描述实例…

一文搞懂CAN总线协议

1.基础概念 CAN 是 Controller Area Network 的缩写&#xff08;以下称为 CAN&#xff09;&#xff0c;是 ISO 国际标准化的串行通信协议。在北美和西欧&#xff0c;CAN 总线协议已经成为汽车计算机控制系统和嵌入式工业控制局域网的标准总线&#xff0c;并且拥有以 CAN 为底层…

【广州华锐互动】AR技术为气象站远程监控及在线指导维修提供极大便利

随着科技的不断发展&#xff0c;人类对于自然环境的理解和掌控能力也在不断提升。其中&#xff0c;AR&#xff08;增强现实&#xff09;技术的应用&#xff0c;为气象监控带来了革命性的变化。AR远程气象监测&#xff0c;就是将AR技术与气象监控相结合&#xff0c;通过虚拟与现…

企业传统纸质设备维修方式的痛点以及解决方案

传统的纸质设备维修方式有很多痛点&#xff1a; 数据更新和访问的低效率&#xff1a;传统的纸质记录方法在更新和检索数据时效率极低。这种方式无法实时更新设备的维修状态&#xff0c;导致管理层和维修人员无法及时获取最新信息&#xff0c;影响决策的速度和质量。 记录的易…

宏基因组分析项目再创新,汞元素循环

汞&#xff08;Hg&#xff09;是一种具有强烈神经毒性的元素&#xff0c;其单质以及多种化合物都有不同程度的毒性&#xff0c;会造成慢性中毒。汞是一种全球性污染物&#xff0c;大气中的汞可通过干湿沉降进入地表水和土壤&#xff0c;环境因素的变化可导致汞的转化。从无机汞…

容器化nacos部署并实现服务发现(gradle)

1.如何容器化部署mysql 2. 如何容器化部署nacos 为不暴露我的服务器地址&#xff0c;本文全部使用localhost来代替服务器地址&#xff0c;所有的localhost都应该调整为你自己的服务器地址。 为不暴露我的服务器地址&#xff0c;本文全部使用localhost来代替服务器地址&#x…

移动端实现彩色导航

一、所需代码 &#xff08;1&#xff09;html部分 <div class"pres_nav"><ul><li v-for"(item, index) in menuList" :key"item.id" click"topage()" :style"{ backgroundColor: getBackgroundColor(index, li)…