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

📄 新建_文本文档_(2).txt

📁 24c64 for avr c source code, you can change it for other 24xx other document is for 率值配料下位机程序
💻 TXT
📖 第 1 页 / 共 5 页
字号:
}
//******************************************************************************
//中断服务程序
//注:FF--命令解释出错,请求重发,FE--命令处理出错
//******************************************************************************
//串口数据接收中断服务程序
#pragma interrupt_handler uart0_rx_isr:12
void uart0_rx_isr(void)
{
    int i=0;
    uchar  Temp=0;//临时变量
    int    DataLen=0;//长度
    
    CLI();   //关闭一切中断     
    
    Temp=getuchar();          //读缓冲取数据
    
    if(Temp==HANDEL)          //判断是否是握手符号,确定是合法数据串
    {
        Temp=getuchar();
        RecvBuff[0]=Temp;//命令
        switch(RecvBuff[0])
        {
            //-----------------------------------------------------------------------------
            //功  能:握手
            //上位机:AA 01 00 00 
            //下位机: 5个字节
            //      正确:BB 01 00 00 00
            //   CRC错误:BB 01 FF 00 00 
            //-----------------------------------------------------------------------------
            case 0x01:
            for(i=0;i<2;i++)
            {
                Temp=getuchar();
                RecvBuff[i+1]=Temp;//数据
            }
            //处理命令
            if(RecvBuff[0]==0x01&&RecvBuff[1] ==0x00&&RecvBuff[2]==0x00)
            {
                
                SendBuff[0]=0x05;//发送长度
                SendBuff[1]=0xBB;
                SendBuff[2]=0x01;
                SendBuff[3]=0x00;
                SendBuff[4]=0x00;
                SendBuff[5]=0x00;
                sendComm();
                
            }
            else
            {
                SendBuff[0]=0x05;//发送长度
                SendBuff[1]=0xBB;
                SendBuff[2]=0x01;
                SendBuff[3]=0xFF;//FF--命令解释出错,请求重发,FE--命令处理出错
                SendBuff[4]=0x00;
                SendBuff[5]=0x00;
                sendComm();
            }
            
            break;
            //-----------------------------------------------------------------------------
            //功  能:复位
            //上位机:AA 02 00 00 
            //下位机: 5个字节
            //      正确:BB 02 00 00 00
            //   CRC错误:BB 02 FF 00 00 
            //-----------------------------------------------------------------------------
            case 0x02:
            for(i=0;i<2;i++)
            {
                Temp=getuchar();
                RecvBuff[i+1]=Temp;//数据
            }
            //处理命令
            if(RecvBuff[0]==0x02&&RecvBuff[1] ==0x00&&RecvBuff[2]==0x00)
            {
                init_devices();
                SendBuff[0]=0x05;//发送长度
                SendBuff[1]=0xBB;
                SendBuff[2]=0x02;
                SendBuff[3]=0x00;
                SendBuff[4]=0x00;
                SendBuff[5]=0x00;
                sendComm();
            }
            else
            {
                SendBuff[0]=0x05;//发送长度
                SendBuff[1]=0xBB;
                SendBuff[2]=0x02;
                SendBuff[3]=0xFF;
                SendBuff[4]=0x00;
                SendBuff[5]=0x00;
                sendComm();
            }
            
            break;
            //-----------------------------------------------------------------------------
            //功  能:设置模拟量上下限
            //上位机:AA 03 组号 XX1 XX2 XX3 XX4 CRC1 CRC2 ----XX1,XX2=上限,XX3,XX4=下限
            //下位机: 5个字节
            //      正确:BB 03 00 00 00
            //   CRC错误:BB 03 FF 00 00 
            //-----------------------------------------------------------------------------
            case 0x03:
            for(i=0;i<7;i++)
            {
                Temp=getuchar();
                RecvBuff[i+1]=Temp;//数据
            }
            //处理命令
            if (CRC_Check(&RecvBuff[0],6,RecvBuff[6],RecvBuff[7]))//CRC校验
            {
                
                //放入数据
                
                ADUp[RecvBuff[1]-1]=BytesToInt(RecvBuff[2],RecvBuff[3]);
                ADDown[RecvBuff[1]-1]=BytesToInt(RecvBuff[4],RecvBuff[5]);
                
                
                SendBuff[0]=0x05;//发送长度
                SendBuff[1]=0xBB;
                SendBuff[2]=0x03;
                SendBuff[3]=0x00;
                SendBuff[4]=0x00;
                SendBuff[5]=0x00;
                sendComm();
                NeedSaveFlag=0x03;
            }
            else
            {
                SendBuff[0]=0x05;//发送长度
                SendBuff[1]=0xBB;
                SendBuff[2]=0x03;
                SendBuff[3]=0xFF;
                SendBuff[4]=0x00;
                SendBuff[5]=0x00;
                sendComm();
            }                   
            break;
            //-----------------------------------------------------------------------------
            //功  能:复位报警
            //上位机:AA 04 00 00 
            //下位机: 5个字节
            //      正确:BB 04 00 00 00
            //   CRC错误:BB 04 FF 00 00 
            //-----------------------------------------------------------------------------
            case 0x04:                        
            for(i=0;i<2;i++)
            {
                Temp=getuchar();
                RecvBuff[i+1]=Temp;//数据
            }
            //处理命令
            if (RecvBuff[0]==0x04&&RecvBuff[1]==0x00&&RecvBuff[2]==0x00)//校验
            {
                
                SendBuff[0]=0x06;//发送长度
                SendBuff[1]=0xBB;
                SendBuff[2]=0x04;
                SendBuff[3]=0x00;
                
                if(UseWarning)
                {
                    UseWarning=0;
                    SendBuff[4]=0;
                }
                else
                {
                    UseWarning=1;
                    SendBuff[4]=1;
                }
                
                CRC_Assign(&SendBuff[2],3,&SendBuff[5],&SendBuff[6]);//CRC校验
                
                sendComm();
                NeedSaveFlag=0x04;
            }
            else
            {
                SendBuff[0]=0x06;//发送长度
                SendBuff[1]=0xBB;
                SendBuff[2]=0x04;
                SendBuff[3]=0xFF;
                SendBuff[4]=0x00;
                SendBuff[5]=0x00;
                SendBuff[6]=0x00;
                sendComm();
            }        
            break;
            //-----------------------------------------------------------------------------
            //功  能:索取仪器编号
            //上位机:AA 05 00 00 
            //下位机: 8个字节
            //      正确:BB 05 00 XX1 XX2 XX3 00 00 ----XX1 XX2 XX3为编号
            //   CRC错误:BB 05 FF 00 00 
            //-----------------------------------------------------------------------------
            case 0x05:
            for(i=0;i<2;i++)
            {
                Temp=getuchar();
                RecvBuff[i+1]=Temp;//数据
            }
            //处理命令
            if (RecvBuff[0]==0x05&&RecvBuff[1]==0x00&&RecvBuff[2]==0x00)//校验
            {
                SendBuff[0]=0x08;//发送长度
                SendBuff[1]=0xBB;
                SendBuff[2]=0x05;
                SendBuff[3]=0x00;
                
                ReadMachineNumber();
                SendBuff[4]=MachineNumber[0];
                SendBuff[5]=MachineNumber[1];
                SendBuff[6]=MachineNumber[2];
                
                CRC_Assign(&SendBuff[2],5,&SendBuff[7],&SendBuff[8]);//CRC校验
                sendComm();
            }
            else
            {
                SendBuff[0]=0x08;//发送长度
                SendBuff[1]=0xBB;
                SendBuff[2]=0x05;
                SendBuff[3]=0xFF;
                SendBuff[4]=0x00;
                SendBuff[5]=0x00;
                SendBuff[6]=0x00;
                CRC_Assign(&SendBuff[2],5,&SendBuff[7],&SendBuff[8]);//CRC校验
                sendComm();
            }        
            break;
            //-----------------------------------------------------------------------------
            //功  能:索取仪器密码------------考滤到安全原因,暂时无用!!!!!!!!!!
            //描  述:共三个密码,每一个密码点6个字节
            //上位机:AA 06 00 00 
            //下位机: 23个字节
            //      正确:BB 06 00        XX XX XX XX XX XX        XX XX XX XX XX XX        XX XX XX XX XX XX        CRC1 CRC2  
            //   CRC错误: BB 06 00        00 00 00 00 00 00        00 00 00 00 00 00        00 00 00 00 00 00        CRC1 CRC2 
            //-----------------------------------------------------------------------------
            case 0x06:
            for(i=0;i<2;i++)
            {
                Temp=getuchar();
                RecvBuff[i+1]=Temp;//数据
            }
            //处理命令
            if (RecvBuff[0]==0x06&&RecvBuff[1]==0x00&&RecvBuff[2]==0x00)//校验
            {
                SendBuff[0]=23;//发送长度
                
                SendBuff[1]=0xBB;
                SendBuff[2]=0x06;
                SendBuff[3]=0x00;
                
                SendBuff[4]=0x00;
                SendBuff[5]=0x00;
                SendBuff[6]=0x00;
                SendBuff[7]=0x00;
                SendBuff[8]=0x00;
                SendBuff[9]=0x00;
                
                SendBuff[10]=0x00;
                SendBuff[11]=0x00;
                SendBuff[12]=0x00;
                SendBuff[13]=0x00;
                SendBuff[14]=0x00;
                SendBuff[15]=0x00;
                
                SendBuff[16]=0x00;
                SendBuff[17]=0x00;
                SendBuff[18]=0x00;
                SendBuff[19]=0x00;
                SendBuff[20]=0x00;
                SendBuff[21]=0x00;
                
                CRC_Assign(&SendBuff[2],20,&SendBuff[22],&SendBuff[23]);//CRC校验
                sendComm();
            }
            else
            {
                SendBuff[0]=23;//发送长度
                
                SendBuff[1]=0xBB;
                SendBuff[2]=0x06;
                SendBuff[3]=0xFF;
                
                SendBuff[4]=0x00;
                SendBuff[5]=0x00;
                SendBuff[6]=0x00;
                SendBuff[7]=0x00;
                SendBuff[8]=0x00;
                SendBuff[9]=0x00;
                
                SendBuff[10]=0x00;
                SendBuff[11]=0x00;
                SendBuff[12]=0x00;
                SendBuff[13]=0x00;
                SendBuff[14]=0x00;
                SendBuff[15]=0x00;
                
                SendBuff[16]=0x00;
                SendBuff[17]=0x00;
                SendBuff[18]=0x00;
                SendBuff[19]=0x00;
                SendBuff[20]=0x00;
                SendBuff[21]=0x00;
                
                CRC_Assign(&SendBuff[2],20,&SendBuff[22],&SendBuff[23]);//CRC校验
                sendComm();
            }
            break;
            //-----------------------------------------------------------------------------
            //功  能:索取仪器累计使用次数
            //上位机:AA 07 00 00 
            //下位机: 7个字节
            //      正确:BB 07 00 XX XX CRC1 CRC2 ----XX为数据  
            //   CRC错误: BB 07 FF        00 00 CRC1 CRC2  
            //-----------------------------------------------------------------------------
            case 0x07:
            for(i=0;i<2;i++)
            {
                Temp=getuchar();
                RecvBuff[i+1]=Temp;//数据
            }
            //处理命令
            if (RecvBuff[0]==0x07&&RecvBuff[1]==0x00&&RecvBuff[2]==0x00)//校验
            {
                SendBuff[0]=0x07;//发送长度
                SendBuff[1]=0xBB;
                SendBuff[2]=0x07;
                SendBuff[3]=0x00;
                
                IntToBytes_Assign(&UseCount, &SendBuff[4],&SendBuff[5]);
                CRC_Assign(&SendBuff[2],4,&SendBuff[6],&SendBuff[7]);//CRC校验
                sendComm();
            }
            else
            {
                SendBuff[0]=0x07;//发送长度
                SendBuff[1]=0xBB;
                SendBuff[2]=0x07;
                SendBuff[3]=0xFF;
                SendBuff[4]=0x00;
                SendBuff[5]=0x00;
                CRC_Assign(&SendBuff[2],4,&SendBuff[6],&SendBuff[7]);//CRC校验
                sendComm();
            }                  
            
            break;
            //-----------------------------------------------------------------------------
            //功  能:读取电流数据和开关量数据
            //上位机:AA 08 00 00 
            //下位机: 22个字节
            //      正确:BB 08 00 XX1 XX1        XX2 XX2        XX3 XX3        XX4 XX4 XX5 XX5        XX6 XX6        XX7 XX7        XX8 XX8   YY    CRC1 CRC2  
            //                     |电流1|  ....                                                   开关量       
            //   CRC错误: BB 08 FF 00  00         00  00  00  00  00  00  00  00  00  00         00  00         00  00   00    CRC1 CRC2  
            //-----------------------------------------------------------------------------
            case 0x08:  
            for(i=0;i<2;i++)
            {
                Temp=getuchar();
                RecvBuff[i+1]=Temp;//数据
            }
            //处理命令
            if (RecvBuff[0]==0x08&&RecvBuff[1]==0x00&&RecvBuff[2]==0x00)//校验
            {
                //读去开关量
                SendBuff[0]=22;//发送长度
                SendBuff[1]=0xBB;
                SendBuff[2]=0x08;
                SendBuff[3]=0x00;
                SendBuff[4]=AD[0]>>8;
                SendBuff[5]=AD[0]&0xFF;
                SendBuff[6]=AD[1]>>8;
                SendBuff[7]=AD[1]&0xFF;
                SendBuff[8]=AD[2]>>8;
                SendBuff[9]=AD[2]&0xFF;
                SendBuff[10]=AD[3]>>8;
                SendBuff[11]=AD[3]&0xFF;
                SendBuff[12]=AD[4]>>8;
                SendBuff[13]=AD[4]&0xFF;
                SendBuff[14]=AD[5]>>8;
                SendBuff[15]=AD[5]&0xFF;
                SendBuff[16]=AD[6]>>8;
                SendBuff[17]=AD[6]&0xFF;
                SendBuff[18]=AD[7]>>8;
                SendBuff[19]=AD[7]&0xFF;
                SendBuff[20]=PINC;//开关量
                CRC_Assign(&SendBuff[2],19,&SendBuff[21],&SendBuff[22]);//CRC校验
                sendComm();
            }
            else
            {        
                SendBuff[0]=22;//发送长度
                SendBuff[1]=0xBB;
                SendBuff[2]=0x08;
                SendBuff[3]=0xFF;
                SendBuff[4]=00;
                SendBuff[5]=00;
                SendBuff[6]=00;
                SendBuff[7]=00;
                SendBuff[8]=00;
                SendBuff[9]=00;
                SendBuff[10]=00;
                SendBuff[11]=00;

⌨️ 快捷键说明

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