📄 zlg500s_comm.c
字号:
#define ZLG500S_COMM_GLOBALS
#include "config.h"
#include "Zlg500S.h"
#include "zlg500S_comm.h"
INT8U SetBaud()
{
INT8U temp;
INT8U SetCunt = 3;
while(SetCunt)
{
SBUF = STX;
while(TI == 0); TI = 0;
for(temp=15;temp>0;temp--); //延时30us
SBUF = STX;
while(TI == 0); TI = 0;
WaitRespDly = ZLG500S_DELAY_10ms;
while(RI == 0 && WaitRespDly);
RI = 0;
if(WaitRespDly == 0)
{
SetCunt--;
continue;
}
else
{
temp = SBUF;
if(temp == ACK)
return TRUE;
else
{
SetCunt--;
continue;
}
}
}
return FALSE;
}
void ZLG500S_COMM_Init()
{
PCON = 0x80; // SMOD = 1;
SCON = 0x50; // Mode 1, 8-bit UART, enable receiption
TMOD = 0x21; // Timer 1, mode 2, 8-bit auto reload,
TH1=BAUDRATE;
TL1=BAUDRATE;
TR1 = 1;
SerDTvalid = FALSE;
SetBaud();
ES = 1;
}
void UART_Isr() interrupt 4 using 1
{
if(RI)
{
RI = 0;
SerBfr[SerBfrIdx] = SBUF;
if(SerBfrIdx == FRAMELEN)
{
if(SerBfr[FRAMELEN] < PRTCLEN || SerBfr[FRAMELEN] > MAXSERSIZE)
{
return;
}
}
SerBfrIdx++;
if(SerBfrIdx >= SerBfr[FRAMELEN])
{
SerDTvalid = TRUE;
SerBfrIdx = FRAMELEN;
}
}
else
{
TI = 0;
if(SerBfrIdx < SerBfr[FRAMELEN])
{
SBUF = SerBfr[SerBfrIdx];
SerBfrIdx++;
}
else
{
SerBfrIdx = FRAMELEN;
REN = 1; //发送响应完毕,重新使能接收
}
}
}
INT8U Ser_Rcv()
{
INT8U i,BCC;
INT8U Status = FALSE;
if(SerDTvalid)
{ //已接收一帧数据,进行数据校验
if(SerBfr[SerBfr[FRAMELEN]-1] == ETX && SerBfr[FRAMELEN] == (SerBfr[LENGTH]+PRTCLEN))
{ //正确接收到ETX,及帧长度等于数据长度加协议长度,则数据有效
BCC = 0;
for(i=0; i<(SerBfr[FRAMELEN]-1); i++)
{
BCC ^= SerBfr[i];
}
if(BCC == 0xff)
Status = TRUE; //BCC校验通过
}
SerDTvalid = FALSE;
}
return Status;
}
INT8U Ser_Send()
{
INT8U i,BCC;
SerBfr[FRAMELEN] = SerBfr[LENGTH]+PRTCLEN; //帧长度等于数据长度加协议长度
BCC = 0;
for(i=0; i<(SerBfr[FRAMELEN]-2); i++)
BCC ^= SerBfr[i];
SerBfr[SerBfr[FRAMELEN]-2] = ~BCC;
SerBfr[SerBfr[FRAMELEN]-1] = ETX;
SerBfrIdx = FRAMELEN;
TI = 1;
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -