{

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;

}

关于接口,总线,驱动就介绍完了,您有什么想法可以联系小编。