/* 接收数据帧函数,实际上接收的是主机的指令 */
bit Recv_Data(uchar *type)
{
uchar tmp,rCount,i;
uchar r_buf[RECFRMMAXLEN]; // 保存接收到的帧
uchar Flag_RecvOver; // 一帧接收结束标志
uchar Flag_StartRec; // 一帧开始接收标志
uchar CheckSum; // 校验和
uchar DataLen; // 数据字节长度变量
/* 禁止发送,允许接收 */
DE = 0;
RE = 0;
/* 接收一帧数据 */
rCount = 0;
Flag_StartRec = 0;
Flag_RecvOver = 0;
while (!Flag_RecvOver)
{
RI = 0;
while (!RI);
tmp = SBUF;
RI=0;
/* 判断是否收到字符'$',其数值为0x24 */
if ((!Flag_StartRec) && (tmp == 0x24))
{
Flag_StartRec = 1;
}
if (Flag_StartRec)
{
r_buf[rCount] = tmp;
rCount ++;
/* 判断是否收到字符'*',其数值为0x2A,根据接收的指令设置相应标志位 */
if (tmp == 0x2A)
Flag_RecvOver = 1;
}
if (rCount == RECFRMMAXLEN) // 帧超长错误,返回0
return 0;
}
/* 计算校验和字节 */
CheckSum = 0;
DataLen = r_buf[3];
for (i=0;i++;i<3+DataLen)
{
CheckSum = CheckSum + r_buf[i+1];
}
/* 判断帧是否错误 */
if (rCount<6) // 帧过短错误,返回0,最短的指令帧为6个字节
return 0;
if (r_buf[1]!=DevNo) // 地址不符合,错误,返回0
return 0;
if (r_buf[rCount-2]!=CheckSum) // 校验错误,返回0
return 0;
*type = r_buf[2]; // 获取指令类型
return 1; // 成功,返回1
}
|