//说明:例子中的变量请自己根据习惯定义,Voltage_data~Pf_data等数据除以对应的倍率,就得到实际的值
用51怎么写主机程序来读取模块的信息?
- unsigned int calccrc(unsigned charcrcbuf,unsigned int crc)
- {
- unsignedchar i;
- unsignedchar 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;
- }
- returncrc;
- }
- unsigned int chkcrc(unsigned char*buf,unsigned char len)
- {
- unsignedchar hi,lo;
- unsignedint i;
- unsignedint 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=(((unsignedint)(hi))<<8)|lo;
- returncrc;
- }
- void read_data(void)
- {
- union crcdata
- {
- unsignedint word16;
- unsignedchar byte[2];
- }crcnow;
- if((Clock.Second%2)==1) //2秒读一次
- {
- Tx_Buffer[0]=Read_ID; //抄读模块的ID号
- Tx_Buffer[1]=0x03;
- Tx_Buffer[2]=0x00;
- Tx_Buffer[3]=0x48;
- Tx_Buffer[4]=0x00;
- Tx_Buffer[5]=0x06;
- crcnow.word16=chkcrc(Tx_Buffer,6);
- Tx_Buffer[6]=crcnow.byte[1]; //CRC效验低字节在前
- Tx_Buffer[7]=crcnow.byte[0];
- Send_data(8); //发送8个数据,请根据单片机类型自己编程
- }
- }
- void Analysis_data(void)
- {
- unsignedchar i;
- union crcdata
- {
- unsignedint word16;
- unsignedchar byte[2];
- }crcnow;
- if(Comm[1].Status==2) //接收完成
- {
- if(RX_Buffer[0]==Read_ID) //确认ID正确
- {
- crcnow.word16=chkcrc(RX_Buffer,Comm[1].nRx-2); //Comm[1].nRx是接收数据长度
- if((crcnow.byte[0]==RX_Buffer[Comm[1].nRx-1])&&(crcnow.byte[1]==RX_Buffer[Comm[1].nRx-2])) //CRC效验
- {
- Voltage_data=(((unsignedint)(RX_Buffer[3]))<<8)|RX_Buffer[4]; //Voltage_data为unsigned int型
- Current_data=(((unsignedint)(RX_Buffer[5]))<<8)|RX_Buffer[6]; //Current_data为unsigned int型
- Power_data=(((unsignedint)(RX_Buffer[7]))<<8)|RX_Buffer[8]; //Power_data为unsigned int型
- Energy_data=(((unsignedlong)(RX_Buffer[9]))<<24)|(((unsigned long)(RX_Buffer[10]))<<16)|(((unsignedlong)(RX_Buffer[11]))<<8)|RX_Buffer[12]; ////Energy_data为unsigned long型
- Pf_data=(((unsignedint)(RX_Buffer[13]))<<8)|RX_Buffer[14]; //Pf_data为unsigned int型
- }
- }
- Comm[1].Status=0; //切换回接收数据状态
- }
- }
复制代码
|