最近买了一个单向交流计量模块(https://download.csdn.net/download/weixin_43205178/11472943)![在这里插入图片描述]这个模块实现通过自带的电脑串口通信,显示在限免如下形式 艾锐达公司出品的计量模块!淘宝客服只提供一个资料,之前也没写过接口函数,在几年前接受叶老师的指导接口出来了。感谢老师!
特地把程序贴出来!!!


```c
#include “delay.h”
#include “usart3.h”
#include “stdarg.h”
#include “usart.h”
#include “stdio.h”
#include “string.h”
#include “WIFI8266.h”
#include “led.h”
#include “usart3.h”
u8 USART3_RX_BUF[USART3_MAX_RECV_LEN];
u8 USART3_TX_BUF[USART3_MAX_SEND_LEN];
unsigned char Read_ID = 0x01;
unsigned char Tx_Buffer1[8];
unsigned char Rx_Buffer1[40];
unsigned char Rx_Buffer[40];
int receive_finished;
unsigned long Voltage_data, Current_data, Power_data, Energy_data, Pf_data, CO2_data, HZ;
int i = 8; //此次发送数据的长度
int j = 0;
float Pf_data1, HZ1;
int read_enable = 0;
int reveive_numbe = 0;
vu16 USART3_RX_STA = 0;
//中断服务函数    之前找用串口发送数据的程序自己带的函数
void USART3_IRQHandler(void)
{char Res;if (USART_GetITStatus(USART3, USART_IT_RXNE) != RESET){USART_ClearITPendingBit(USART3, USART_IT_RXNE);Res = USART_ReceiveData(USART3);if (USART3_RX_STA < USART3_MAX_RECV_LEN) //接收的字符串{Rx_Buffer1[USART3_RX_STA] = Res;USART3_RX_STA++;}}if (USART_GetITStatus(USART3, USART_IT_IDLE) != SET){receive_finished = 1;                           // 这个自动的发送的重点啊   这个IF利用的是空闲中断,在收完数据后自动发送USART_ClearITPendingBit(USART3, USART_IT_IDLE);}USART3->SR;USART3->DR;
}
//这个是计算CRC函数           买模块自身资料带的函数
unsigned int calccrc(unsigned char crcbuf, unsigned int crc)
{unsigned char i;unsigned char chk;crc = crc ^ crcbuf; for (i = 0; i < 8; i++){chk = (unsigned char)(crc & 1);crc = crc >> 1;crc = crc & 0x7fff;if (chk == 1) crc = crc ^ 0xa001;crc = crc & 0xffff;}return crc;
}
//这个是核对CRC校验函数       买模块自身资料带的函数   不用看
unsigned int chkcrc(unsigned char* buf, unsigned char len)
{unsigned char hi, lo;unsigned int i;unsigned int crc;crc = 0xFFFF;for (i = 0; i < len; i++){crc = calccrc(*buf, crc);buf++;}hi = (unsigned char)(crc % 256);lo = (unsigned char)(crc / 256);crc = (((unsigned int)(hi)) << 8) | lo;return crc;
}//读电能模块的函数       买模块自身资料带的函数    重点看for循环
void read_data(void)
{union  crcdata{unsigned int word16;unsigned char   byte[2];}crcnow;if (read_enable == 1) // 到时间抄读模块,抄读间隔 1 秒钟(或其他){read_enable = 0;Tx_Buffer1[0] = Read_ID; //模块的 ID 号,默认 ID 为 0x01 Tx_Buffer1[1] = 0x03;Tx_Buffer1[2] = 0x00;Tx_Buffer1[3] = 0x48;Tx_Buffer1[4] = 0x00;Tx_Buffer1[5] = 0x08;crcnow.word16 = chkcrc(Tx_Buffer1, 6);Tx_Buffer1[6] = crcnow.byte[1];    //CRC 效验低字节在前Tx_Buffer1[7] = crcnow.byte[0];}for (j = 0; j < i; j++)                         //循环发送数据01 03 00 48 00 08 C4 1A{while (USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET); //串口三 循环发送,直到发送完毕   USART_SendData(USART3, Tx_Buffer1[j]);while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); //循环发送,直到发送完毕   USART_SendData(USART1, Tx_Buffer1[j]); //用   串口一   来检测是否发送的一样
//                              Send_data(8);   //发送 8 个数据,请根据单片机类型自己编程}
}
//这个也是买模块自己带的资料   为解析数据   我们可以利用串口来打印出显示的数据
void Analysis_data(void)
{unsigned char i;union  crcdata{unsigned int word16;unsigned char   byte[2];}crcnow;if (receive_finished == 1)    //接收完成{printf("\r\nreceive_finished标志位为1\r\n");reveive_numbe = USART3_RX_STA; //这个也是好像写的receive_finished = 0;if ((Rx_Buffer1[0] == 0x01) || (Rx_Buffer1[0] == 0x00))    //确认 ID 正确{printf("\r\n确认 ID 正确\r\n");//串口一来打印接受电压值crcnow.word16 = chkcrc(Rx_Buffer1, reveive_numbe - 2);    //reveive_numbe 是接收数据总长度if ((crcnow.byte[0] == Rx_Buffer1[reveive_numbe - 1]) && (crcnow.byte[1] == Rx_Buffer1[reveive_numbe - 2]))//确认 CRC 校验正确{printf("\r\n%d\r\n", USART3_RX_STA); //这个是自己加的,,下面的是资料自己带的Voltage_data = (((unsigned long)(Rx_Buffer1[3])) << 24) | (((unsigned long)(Rx_Buffer1[4])) << 16) | (((unsigned    long)(Rx_Buffer1[5])) << 8) | Rx_Buffer1[6];printf("\r\n电压值:%lu\r\n", Voltage_data);//串口一来打印电压值  自己加的Current_data = (((unsigned long)(Rx_Buffer1[7])) << 24) | (((unsigned long)(Rx_Buffer1[8])) << 16) | (((unsigned  long)(Rx_Buffer1[9])) << 8) | Rx_Buffer1[10];printf("电流:%lu\r\n", Current_data);//串口一来打印电流Power_data = (((unsigned long)(Rx_Buffer1[11])) << 24) | (((unsigned long)(Rx_Buffer1[12])) << 16) | (((unsigned long)(Rx_Buffer1[13])) << 8) | Rx_Buffer1[14];printf("功率:%lu\r\n", Power_data);//串口一来打印功率Energy_data = (((unsigned long)(Rx_Buffer1[15])) << 24) | (((unsigned long)(Rx_Buffer1[16])) << 16) | (((unsigned long)(Rx_Buffer1[17])) << 8) | Rx_Buffer1[18];printf("电能:%lu\r\n", Energy_data);//串口一来打印电能Pf_data = (((unsigned    long)(Rx_Buffer1[19])) << 24) | (((unsigned long)(Rx_Buffer1[20])) << 16) | (((unsigned long)(Rx_Buffer1[21])) << 8) | Rx_Buffer1[22];Pf_data1 = (float)(Pf_data * 0.001);printf("功率因数:%.3lf\r\n", Pf_data1); //串口一来打印接受功率因数CO2_data = (((unsigned long)(Rx_Buffer1[23])) << 24) | (((unsigned long)(Rx_Buffer1[24])) << 16) | (((unsigned    long)(Rx_Buffer1[25])) << 8) | Rx_Buffer1[26];printf("二氧化碳:%lu\r\n", CO2_data);//串口一来打印接受二氧化碳HZ = (((unsigned long)(Rx_Buffer1[31])) << 24) | (((unsigned long)(Rx_Buffer1[32])) << 16) | (((unsigned  long)(Rx_Buffer1[33])) << 8) | Rx_Buffer1[34];HZ1 = HZ * 0.01;printf("赫兹:%.2lfHZ\r\n", HZ1);//串口一来打印接受单相交流电的赫兹USART3_RX_STA = 0;// wifi_null();}// else printf("// CRC 校验错误\r\n");//串口一来打印接受电压值}}// else printf("\r\nreceive_finished标志位为0\r\n");}
void wifi_null(void) //清空USART3_RX_BUF内存
{for (i = 0; i < 37; i++)Rx_Buffer1[i] = 0;
}
//下面是自己的找的串口发送函数
//初始化IO 串口3
//pclk1:PCLK1时钟频率(Mhz)
//bound:波特率
void usart3_init(u32 bound)
{NVIC_InitTypeDef NVIC_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);    // GPIOB时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); //串口3时钟使能USART_DeInit(USART3);  //复位串口3//USART3_TX   PB10GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PB10GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化PB10//USART3_RX    PB11GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化PB11USART_InitStructure.USART_BaudRate = bound;//波特率一般设置为9600;USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式USART_Init(USART3, &USART_InitStructure); //初始化串口 3//设置中断优先级NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//抢占优先级3NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;       //子优先级3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;         //IRQ通道使能NVIC_Init(&NVIC_InitStructure);    //根据指定的参数初始化VIC寄存器wifi_null();//使能接收中断USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//开启中断USART_ITConfig(USART3, USART_IT_IDLE, ENABLE);//开启空闲中断USART_Cmd(USART3, ENABLE); //使能串口
}//下面就是主函数了#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "usart3.h"
int main(void)
{u16 t;u16 len;u16 times = 0;delay_init();          //ÑÓʱº¯Êý³õʼ»¯     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //ÉèÖÃNVICÖжϷÖ×é2:2λÇÀÕ¼ÓÅÏȼ¶£¬2λÏìÓ¦ÓÅÏȼ¶uart_init(4800);   //´®¿Ú-À´¼àÊÓ·¢ËÍ״̬usart3_init(4800); //¸øµçÄÜÁ÷Á¿¼Æ·¢ËÍÊý¾Ýread_enable = 1;       //在初始化的时候就设置为一  开始启动read_data(); 来进行读电能模块read_data();while (1){if (receive_finished)  //如果接受完     receive_finished ==1 则表示延时2S后 我们就把完成的标志变成0,,这样主函数就不会执行,,就是不让它太快执行{delay_ms(2000);Analysis_data();  //这个函数理论上是需要打开的receive_finished = 0;read_data();    //但是本次是采用的  串口中断的方式  是更高级的表示,就是串口的中断标志位变成了空闲状态就自动开启下一次的中断}}}![在这里111111插入图片描述](https://img-blog.csdnimg.cn/2019080512462647.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzIwNTE3OA==,size_16,color_FFFFFF,t_70)实测可以成功那
总体的思路就是 客服给你的程序.c文件复制到串口函数中,他的代码你不用改,你就在read_data(void)函数中 用for循环调用串口发送函数把USART_SendData(USART3, Tx_Buffer1[j]);  把他的Tx_Buffer1[j]数组里面的数据 发送给模块,发送完就receive_finished == 1 表示接收完成,就是打印读出的数据,,重点是在在中断函数中 开启中断服务函数中的空闲中断很方便转化完一次就自动开始。仔细思考下很简单的。有需要我的程序  请到我的空间里面的下载资料面,直接下载。可以参考下呢。或者直接搜索 CSDN 搜索艾锐达电能流量计的使用,,就可以出来下载文件了。链接:https://pan.baidu.com/s/1Xszl-ClEQG6J8gGBoc0Gvg
提取码:6n9r
复制这段内容后打开百度网盘手机App,操作更方便哦

IM1281B单相交流计量模块使用讲解相关推荐

  1. pythondifflib详解_python difflib模块示例讲解

    difflib模块提供的类和方法用来进行序列的差异化比较,它能够比对文件并生成差异结果文本或者html格式的差异化比较页面,如果需要比较目录的不同,可以使用filecmp模块. class diffl ...

  2. IM1253B交直流电能计量模块(艾锐达光电)

    冯: 基于IM1253B交直流电能计量模块(艾锐达光电)设计的测量电压.电流.功率测量物 该模块质量不错,价格便宜,使用简单,容易上手,测量电压范围大,可测交流,直流,功率等. 如果想要资料或者源码的 ...

  3. arduino控制IM1281B电量计能模块

    小声比比 入手了一块IM1281B电量计能模块,无奈网上和各个店铺只有51和32的示例代码,直接使用串口通讯,将这鬼东西得到的数据进行存储进数组中,但是数组的数据无法单个处理,这是什么情况? 无奈之下 ...

  4. 5G智慧用电解决方案新建基站之直流电能计量模块选型

    5G智慧用电解决方案新建基站之直流电能计量模块 --AMC16-DETT 01 概述 AMC16-DETT基站直流电能计量模块主要是针对有共享需求,且开关电源无分用户电量计量功能的基站而设计的.仪表可 ...

  5. 5G基站直流电能计量模块 安科瑞上市公司

    AMC16-DETT 基站直流电能计量模块主要是针对有共享需求,且开关电源无分用户电量计量功能的基站而设计的.仪表可对六个回路的直流电能进行计量,并可为配套的霍尔传感器提供工作电流,同时可通过上位机软 ...

  6. python导入同级包_python小课堂15 - 史上最详细的包和模块import讲解篇

    python小课堂15 - 史上最详细的包和模块import讲解篇 前言 在大量的代码设计中,我们不可能将所有代码都写在一个.py文件,所以有了包.模块,而为了代码可以重复利用(复用性),就有了类.函 ...

  7. python 引入同一路径的类_python小课堂15 - 史上最详细的包和模块import讲解篇

    python小课堂15 - 史上最详细的包和模块import讲解篇 前言 在大量的代码设计中,我们不可能将所有代码都写在一个.py文件,所以有了包.模块,而为了代码可以重复利用(复用性),就有了类.函 ...

  8. 【python小课堂专栏】python小课堂15 - 史上最详细的包和模块import讲解篇

    python小课堂15 - 史上最详细的包和模块import讲解篇 前言 在大量的代码设计中,我们不可能将所有代码都写在一个.py文件,所以有了包.模块,而为了代码可以重复利用(复用性),就有了类.函 ...

  9. python sys模块讲解_python模块之sys模块和序列化模块(实例讲解)

    sys模块 sys模块是与python解释器交互的一个接口 sys.argv 命令行参数List,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退出时exit(0),错误退出sys. ...

最新文章

  1. 第三周课程总结及实验报告(一)
  2. 玲珑杯 ACM Round #10
  3. proxy connect abort处理方法_Vue 3.0 初探 - Proxy
  4. CSS布局的三个关键属性:float、position、display
  5. OpenXLive 0.9.9 SDK发布,增加对SNS的支持
  6. Docker中级篇|深入探究Docker
  7. tar包bz2和gz的对比
  8. Processor Tracing | 处理器追踪
  9. python 操作mysql_Python 操作MySQL
  10. 上计算机课睡觉检讨书400,小学生上自习课睡觉检讨书
  11. Linux内核list_head学习(二)
  12. [转载] python日期时间使用详解和定时器使用讲解
  13. python字典用法_科学网—Python:字典和字典方法 - 刘洋洋的博文
  14. 微信小程序添加使用外部字体
  15. 进销存excel_Excel进销存管理系统(升级版),库存进出全自动,使用超方便哦...
  16. gpt和mbr的区别
  17. WDS+MDT部署Windows7操作系统2—;导入启动映像和安装映像
  18. 【品牌DTC增长力】从AIPL模型看策略趋势
  19. ad电阻原理图_Arduino动手做(2)光敏电阻模块
  20. d盘莫名其妙被占空间 win10_Win10系统C盘空间突然爆满的解决方法

热门文章

  1. 做个非常非常非常简单的单因素方差分析案例
  2. 全球区块链第26周看点 | G20中方发言人:中国在数字货币、加密资产等领域做得较好...
  3. 深入理解用户态和系统态
  4. ACCP8.0Y2Web前端框架与移动应用开发第4章Bootstrap的JavaScript插件
  5. 深度搜索算法(python实现)获取所有叶子节点到根节点的路径
  6. 广告精准推送项目介绍
  7. python ffmpeg模块mp4岀错_Python 调用 FFmpeg 提示 module 'ffmpeg' has no attribute 'input' 的解决方法-老唐笔记...
  8. 物联网时代的智能基础设施
  9. 物联网时代来临 企业将面临哪些挑战?
  10. 如何创建Crypto Coin