打印

买新书 串口通信提问

[复制链接]
1457|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
517650971|  楼主 | 2011-5-23 15:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
【实例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这个要怎么定义啊?

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

40

帖子

1

粉丝