📄 comm.c
字号:
#include "main.h"
#include "comm.h"
//////////////////////////////////////////////////////////
//stx addr cmd lenh lenl data xor
//0 1 2 3 4 5..
//////////////////////////////////////////////////////////
xdata unsigned char g_CommBuffer[600];
unsigned int g_CommLen;
/////////////////////////////////////////
//CPU种类:12分频时钟周期
//定时器: T2定时器
//误差: 4.5%
//公式: 波特率= 晶振频率/(32*(65536 - [RCAP2H,RCAP2L]))
//CopyRight by YTH 2002.11.11
/////////////////////////////////////////
#ifdef CRYTAL221184MHZ
void InitComm(unsigned char nBaudRate)
{
TMOD=0x20 |(TMOD&0x0f0);
PCON=0x80;
switch(nBaudRate)
{
case Baud9600:
TH1=244;
break;
case Baud19200:
TH1=250;
break;
case Baud38400:
TH1=253;
break;
case Baud115200:
TH1=255;
break;
}
TL1=TH1;
SCON=0x50;
//ES=1;
TR1=1;
}
#endif
#ifdef CRYTAL147456MHZ
void InitComm(unsigned char nBaudRate)
{
TMOD=0x20 |(TMOD&0x0f0);
PCON=0x00;
switch(nBaudRate)
{
case Baud9600:
TH1=252;
break;
case Baud19200:
TH1=254;
break;
case Baud38400:
TH1=255;
break;
}
TL1=TH1;
SCON=0x50;
//ES=1;
TR1=1;
}
#endif
#ifdef CRYTAL110592MHZ
void InitComm(unsigned char nBaudRate)
{
T2CON=0x30;
switch(nBaudRate)
{
case Baud9600:
RCAP2H=255;RCAP2L=220;
break;
case Baud19200:
RCAP2H=255;RCAP2L=238;
break;
case Baud38400:
RCAP2H=255;RCAP2L=247;
break;
case Baud115200:
RCAP2H=255;RCAP2L=253;
break;
}
SCON=0x50;
TR2=1;
}
#endif
unsigned char ReadComm1(unsigned char *ch)
{
unsigned int timeout= COMM_TIMEOUT1;
while(--timeout)
{
WatchDog();
if(RI==1)
{
RI=0;
*ch=SBUF;
return ID_OK;
}
}
return ID_ERR;
}
unsigned char ReadComm(unsigned char *ch)
{
unsigned long timeout= COMM_TIMEOUT;
while(--timeout)
{
WatchDog();
if(RI==1)
{
RI=0;
*ch=SBUF;
return ID_OK;
}
}
return ID_ERR;
}
unsigned char WriteComm(unsigned char ch)
{
unsigned long timeout= COMM_TIMEOUT;
SBUF=ch;
while(--timeout)
{
WatchDog();
if(TI==1)
{
TI=0;
return ID_OK;
}
}
return ID_ERR;
}
/*
********************************************************
**格式:60 addr cmd len data xor
********************************************************
*/
unsigned char ReceiveData(void)
{
unsigned char ch;
unsigned char xorcode=0;
unsigned int len;
NumCounter=0;
//startcode
while(1)
{
WatchDog();
ReadComm(&ch);
if(ch==0x60)break;
if(ch==0x55)NumCounter++;
if(NumCounter>5)
{
WriteComm(0xaa);//Comm Start Byte
WriteComm(0xaa);//Comm Start Byte
WriteComm(0xaa);//Comm Start Byte
WriteComm(0xaa);//Comm Start Byte
WriteComm(0xaa);//Comm Start Byte
}
}
//if(ch!=0x60)return COMM_STX_ERR;
g_CommBuffer[0]=ch;
xorcode ^=ch;
//addr
if(ReadComm(&ch)) return COMM_TMO_ERR;
g_CommBuffer[1]=ch;
xorcode ^=ch;
//cmd
if(ReadComm(&ch)) return COMM_TMO_ERR;
g_CommBuffer[2]=ch;
xorcode ^=ch;
WatchDog();
//len1
if(ReadComm(&ch)) return COMM_TMO_ERR;
g_CommBuffer[3]=ch;
xorcode ^=ch;
len=ch;
//len2
if(ReadComm(&ch)) return COMM_TMO_ERR;
g_CommBuffer[4]=ch;
xorcode ^=ch;
len<<=8;
len+=ch;
// *((unsigned char *)(&len)+0)=g_CommBuffer[3];
// *((unsigned char *)(&len)+1)=g_CommBuffer[4];
g_CommLen=len;
if(len>600)return COMM_LEN_ERR;
//data
for(i=0;i<len;i++)
{
WatchDog();
if(ReadComm(&ch)) return COMM_TMO_ERR;
g_CommBuffer[5+i]=ch;
xorcode ^=ch;
}
//xor
if(ReadComm(&ch)) return COMM_TMO_ERR;
xorcode ^=ch;
//check veryfy
if(xorcode==0)return ID_OK; //校验对
else return COMM_XOR_ERR;//校验错
}
void SendResponse(unsigned char StateCode,unsigned char *StrData,unsigned int Len)
{
unsigned char CrcCode=0;
unsigned char ch;
WatchDog();
PIN_TXEN=RS485_COMM_ENABLE;//不允许发送
//for(i=0;i<100;i++) WatchDog();
//start
WriteComm(0x60);//Comm Start Byte
CrcCode ^=0x60;
//addr
WriteComm(0x01);
CrcCode ^=0x01;
//status
WriteComm(StateCode);
CrcCode ^=StateCode;
WatchDog();
//len
ch=((Len>>8)&0xff);
WriteComm(ch);
CrcCode ^=ch;
ch=(Len&0xff);
WriteComm(ch);
CrcCode ^=ch;
//data
for(i=0;i<Len;i++)
{
WatchDog();
ch=StrData[i];
WriteComm(ch);
CrcCode ^=ch;
}
//xor
WriteComm(CrcCode);
//for(i=0;i<100;i++)WatchDog();
PIN_TXEN=RS485_COMM_DISENABLE;//不允许发送
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -