0
问答首页 最新问题 热门问题 等待回答标签广场
我要提问

485

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

要把422换成485,422的接收是写到串口中断中,请问大神门,485的接收怎么用,直接写函数么,还是写到中断当中去,两线485,半双工,谢谢指教!

提问者:nigesb 地点:- 浏览次数:3769 提问时间:10-15 14:36
我有更好的答案
提 交
3条回答
sadjwq 09-13 17:23
/* 接收数据帧函数,实际上接收的是主机的指令 */
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
}
宇球黎海华 09-14 11:11
这是书上的写法
ruobi168 09-13 07:47
//串口中断处理(接收)
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接收中断函数
撰写答案
提 交
1 / 3
1 / 3
相关485
最近被485电了很多次了,求大神分析下为什么
隔离485通信接口芯片ADM2483供电问题
求助 关于单片机与485总线 命令帧的发送和响应帧的接收
485通讯如何寻址
RS485总线 感应电流