【实例76】 PC与单片机通信
(1)串行接收中断服务程序void seri_isr()
void seri_isr( void ) interrupt 4 using 2
{
unsigned char tmp;
unsigned char chksum;
if(0==RI) /* 清允许接收标志位 */
{
return;
}
else
{
RI = 0;
}
tmp = SBUF;
if( tmp == 0xCC )
/* 是开始字符吗? */
{
haved_recv_syn = 1;
}
else
{
if( 0== haved_recv_syn )
/*如果没有事先接收到开始字符,说明不是数据帧的开始,返回*/
{
return ;
}
else
/* 已经接收到开始字符了 */
(
if( 0xDD != tmp )
/*如果接收到的不是结束字符,则是数据帧中的数据*/
{
recv_buf[ counter ] = tmp;
/* 保存到缓冲区中 */
counter ++;
}
else
/*接收到结束字符了*/
{
chksum = calc_chksum( &recv_buf[0],counter );
/*计算校验和*/
if( chksum == tmp )
/*校验正确在置位接收数据帧正确标志*/
{
recv_frame_ok = 1;
haved_recv_syn = 0;
return ;
}
else
/* 数据帧校验不正确则返回 */
{
counter = 0;
recv_frame_ok = 0;
haved_recv_syn = 0;
return;
}
}
}
}
(2)计算缓冲中的数据的校验值子程序unsigned char calc_chksum()
unsigned char calc_chksum( unsigned char *buf,unsigned char counter )
{
unsigned char resu;
unsigned char i;
resu = 0;
for(i=0; i<counter-1;i++)
/* 计算校验和不包括校验字节本身 */
{
resu +=buf;
}
return resu;
}
(3)发送数据子程序void send_frame()
void send_frame( void )
{
unsigned char i;
unsigned char chksum;
send_buf[0] = 0xCC;
/* 起始字节 */
send_buf[1] = (unsigned char )(meter_id>>8 );
/* 表号高8位 */
send_buf[2] = (unsigned char )(meter_id&0xff);
/* 表号低8位 */
send_buf[3] = (unsigned char )(room_id >>8 );
/* 房间号高8位 */
send_buf[4] = (unsigned char )(room_id &0xff);
/* 房间号低8位 */
send_buf[5] = cmd;
/* 命令字节 */
send_buf[6] = data_len;
/* 数据域的长度 */
for( i=0;i<data_len;i++)
{
send_buf[7+i] = data_buf;
/* 将数据域填到发送缓冲中 */
}
chksum = calc_chksum( &send_buf[0],data_len+7);
/* 计算校验和 */
send_buf[7+data_len] = chksum;
send_buf[8+data_len] =0xDD;
/* 结束字节 */
for( i=0; i<8+data_len;i++)
/* 发送数据 */
{
SBUF = send_buf;
while( 0 == TI );
TI = 0;
}
}
刚买了一本书,程序如上,可是我不明白haved_recv_syn是什么意思,还有recv_buf[counter]=tmp这个要怎么定义啊? |