打印

485通讯接收函数能写到串口中断函数中么

[复制链接]
1991|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wyw880829|  楼主 | 2013-5-8 09:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
wyw880829|  楼主 | 2013-5-8 10:41 | 只看该作者
/* 接收数据帧函数,实际上接收的是主机的指令 */
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
}

使用特权

评论回复
板凳
wyw880829|  楼主 | 2013-5-8 10:42 | 只看该作者
这是书上的写法

使用特权

评论回复
地板
wyw880829|  楼主 | 2013-5-8 10:43 | 只看该作者
//串口中断处理(接收)
serial () interrupt 4
{   if (RI)  
    {  RI = 0;       
            if(!inbufful)
            {
            *inlast= SBUF;            //放入数据            
            inlast++;                    //最后放入的位置加一
        inbufsign=1;
            if (inlast==inbuf+ILEN) inlast=inbuf;//地址到顶部回到底部
            if (inlast==getlast)        inbufful=1;  //接收缓冲区满置满标志
              
            }
    }
}
这是程序里422接收中断函数

使用特权

评论回复
5
Andylue| | 2013-8-2 20:15 | 只看该作者
我最近也在做485,可以一起讨论下,我的QQ282565541

使用特权

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

本版积分规则

25

主题

150

帖子

0

粉丝