⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 comm.c

📁 Keil单片机软件开发平台下的一个51系列单片机工程
💻 C
📖 第 1 页 / 共 2 页
字号:

    PutChar(CommChkOut);
    PutChar(0x0D);
    CommTxPointer = 0;
    COMMEN = COMMEN_ON;
    os_wait(K_TMO,20/OS_MSEL_PER_TICKS,0);
    SBUF = 0xEB;//启动发送
}
/*********************************************************************************************************
** 函数名称: CommSendCellDataInfo
** 功能描述: 发送电池数据报文
** 输   入: 无
** 输   出: 无
** 全局变量: address CommCid ReturnCode outchk cell.u cell.i cell.c cell.s
** 调用模块: OSQCreate PutCharWithCheck PutChar
**
** 作 者: 刘宝贵
** 日 期: 2004年4月27日
**-------------------------------------------------------------------------------------------------------
** 修改人: 刘宝贵
** 日 期: 2004年4月29日22:17
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void CommSendCellDataInfo (void)
{
    uint8 data temp8;
    temp8 = 0;
    CommTxPointer = 0;
    CommTxLength = 35;
    CommChkOut = 0xEB;
    PutCharWithCheck(0x90);
    PutCharWithCheck(0xEB);
    PutCharWithCheck(0x90);
    PutCharWithCheck(Address);
    PutCharWithCheck(CommCid);
    PutCharWithCheck(27);
    PutCharWithCheck(ReturnCode);

    PutCharWithCheck((uint8)(MeasureU>>8));
    PutCharWithCheck((uint8)(MeasureU));
    PutCharWithCheck((uint8)(MeasureI>>8));
    PutCharWithCheck((uint8)(MeasureI));
    PutCharWithCheck((uint8)(MeasureT>>8));
    PutCharWithCheck((uint8)(MeasureT));
    PutCharWithCheck((uint8)(LastTimeS>>24));
    PutCharWithCheck((uint8)(LastTimeS>>16));
    PutCharWithCheck((uint8)(LastTimeS>>8));
    PutCharWithCheck((uint8)(LastTimeS));
    PutCharWithCheck((uint8)((AmountQ10S/36000)>>8));
    PutCharWithCheck((uint8)( AmountQ10S/36000));
    PutCharWithCheck(State);
    PutCharWithCheck(ProgramNo);
    PutCharWithCheck(Step);
    PutCharWithCheck(RemainLoopTimes);
    PutCharWithCheck(Mode);
    PutCharWithCheck(LoopTimes);
    PutCharWithCheck((uint8)(SetupU>>8));
    PutCharWithCheck((uint8)(SetupU));
    PutCharWithCheck((uint8)(SetupI>>8));
    PutCharWithCheck((uint8)(SetupI));

    PutCharWithCheck(ErrorType);//告警信息
    if(ChangeStateFlag)
    {
        temp8 = temp8 |1;
    }
    else
    {
        temp8 = temp8 & 0xFE;
    }
    PutCharWithCheck(temp8);
    PutCharWithCheck(0);
    PutCharWithCheck(0);
    
    PutChar(CommChkOut);
    PutChar(0x0D);
    CommTxPointer = 0;
    COMMEN = COMMEN_ON;
    os_wait(K_TMO,20/OS_MSEL_PER_TICKS,0);
    SBUF = 0xEB;//启动发送
}
/*********************************************************************************************************
** 函数名称: void TaskComm (void) _task_ 5
** 功能描述: 对所接收的数据包进行异或效验
** 输 入:   接收数据数据包
** 输 出:   效验通过返回1 ,否则返回0
** 全局变量: 
** 调用模块: 
**
** 作 者: 刘宝贵
** 日 期: 2006年4月26日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
bit XorCheck(void)
{
    uint8 idata checktemp;
    uint8 idata i;
    checktemp = 0xeb^0x90^0xeb^0x90;
    checktemp^= Address; 
    checktemp^= CommCid;
    checktemp^= CommRxLength;
    for(i=0;i<CommRxLength;i++)
    {
        checktemp ^= CommRxBuf[i];
    }
    if(checktemp == CommChkIn || CommChkIn==0x55)
    {//如果接收的校验和为0x55则不校验
        return 1;
    }
    else
    {
        return 0;
    }
}
/*********************************************************************************************************
** 函数名称: bit XorCheck(void)
** 功能描述: 串口处理任务
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 刘宝贵
** 日 期: 2006年4月25日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void TaskComm (void) _task_ 5
{                  
    SCON   = 0x50;  /*page 111*/
    RCAP2H = 0xFF;
    RCAP2L = 0xE6;
    T2CON  = 0x34; 
    CommState = 0;
    CommCid = 0;
    CommRxPointer = 0;
    CommTxPointer = 0;
    ES = 1;  /*page 101*///使能串口中断
    for(;;)
    {
        os_wait (K_TMO, 10/OS_MSEL_PER_TICKS, 0);
        if(CommNewMessage==1)
        {
            CommNewMessage = 0;
            ReturnCode = RIGHT;
            if(0 == XorCheck())//对所接收的数据包进行异或效验
            {
                ReturnCode = CHKSUM_ERROR;
            }
            if (0x0d != CommRxBuf[CommRxLength])// 判断报文尾           
            {
                ReturnCode = TYPE_ERROR;
            }
            if(ReturnCode==RIGHT)//如果报文的校验和,类型正确
            {
                CommCounter = 0;
                switch (CommCid)
                {
                    case 0:                               // 握手命令             
                    {
                        CommSendInfo();
                    }break;
                    case 1:                               // 取电池数据信息
                    {
                        CommSendCellDataInfo();
                    }break;
                    case 2:                               // 工步设置
                    {
                        if(State == STOP)//如果当前为停止状态则可以修改工步
                        {
                            ProgramNo = CommRxBuf[0];
                            Step      = CommRxBuf[1];
                            Mode      = CommRxBuf[2];
                            SetupU    = CommRxBuf[3]; SetupU    = SetupU<<8;   SetupU    |= CommRxBuf[4];
                            SetupI    = CommRxBuf[5]; SetupI    = SetupI<<8;   SetupI    |= CommRxBuf[6];
                            JumpTimeM = CommRxBuf[7]; JumpTimeM = JumpTimeM<<8;JumpTimeM |= CommRxBuf[8];
                            JumpU     = CommRxBuf[9]; JumpU     = JumpU<<8;    JumpU     |= CommRxBuf[10];
                            JumpI     = CommRxBuf[11];JumpI     = JumpI<<8;    JumpI     |= CommRxBuf[12];
                            JumpQ     = CommRxBuf[13];JumpQ     = JumpQ<<8;    JumpQ     |= CommRxBuf[14];
                            if(Mode==99)
                            {
                                SetupCurrentDirection = SetupU;
                            }
                            if(CheckSingleStep() == 0)//检测读取的工步是否合法 0:不合法。
                            {
                                ReturnCode = DATA_ERROR;
                            }
                            CommSendInfo();
                            if(ReturnCode==RIGHT)
                            {
                                SaveSingleStep();
                            }
                        }
                        else
                        {
                            ReturnCode = LOGIC_ERROR;
                            CommSendInfo();
                        }
                    }break;
                    case 3:// 模块停止
                    {
                        if(State == RUN || State == PAUSE )
                        {
                            State = STOP;
                        }
                        else
                        {
                            ReturnCode = LOGIC_ERROR;
                        }
                        CommSendInfo();
                    }break;
                    case 4:// 模块启动
                    {
                        if(State==STOP)
                        {
//                            ProgramNo = CommRxBuf[0];
                            Step = CommRxBuf[0];
                            if(Step<=STEP_MAX)
                            {
                                ProgramNo = 0;
                                State = RUN;
                                ReadLoopTimes();
                            }
                            else
                            {
                                ReturnCode = DATA_ERROR;
                            }
                        }
                        else
                        {
                            ReturnCode = LOGIC_ERROR;
                        }
                        CommSendInfo();
                    }break;
                    case 5:// 工步续接
                    {
                        CommSendInfo();
                    }break;
                    case 6:// 模块暂停
                    {
                        if(State==RUN)
                        {
                            State = PAUSE;
                            EepromWriteByte(E2State ,State);
                        }
                        else
                        {
                            ReturnCode = LOGIC_ERROR;
                        }
                        CommSendInfo();
                    }break;
                    case 7:// 模块由暂停恢复运行
                    {
                        if(State==PAUSE)
                        {
                            State = RUN;
                            EepromWriteByte(E2State ,State);
                        }
                        else
                        {
                            ReturnCode = LOGIC_ERROR;
                        }
                        CommSendInfo();
                    }break;
                    case 8:// 读取工步
                    {
                        CommSendWorkStepInfo();
                    }break;
                    case 0xC0:// 设模块参数
                    {
                        uint16 idata temp16;
                        temp16 = CommRxBuf[1];temp16 = temp16<<8;temp16 = temp16 | CommRxBuf[2];
                        if(temp16 <= PARAMETER_MAX && temp16 >=PARAMETER_MIN && CommRxBuf[0]<8)
                        {
                            switch(CommRxBuf[0])
                            {
                                case 0:temp16 = E2Uk ;break;
                                case 1:temp16 = E2Ub ;break;
                                case 2:temp16 = E2Ik ;break;
                                case 3:temp16 = E2Ib ;break;
                                case 4:temp16 = E2DAk;break;
                                case 5:temp16 = E2DAb;break;
                                case 6:temp16 = E2Tk ;break;
                                case 7:temp16 = E2Tb ;break;
                            }
                            EepromWriteByteA(temp16,CommRxBuf[1]);
                            EepromWriteByteA(temp16+1,CommRxBuf[2]);
                            switch(CommRxBuf[0])
                            {
                                case 0:Uk  = EepromReadWordA(E2Uk) ;break;
                                case 1:Ub  = EepromReadWordA(E2Ub) ;break;
                                case 2:Ik  = EepromReadWordA(E2Ik) ;break;
                                case 3:Ib  = EepromReadWordA(E2Ib) ;break;
                                case 4:DAk = EepromReadWordA(E2DAk);break;
                                case 5:DAb = EepromReadWordA(E2DAb);break;
                                case 6:Tk  = EepromReadWordA(E2Tk) ;break;
                                case 7:Tb  = EepromReadWordA(E2Tb) ;break;
                            }
                        }
                        else
                        {
                            ReturnCode = DATA_ERROR;
                        }
                        CommSendInfo();
                    }break;
                    case 0xC1:// 取模块参数
                    {
                        CommSendParaInfo();
                    }break;
                    default:
                    {
                        ReturnCode = CID_ERROR;
                        CommSendInfo(); 
                    }
                }//switch (CommCid)
            }//if(ReturnCode==1)//如果报文的校验和,类型正确]
            else//如果校验和或类型不正确
            {
                CommSendInfo();
            }
        }//if(CommNewMessage==1)
    }//for(;;)
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -