📄 comm.c
字号:
//comm.c
char CommCheckBCC(void)
{
unsigned char Len,i;
BCC=0;
i=0;
Len=CommBuff[0];
while(Len)
{
BCC^=CommBuff[i];
i++;
Len--;
}
if ((CommBuff[1]==0x50)&&(CommBuff[4]==0x52))
{
return 1;
}
if ((BCC!=CommBuff[i])||(CommBuff[0]!=(cRxCunt-1)))
{
return 0;
}
else
{
return 1;
}
}
void CommTxAnser(unsigned char Len,unsigned char Sta)
{
unsigned char i;
CommBuff[0]=Len;
CommBuff[1]=Sta;
BCC=0;
i=0;
Len--;
while(Len)
{
clrwdt();
while (!TRMT){;}
TXREG=CommBuff[i];
BCC^=CommBuff[i];
i++;
Len--;
}
BCC^=MyAddr;
while (!TRMT){;}
TXREG=MyAddr;
while (!TRMT){;}
TXREG=BCC;
while (!TRMT){;}
// LED_R_Flash(2,10);//通信正常,红灯闪2次,亮1s,灭1s
LedHoldTmr=20;
LEDcunt=1;
}
// 设置波特率,存储在0x10~0x11
unsigned SetBaud(unsigned char Mode)
{
if (Mode==3)
{
Baud=35;//19200bps
}
else if(Mode==2)
{
Baud=71;//9600bps
}
else
{
return 0;
}
RCSTA=0;
TXSTA=0;
SPBRG=Baud;
// Write24C32(E2Addr_Baud,1,&Baud);
RCSTA=rxdsta_ini; //串口初始化
TXSTA=txdsta_ini;
return 1;
}
// 设置通信地址,存储在0x12~0x13位置
// void SetCommAddr(unsigned char Addr)
// {
// MyAddr=Addr;
// PcdWriteE2(0x30,1,&MyAddr);
// }
void CommRx(void)
{
unsigned char i,Addr;
Addr=CommBuff[cRxCunt-2];
// 检查通信地址是否匹配//检查数据校验是否正确
// if ((MyAddr==Addr)||(Addr==0))
if (Addr==MyAddr)
{
if (CommCheckBCC())
{
switch(CommBuff[1])
{
case 0x50://设备复位
CommTxAnser(3,0);
while(1) {;}
break;
case 0x52://波特率设定
CommTxAnser(3,0);
if (SetBaud(CommBuff[2]))
{
;
}
else
{
CommTxAnser(3,0xff);
}
break;
// case 0x53://通信地址设定
// SetCommAddr(CharToHex(CommBuff[2],CommBuff[3]));
// CommTxAnser(4,0);
// while(1) {;}
// break;
case 0x55://设备版本
CommBuff[2]='0';
CommBuff[3]='0';
CommBuff[4]='0';
CommBuff[5]='0';
CommBuff[6]='0';
CommBuff[7]='0';
CommBuff[8]='H';
CommBuff[9]='C';
CommBuff[10]='R';
CommBuff[11]='0';
CommBuff[12]='1';
CommBuff[13]='0';
CommBuff[14]='1';
CommBuff[15]='0';
CommBuff[16]='0';
CommBuff[17]='2';
CommTxAnser(0x13,0);
break;
case 0x57://有效卡指示
BeepBeep(1,8);//蜂鸣器响一声短声
LED_R_Flash(1,5);//红灯闪1次0.5s,灭1s
CommTxAnser(3,0);
Flag.CardIn=0;
Snr_Temp[0]=0xff;
Snr_Temp[1]=0xff;
Snr_Temp[2]=0xff;
Snr_Temp[3]=0xff;
break;
case 0x58://无效卡指示
BeepBeep(1,15);//蜂鸣器响一声长音
LED_R_Flash(2,5);//红灯闪2次,0.5s,灭0.5s
CommTxAnser(3,0);
break;
case 0x88://获得卡号
if (Flag.CardIn)
{
CommBuff[2]='0';
CommBuff[3]='0';
CommBuff[4]='0';
CommBuff[5]='0';
CommBuff[6]='0';
CommBuff[7]='0';
CommBuff[8]='0';
CommBuff[9]='0';
CommBuff[10]=HexToChar((Snr_Temp[0]>>4)&0x0f);
CommBuff[11]=HexToChar(Snr_Temp[0]&0x0f);
CommBuff[12]=HexToChar((Snr_Temp[1]>>4)&0x0f);
CommBuff[13]=HexToChar(Snr_Temp[1]&0x0f);
CommBuff[14]=HexToChar((Snr_Temp[2]>>4)&0x0f);
CommBuff[15]=HexToChar(Snr_Temp[2]&0x0f);
CommBuff[16]=HexToChar((Snr_Temp[3]>>4)&0x0f);
CommBuff[17]=HexToChar(Snr_Temp[3]&0x0f);
CommTxAnser(0x13,0);
LED_R_Flash(1,10);//红灯闪1次,1s,灭1s
// Flag.CardIn=0;
// Snr_Temp[0]=0xff;
// Snr_Temp[1]=0xff;
// Snr_Temp[2]=0xff;
// Snr_Temp[3]=0xff;
}
else
{
CommTxAnser(3,0xf0);
}
break;
default:
CommTxAnser(3,0xff);
break;
}
Sta.CommErr=0;
tmrCommErr=0;
}
else
{
Sta.CommErr=1;
// LED_R_Flash(2,5);//红灯闪2次,500ms,灭500ms
}
}
else
{
Sta.CommErr=1;
}
cRxCunt=0;
for (i=0;i<24;i++)
{
CommBuff[i]=0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -