标题:
Modbus协议用下面的函数写51单片机的程序怎么写
[打印本页]
作者:
asdadqw2
时间:
2018-4-4 22:20
标题:
Modbus协议用下面的函数写51单片机的程序怎么写
//
说明:例子中的变量请自己根据习惯定义,
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; //切换回接收数据状态
}
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1