基于QT开发了一款电能芯片测试软件,该软件可以通过串口读取解析芯片发送过来的数据从而判断芯片是否可以正常工作。

  1. HLW8032芯片介绍:

通信方式为UART、波特率4800。

2.上位机功能介绍

  • 可以读取电压参数寄存器、电压寄存器、电流参数寄存器、电流寄存器、功率参数寄存器、功率寄存器的数据并显示
  • 计算有效电压、电流、功率,功率因数。
  • 设置电压、电流、功率系数

3.具体实现

  • ui界面设计,使用QT的ui设计器。
  • 打开串口
void Widget::on_openButton_clicked()//打开串口按钮对应的槽函数
{SearchPort();//查找串口OpenAndInitialize();//打开串口并且初始化
}
//通过QSerialPortInfo查找可用串口
void Widget::SearchPort()
{ui->portNameBox->clear();//首先清除上一次的端口信息//QSerialPortInfo::availablePorts//返回系统上可用串行端口的列表foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts()){ui->portNameBox->addItem(info.portName());//把可用的串行端口设置到复选框上}
}
//打开并初始化串口
void Widget::OpenAndInitialize()
{if( ui->openButton->text() == QString("打开串口") ){//设置串口名Serial.setPortName(ui->portNameBox->currentText());//设置波特率Serial.setBaudRate(QSerialPort::Baud4800);//设置数据位数Serial.setDataBits(QSerialPort::Data8);//设置奇偶校验Serial.setParity(QSerialPort::EvenParity);//设置停止位Serial.setStopBits(QSerialPort::OneStop);//设置流控制Serial.setFlowControl(QSerialPort::NoFlowControl);if(!Serial.open(QIODevice::ReadWrite)){QMessageBox::about(nullptr, "提示", "无法打开串口!");}ui->portNameBox->setEnabled(false);//打开成功后,使串口号选择框、设置电压系数、设置电流系数、设置功率系数功能 失能,禁止人员在软件正常工作后误操作ui->VkEdit->setEnabled(false);ui->IkEdit->setEnabled(false);ui->PvEdit->setEnabled(false);ui->openButton->setText("关闭串口");}else{Serial.close();ui->portNameBox->setEnabled(true);ui->VkEdit->setEnabled(true);ui->IkEdit->setEnabled(true);ui->PvEdit->setEnabled(true);ui->openButton->setText(QString("打开串口"));}
}

串口正常打开后就可以读取通道发送过来的数据

​/*每当有新数据可用于从设备的当前读取通道读取时,该信号就会发出一次。*/connect(&Serial, SIGNAL(readyRead()), this, SLOT(SerialportReadyread()));
​
void Widget::SerialportReadyread()
{QByteArray revArray; //定义字节数组保存接受到的数据uint16_t i;if(Serial.isOpen()){revArray = Serial.readAll(); //从设备读取所有剩余数据,并将其作为字节数组返回。for(i=0; i<revArray.length(); i++){HLW8032_DecordProtocol(static_cast<uint8_t>(revArray.at(i))); //解析}}
}
static double Vk = 0;//获取上位机设置的电压系数
static double Ik = 0;//获取上位机设置的功率系数static uint32_t VParam = 0;//电压参数寄存器
static uint32_t VReg = 0;  //电压寄存器
static double V = 0;static uint32_t IParam = 0;//电流参数寄存器
static uint32_t IReg = 0;   //电流寄存器
static double I = 0;static uint32_t PParam = 0;//功率参数寄存器
static uint32_t PReg = 0; //功率寄存器
static double P = 0;static double PV = 0;
static double PF = 0;   //功率因数/*静态局部变量使用static修饰符定义,即使在声明时未赋初值,编译器也会把它初始化为0。*且静态局部变量存储于进程的全局数据区,即使函数返回,它的值也会保持不变。*/
/**状态寄存器  检测寄存器默认值   电压参数寄存器  电压寄存器  电流参数寄存器  电流寄存器  功率参数寄存器   功率寄存器   数据更新寄存器    PF寄存器   校验和寄存器*  1             1            3             3          3           3           3             3          1              2         1**当CheckSum REG数据 不等于 除状态寄存器(State REG)、检测寄存器(Check REG)和校验和寄存器(CheckSum REG)之外的寄存器的数据之和的低 8bit 时,此次数据有问题不可信直接丢弃*/
void Widget::HLW8032_DecordProtocol(uint8_t Data)
{static uint8_t status = 0;static uint8_t index = 0;static uint8_t sum = 0;    //用于保存 电压参数寄存器 电压寄存器 电流参数寄存器 电流寄存器 功率参数寄存器 功率寄存器 数据更新寄存器 PF寄存器 之和的低8位 用来和 CheckSum REG数据进行校验static uint8_t tempBuf[24];//保存每一帧数据24字节switch (status){case 0:if(Data==0x55)//0x55 芯片正常{tempBuf[0]=Data;status=1;}break;case 1:if(Data==0x5A)//检测寄存器 默认值{tempBuf[1]=Data;status=2;//静态局部变量}else{status=0;}index=2;sum=0;break;case 2://因为status是静态局部变量,因此函数返回,status的值也不会发生变化//在HLW8032_DecordProtocol()函数中,是一个字节一个字节进行处理的//因此在一帧数据中,当处理完状态、检测寄存器后接下来的数据直接进入 case 2//但是不会进入 if( index==24 ) 因为一帧数据还没有接受完,知道index = 24//否则sum会一直累加保存保存 电压参数寄存器 电压寄存器 电流参数寄存器 电流寄存器 功率参数寄存器 功率寄存器 数据更新寄存器 PF寄存器 之和的低8位 用来和 CheckSum REG数据进行校验tempBuf[index]=Data;index++;if( index==24 ){if( sum==Data ) //进入if( index==24 )后表示这一阵数据已经 接受完成了,开始校验这一帧数据是否可用,此时Data保存的一帧数据中最后一个字节的内容,也就是 校验和寄存器的内容,如果相等校验通过{/*当&与&&同为逻辑运算符时,它们都用于连接两个Boolean类型的表达式,当&和&&的两端表达式同时为真时,表达式的结果为真,*只要有一端为假,那么表达式结果为假。从用法上来看,&和&&并没有什么区别,比如我们可以写两个表达式:3>5&3>2;       3>5&&3>2;两个运算符都可以这么用,但是不同的是,当在判断这个表达式的真或假的时候,两者的判断次数不同;当使用&运算符: 计算机在判断表达式的值的时候,先判断3>5 的值为假,然后再判断3>2的结果为真,于是最后的结果是 假&真 为假;但是当我们使用&&运算符的时候:计算机先判断3>5 的值为假,此时表达式的结果一定为假,所以计算机就不再往下判断了,判定表达式结果为假。逻辑运算符&与&&的区别是:& 无论左边结果是什么,右边还是继续运算;&&当左边为假,右边不再进行运算。但是两者的结果是一样的。*/if( tempBuf[20] & (0x07<<4) ) //tempBuf[20] 数据更新寄存器{VParam = static_cast<uint32_t>((tempBuf[2]<<16)|(tempBuf[3]<<8)|tempBuf[4]);//电压参数寄存器VReg = static_cast<uint32_t>((tempBuf[5]<<16)|(tempBuf[6]<<8)|tempBuf[7]);  //电压寄存器IParam = static_cast<uint32_t>((tempBuf[8]<<16)|(tempBuf[9]<<8)|tempBuf[10]);//电流参数寄存器IReg = static_cast<uint32_t>((tempBuf[11]<<16)|(tempBuf[12]<<8)|tempBuf[13]);//电流寄存器PParam = static_cast<uint32_t>((tempBuf[14]<<16)|(tempBuf[15]<<8)|tempBuf[16]);//功率参数寄存器PReg = static_cast<uint32_t>((tempBuf[17]<<16)|(tempBuf[18]<<8)|tempBuf[19]);  //功率寄存器//清除ui->VParamEdit->clear();ui->VReg->clear();ui->IParamEdit->clear();ui->IReg->clear();ui->PParamEdit->clear();ui->PReg->clear();//插入ui->VParamEdit->insert(QString("%1").arg(VParam));ui->VReg->insert(QString("%1").arg(VReg));ui->IParamEdit->insert(QString("%1").arg(IParam));ui->IReg->insert(QString("%1").arg(IReg));ui->PParamEdit->insert(QString("%1").arg(PParam));ui->PReg->insert(QString("%1").arg(PReg));//获取Vk = ui->VkEdit->text().toDouble();Ik = ui->IkEdit->text().toDouble();V = static_cast<double>(VParam)/static_cast<double>(VReg)*Vk;   //有效电压I = static_cast<double>(IParam)/static_cast<double>(IReg)*Ik;   //有效电流P = static_cast<double>(PParam)/static_cast<double>(PReg)*Vk*Ik;//有效功率PV = V*I; //视在功率PF = P/PV;//功率因数ui->VEdit->clear();ui->IEdit->clear();ui->PEdit->clear();ui->PFEdit->clear();ui->VEdit->insert(QString("%1").arg(V));ui->IEdit->insert(QString("%1").arg(I));ui->PEdit->insert(QString("%1").arg(P));ui->PFEdit->insert(QString("%1").arg(PF));}}else{status=0;}}else{sum+=Data;}break;default:break;}
}

4.源代码链接

https://download.csdn.net/download/qq_37933895/11046506

5.重点

数据解析

基于QT的HLW8032电能芯片测试上位机开发相关推荐

  1. esp32系列(11):ESP32 IDF平台 mpu6050 DMP 驱动移植及测试上位机开发

    目录 1 DMP 官方库介绍 1.1 DMP与MPL(Motion Processing Libraries)功能 1.2 运行MPL的硬件要求 1.3 Motion Driver 6.12 的架构 ...

  2. 基于QT做上位机开发,实现FPGA通过cyusb3014芯片完成数据的收发

    <基于QT做上位机开发,实现FPGA通过cyusb3014芯片完成数据的收发> #任务要求: 要求用qt编写上位机程序,实现FPGA通过cyusb3014芯片完成数据的收发.下面是采用通过 ...

  3. 基于Arduino平台dmp库+匿名四轴上位机测试MPU6050

    基于Arduino平台dmp库+匿名四轴上位机测试MPU6050

  4. 基于CANoen协议实现DSP系统与上位机CAN的通讯

    转 基于CANoen协议实现DSP系统与上位机CAN的通讯 电子设计•来源:郭婷•作者:电子设计 • 2019-07-10 08:08 • 1103次阅读 1.引言 CANopen是一个开放的.标准化 ...

  5. python适用于哪些芯片_用pyusb在Python中开发CY7C68013,利用,PyUSB,进行,芯片,的,上位,机...

    目录 前言 尽管现在USB技术飞速发展,USB传输的速度在不断的提高,但是CY7C68013这款芯片在某些低速场景下仍然适用.因此,基于Python开发出其对应的上位机具有一定的现实需求.然而,笔者在 ...

  6. 痞子衡嵌入式:分享一个i.MXRT系列配套DRAM压力测试上位机工具(i.MXRT DRAM Tester)...

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦SE团队制作的i.MXRT配套DRAM压力测试上位机工具. 事情源于痞子衡的技术交流群里的提问,有群友在恩智浦官方技术公众号 [恩 ...

  7. 【安富莱专题教程第8期】基于emWin模拟器的USB BULK上位机开发,仅需C即可,简单易实现...

    说明: 1.如果你会emWin话的,就可以轻松制作上位机.做些通信和控制类上位机,比使用C#之类的方便程度一点不差,而且你仅会C语言就可以. 2.并且成功将emWin人性化,可以做些Windows系统 ...

  8. 【WPF】基于WPF的上位机开发模板

    文章目录 一. 背景 二. 基于WPF的通用界面模板 三. WPF与python的协同开发 四. WPF模板代码路径 一. 背景 在嵌入式开发中,经常会写一些脚本来提高工作效率,在工作中发现,周围同事 ...

  9. 1.QT上位机开发之表格设计-TABLE WIDGET

    QT上位机开发之表格设计-TABLE WIDGET 开发平台: QT Designer QT5 系统:Windows 11 软件语言:python 项目需要开发上位机软件用于模块测试,自己之前没有做过 ...

  10. python上位机开发实例-python上位机

    广告关闭 腾讯云双11爆品提前享,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高满返5000元! 若python上位机接受到的字符为"1',则print出ok,如果字符是 ...

最新文章

  1. UC浏览器代理流量解密
  2. 优秀的 Java 项目是如何分层的?
  3. 【聊透SpringMVC】自学java和三大框架要多久
  4. 菜鸟也玩WebMatrix
  5. 详解在 Linux 启动时,如何自动执行命令或脚本
  6. Materials about design pattern
  7. Visual Studio二次安装时无法更改安装位置解决方案
  8. 字节跳动大规模实践埋点自动化测试框架设计
  9. 单点服务器微信公众号,腾讯云联合微信降低开发门槛 微信生态从单点云开发到全面云开发...
  10. 凝胶成像文件行业调研报告 - 市场现状分析与发展前景预测
  11. 深入浅出SCSI子系统(六)SCSI 磁盘驱动
  12. Java工作5年的迷茫,是否要转互联网?
  13. Olly's Shadow
  14. 信通方恒资产评估行业快讯:铁矿石供需关系未发生明显变化
  15. 几款好用的报表制作软件!!!
  16. spring的singleton和prototype
  17. 如何学习安卓软件开发?(转自知乎)
  18. html5 动画Ilove送给他(她)
  19. 【C#高级详解】——刘铁猛老师
  20. Android逆向之破解某僵尸游戏

热门文章

  1. vga分辨率与时序配置
  2. win10 动态磁盘 linux,教你如何将win10系统动态磁盘改成基本磁盘?
  3. C++:封装 继承 多态
  4. python菜鸟教程 | for 循环
  5. 西门子atch指令详解_西门子plc指令含义大全详解
  6. 10本深入学习Spring框架的最佳书籍和课程
  7. svg格式的中国地图轮廓图
  8. maven命令打jar包
  9. Windows 10 安装 IIS 管理器
  10. 5、那智机器人编码器复位与编码器修正