Stm32利用串口读取IM1253B的数据在并行传输到1602显示屏上
单片机源程序如下:
- #include "Im1252.h"
- #include "bsp_usart.h"
- #define reveive_number 37
- unsigned char Rx_Buffer[UART_BUFF_SIZE];
- unsigned char receive_finished;
- unsigned char Tx_Buffer[15];
- ShowDataTypeDef ShowDataSTructure;
- 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;
- }
- //读取数据
- void read_data(void)
- {
- union crcdata crcnow;
- //定义一个地址区存放CRC校验
- // 到时间抄读模块,抄读间隔 1 秒钟(或其他)
- Tx_Buffer[0]=Read_ID; //模块的 ID 号,默认 ID 为 0x01
- Tx_Buffer[1]=0x03;
- Tx_Buffer[2]=0x00;
- Tx_Buffer[3]=0x48;
- Tx_Buffer[4]=0x00;
- Tx_Buffer[5]=0x08;
- crcnow.word16=chkcrc(Tx_Buffer,6);
- Tx_Buffer[6]=crcnow.byte[1]; //CRC 效验低字节在前
- Tx_Buffer[7]=crcnow.byte[0]; //发送 8 个数据,请根据单片机类型自己编程
- Usart_SendArray(DEBUG_USARTx,Tx_Buffer,8);
- }
- //电能清零
- void Clear_EnergyData(void)
- { //01 10 00 4B 00 02 04 00 00 00 00 B6 2C
- union crcdata crcnow;
- //定义一个地址区存放CRC校验
- // 到时间抄读模块,抄读间隔 1 秒钟(或其他)
- Tx_Buffer[0]=Read_ID; //模块的 ID 号,默认 ID 为 0x01
- Tx_Buffer[1]=0x10;
- Tx_Buffer[2]=0x00;
- Tx_Buffer[3]=0x4B;
- Tx_Buffer[4]=0x00;
- Tx_Buffer[5]=0x02;
- Tx_Buffer[6]=0x04;
- Tx_Buffer[7]=0x00;
- Tx_Buffer[8]=0x00;
- Tx_Buffer[9]=0x00;
- Tx_Buffer[10]=0x00;
- crcnow.word16=chkcrc(Tx_Buffer,11);
- Tx_Buffer[11]=crcnow.byte[1]; //CRC 效验低字节在前
- Tx_Buffer[12]=crcnow.byte[0]; //发送 8 个数据,请根据单片机类型自己编程
- Usart_SendArray(DEBUG_USARTx,Tx_Buffer,13);
- }
- //分析数据
- void Analysis_data(void)
- {
- union crcdata crcnow;
- if(Rx_Buffer[0]==Read_ID) //确认 ID 正确
- {
- crcnow.word16=chkcrc(Rx_Buffer,reveive_number-2); //reveive_numbe 是接收数据总长度
- if((crcnow.byte[0]==Rx_Buffer[reveive_number-1])&&(crcnow.byte[1]==Rx_Buffer[reveive_number-2]))
- {
- // ShowDataStructure.Current_data1 = (uint8_t *)&Rx_Buffer[3];
- //电压数据
- ShowDataSTructure.Voltage_data = (((uint32_t)(Rx_Buffer[3] ))<<24) |(((uint32_t)(Rx_Buffer[4]))<<16) |(((uint32_t)(Rx_Buffer[5]))<<8) |Rx_Buffer[6];
- //电流数据
- ShowDataSTructure.Current_data = (((uint32_t)(Rx_Buffer[7]))<<24) |(((uint32_t)(Rx_Buffer[8]))<<16) |(((uint32_t)(Rx_Buffer[9]))<<8) |Rx_Buffer[10];
- //有功数据
- ShowDataSTructure.Power_data = (((uint32_t)(Rx_Buffer[11]))<<24) |(((uint32_t)(Rx_Buffer[12]))<<16) |(((uint32_t)(Rx_Buffer[13]))<<8) |Rx_Buffer[14];
- //有功总电能数据
- ShowDataSTructure.Energy_data = (((uint32_t)(Rx_Buffer[15]))<<24) |(((uint32_t)(Rx_Buffer[16]))<<16) |(((uint32_t)(Rx_Buffer[17]))<<8) |Rx_Buffer[18];
- //功率因数数据
- ShowDataSTructure.Pf_data = (((uint32_t)(Rx_Buffer[19]))<<24) |(((uint32_t)(Rx_Buffer[20]))<<16) |(((uint32_t)(Rx_Buffer[21]))<<8) |Rx_Buffer[22];
- //二氧化碳数据
- ShowDataSTructure.CO2_data = (((uint32_t)(Rx_Buffer[23]))<<24) |(((uint32_t)(Rx_Buffer[24]))<<16) |(((uint32_t)(Rx_Buffer[25]))<<8) |Rx_Buffer[26];
- //温度数据
- ShowDataSTructure.Tem_data = (((uint32_t)(Rx_Buffer[27]))<<24) |(((uint32_t)(Rx_Buffer[28]))<<16) |(((uint32_t)(Rx_Buffer[29]))<<8) |Rx_Buffer[30];
- //频率数据
- ShowDataSTructure.Fre_data = (((uint32_t)(Rx_Buffer[31]))<<24) |(((uint32_t)(Rx_Buffer[32]))<<16) |(((uint32_t)(Rx_Buffer[33]))<<8) |Rx_Buffer[34];
- }
- }
- }
复制代码
所有资料51hei提供下载:
单向电能.7z
(201.72 KB, 下载次数: 87)
|