{
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
}
/* 发送数据帧函数 */
void Send_Data(uchar type,uchar len,uchar *buf)
{
uchar i,tmp;
uchar CheckSum = 0;
/* 允许发送,禁止接收 */
DE = 1;
RE = 1;
/* 发送帧起始字节 */
tmp = 0x24;
Send(tmp);
Send(DevNo); // 发送地址字节,也即设备号
CheckSum = CheckSum + DevNo;
Send(type); // 发送类型字节
CheckSum = CheckSum + type;
Send(len); // 发送数据长度字节
CheckSum = CheckSum + len;
/* 发送数据 */
for (i=0;i
{
Send(*buf);
CheckSum = CheckSum + *buf;
buf++;
}
Send(CheckSum); // 发送校验和字节
/* 发送帧结束字节 */
tmp = 0x2A;
Send(tmp);
}
/* 采集数据函数经过简化处理,取固定的10个字节数据 */
void Get_Stat(void)
{
StatusBuf[0]=DATA0;
StatusBuf[1]=DATA1;
StatusBuf[2]=DATA2;
StatusBuf[3]=DATA3;
StatusBuf[4]=DATA4;
StatusBuf[5]=DATA5;
StatusBuf[6]=DATA6;
StatusBuf[7]=DATA7;
StatusBuf[8]=DATA8;
StatusBuf[9]=DATA9;
}
/* 发送单字节数据 */
void Send(uchar m)
{
TI = 0;
SBUF = m;
while(!TI);
TI = 0;
}
/* 清除设备状态信息缓冲区函数*/
void Clr_StatusBuf(void)
{
uchar i;
for (i=0;i
StatusBuf[i] = 0;
}
关于接口,总线,驱动就介绍完了,您有什么想法可以联系小编。