C51编程:大家帮我看看通讯!!!
485通讯 CTR485 为控制线 偶校验、累加和校验
格式: FE FE FE FE 68 X X X X X X 68 X L X .... CRC 16
#include <c:\comp51\reg52.h>
#include <c:\comp51\intrins.h>
typedef unsigned char uchar;
typedef unsigned int uint;
typedef unsigned long ulong;
struct ByteDcr
{
uchar ByteHI;
uchar ByteLO;
};
union WordDcr
{
uint Word;
struct ByteDcr ByteWord;
};
union WordDcr idata DDWord;
uchar idata MeterNO[6],InBuff[20];
uchar idata ControlNO,LengthNO,SystemError;
bit fgDataEnable=0;
sbit CTR485=P1^7;
void answer_com(uchar ctr,uchar *str1,uint strlen1,uchar *str2,uint strlen2);
unsigned char receive_char_com(void);
bit GetParity(unsigned char Datavalue);
void init_serialcomm(void);
void send_char_com(unsigned char ch);
void serial (void);
void main(void)
{
init_serialcomm(); //初始化串口
while(1)
{
send_char_com(0x12);
if(fgDataEnable)
{
fgDataEnable=0;
answer_com(0x81,MeterNO,0,MeterNO,0);
}
}
}
void answer_com(uchar ctr,uchar *str1,uint strlen1,uchar *str2,uint strlen2)
{
uchar check,k;
send_char_com(0xfe);
send_char_com(0xfe);
send_char_com(0xfe);
send_char_com(0xfe);
send_char_com(0x68);
check=0x68;
send_char_com(0x00);
check+=0x00;
send_char_com(0x00);
check+=0x00;
send_char_com(0x00);
check+=0x00;
send_char_com(0x00);
check+=0x00;
send_char_com(0x00);
check+=0x00;
send_char_com(0x00);
check+=0x00;
send_char_com(0x68);
check+=0x68;
send_char_com(ctr);
check+=ctr;
//send_char_com((DDWord.ByteWord.ByteLO+0x33));
check+=(DDWord.ByteWord.ByteLO+0x33);
//send_char_com((DDWord.ByteWord.ByteHI+0x33));
check+=(DDWord.ByteWord.ByteHI+0x33);
do
{
check+=*(str1+k);
send_char_com(*(str1 + k));
k++;
} while(k < strlen1);
do
{
check+=*(str2+k);
send_char_com(*(str2 + k));
k++;
} while(k < strlen2);
send_char_com(check);
send_char_com(0x16);
}
bit GetParity(unsigned char Datavalue)
{
ACC=Datavalue;
if(P==1) return 1;
else
return 0;
}
void init_serialcomm(void)
{
SCON = 0xd0; //SCON: serail mode 1, 8-bit UART, enable ucvr
TMOD |= 0x20; //TMOD: timer 1, mode 2, 8-bit reload
PCON |= 0x80; //SMOD=1;
TH1 = 0xFa; //Baud:9600 fosc=11.05MHz
ES=1;
EA=1; //Enable Serial Interrupt
TR1=1; // timer 1 run
}
unsigned char receive_char_com(void)
{
unsigned int Count=400;
do{
Count--;
if(RI)
{
RI=0;
if(RB8=GetParity(SBUF)) return SBUF;
}
}while(Count!=0);
}
//向串口发送一个字符
void send_char_com(unsigned char ch)
{
CTR485=0;
TB8=GetParity(ch);
SBUF=ch;
while(TI==0);
TI=0;
}
//串口接收中断函数
void serial () interrupt 4 using 1
{
unsigned char i,CheckSum,Chal,ch;
if(RI)
{
ES=0;
RI=0;
if(RB8==GetParity(SBUF))
{
if(SBUF==0x68)
{
Chal=0;
CheckSum=0x68;
for(i=0;i<6;i++)
{
ch=receive_char_com();
CheckSum+=ch;
if(ch!=0) Chal++;
}
if(Chal==0)
{
if(receive_char_com()
==0x68)
{
CheckSum+=0x68;
ControlNO=receive_char_com();
CheckSum+=ControlNO;
LengthNO=receive_char_com();
CheckSum+=LengthNO;
DDWord.ByteWord.ByteLO=receive_char_com();
CheckSum+=DDWord.ByteWord.ByteLO;
DDWord.ByteWord.ByteHI=receive_char_com();
CheckSum+=DDWord.ByteWord.ByteHI;
DDWord.ByteWord.ByteHI-=0x33;
DDWord.ByteWord.ByteLO-=0x33;
if(LengthNO>2)
{
for(i=0;i<
(LengthNO-2);i++)
{
InBuff[i]=receive_char_com();
CheckSum+=InBuff[i];
}
}
i=receive_char_com();
ch=receive_char_com();
if((i==CheckSum)
&&(ch==0x16)) fgDataEnable=1;
ES=1;
}
else
{
ES=1;
}
}
else
{
ES=1;
}
}
else
{
ES=1;
}
}
_nop_();
}
}
发表时间:2002年10月24日15:18:00