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

📄 can_ad.c

📁 基于arm7的can总线模拟采集及总线通讯程序
💻 C
📖 第 1 页 / 共 2 页
字号:
      if(TimeFlag == 1)
      {  
         TimeFlag = 0;
         IO2SET = IO2SET | 0x00200000;   // 关数据采集指示灯                  
         readdate(DateBuf);              // 读时间
         Hour = DateBuf[4];
         Hour = Hour % 3;
         Minute = DateBuf[5];         
         Second = DateBuf[6];
         Second = Second % 6;            //     
         Second1 = DateBuf[6];           // 
         
         
         TemWindSpeed = TenSpeedCount;
         TenSpeedCount = 0;
         Count = 0;                      // 风速脉冲数,一秒读完后清零 
         
         sprintf(str, "%6d m TenSpeedCount",TemWindSpeed);    // 风速处理
         ISendStr(40, 21, 0x30, str); 
         
         
                
         TemWindSpeed = ((float)TemWindSpeed * 10.0 * 0.0980);       // 风速增加10倍
         TrueSpeedCount = TemWindSpeed / 10.0;                 // 得真实值
         if(MostWindSpeed < TrueSpeedCount)
         {
            MostWindSpeed = TrueSpeedCount;         
         }
         if(MostWindSpeed >= OneHourWind)                     // 判断加密应加在can总线发送时
         {
            OneHourFlag = 1;                                  // 若风大于加密值,加密标志位置位
         }         
         else   OneHourFlag = 0;                              // 标志位清零
         // OneHourFlag = 1;  // 联调时用,加密一小时工作一次 真正应用的时候应用上面的两句                 
         if(((Hour == 1)||(OneHourFlag == 1))&&(Minute == 0x47)&&((Second1 == 0x01)||(Second1 == 0x02)))
         {
            WExitFlag = 1;
            j=0;
            DataToCanBus(DirStart,DataDirStart,2,CTBuf);          // 开方位传感器
         }         
         if(((Hour == 1)||(OneHourFlag == 1))&&(Minute >= 0x48)&&(WExitFlag == 1))  
         {                                                        // 风向处理
            if((Second == 0)&&(j < 100))
            {
               WindDir[j] = GetWindDir();
               WindDir[j] = WindDir[j] / 10;                      // 此处应除以10,得真实采集值
               if(ReadCANRcvCyBuf(0,&CRBuf) == 0)
               {  
                  ParseCanRxData(0,&CRBuf,&IDCom,&IDInfo,&IDDAddr);
                  if(IDCom == 2)
                  {  
                     for(m=0;m<36;m++)
                     {
                        CanAzimuth[m] = 0;
                     }
                     if(CanDirToQX(&CRBuf,CanAzimuth) == 1)
                     sscanf(CanAzimuth,"$C%fP",&AzimuthValue);
                     //sprintf(str, "%5.1fdu Azimuth", AzimuthValue);
                     //ISendStr(50, 9 ,0x30, str);
                     Azimuth[j] = (UINT32)AzimuthValue;                     
                  }
               }                             
               //TemWindDir = WindDir[j];         // 风传感器输出即时风向 未经方位合成
               //sprintf(str,"%5.1fdu TemWindDir", TemWindDir);
               //ISendStr(40,11,0x30,str);                              
               //TemWindDir1 = CaluWindDir1(j);   // 单次合成风向 实验用
               //sprintf(str,"%5.1fdu TemWindDir1", TemWindDir1);
               //ISendStr(20,15,0x30,str);                          
               j++;
               IO2CLR = IO2CLR | 0x00200000;                    // 开数据采集指示灯
            }
            if(j >= 100)
            {
               DataToCanBus(DirStart,DataDirExit,2,CTBuf);      // 关方位传感器
               WExitFlag = 0;
               AverageWindDir = CaluWindDir();
               sprintf(str, "%3ddu AverageWindDir", AverageWindDir);
               ISendStr(50, 13, 0x30, str); 
               j=0;
            }       
         }  //风向处理完毕                
         if(((Hour == 1)||(OneHourFlag == 1))&&(Minute == 0x52))        //   
         {
            IO0SET = TSensorPower;                    // 高电平 开12V传感器
            THPExitFlag = 1;
            i = 0; 
         }        
         if(((Hour == 1)||(OneHourFlag == 1))&&(Minute >= 0x58)&&(THPExitFlag == 1))
         {
           if((Second == 0)&&(i < 10))                // 温度、湿度。气压处理    
           {  
              TempArr[0] = GetTemp();                 // 不同型号,GetTemp内部函数不一样
              TempArr[1] = GetTemp();
              TempArr[2] = GetTemp();
              HumiArr[0] = GetHumi();
              HumiArr[1] = GetHumi();
              HumiArr[2] = GetHumi();
              PressArr[0] = GetPress();       
              PressArr[1] = GetPress();
              PressArr[2] = GetPress();              
              Temp = Temp+(TempArr[0]+TempArr[1]+TempArr[2])/3;
              Humi = Humi+(HumiArr[0]+HumiArr[1]+HumiArr[2])/3;
              Press = Press+(PressArr[0]+PressArr[1]+PressArr[2])/3;              
              i++;
              IO2CLR = IO2CLR | 0x00200000;           // 开数据采集指示灯
           } 
           else if(i >= 10)
           {
              THPExitFlag = 0;        
              CanSendFlag = 1;                        // 采集结束,开Can发送标志
              IO0CLR = IO0CLR | TSensorPower;         // 采集完毕,关12V电压
              Temp = Temp / 100;
              Humi = Humi / 100;
              Press = Press / 100;                                          
              //sprintf(str, "%5.1fdu of Temp", Temp);
              //ISendStr(50, 15, 0x30, str);         
              //sprintf(str, "%3d%%du of Humi", Humi);
              //ISendStr(50, 17, 0x30, str);         
              //sprintf(str, "%6.1fPa of Press", Press);
              //ISendStr(50, 19, 0x30, str); 
              i=0;
              sprintf(QIXGData,"$QIXG,%4.1f,%3d,%6.1f,%5.1f,%3d\r\n",MostWindSpeed,AverageWindDir,Press,Temp,Humi);
              
                           
              
              ISendStr(50, 15, 0x30, QIXGData);
              
                           
              
              MostWindSpeed = 0;   // 赋值结束后清零
              AverageWindDir = 0; 
              Press = 0; 
              Temp = 0; 
              Humi = 0;            
           }                               
         }                         // 温湿气压处理完毕  
      }   
      if(ReadCANRcvCyBuf(0,&CRBuf) == 0)                 // 进入检测总线命令状态                
      { 	  
		    ParseCanRxData(0,&CRBuf,&IDCom,&IDInfo,&IDDAddr);	 		 
		    if((IDCom == 31)&&(IDInfo == 26))            // 若主机正常工作,发送气象节点数据,
		    {
		       k = 0;
		       while(1)
		       { 
		          if(TimeFlag == 1)
		          {		                
		             DataToCanBus(IDTran,(UINT8*)QIXGData,33,CTBuf);    // 发射数据发送
		             TimeFlag = 0;
		             k++;
		             DataToCanBus(IDStor,(UINT8*)QIXGData,33,CTBuf);    // 存储数据发送
		             if(k > 3)
		             break;		                
		          }  		                     	                
	              if(ReadCANRcvCyBuf(0,&CRBuf) == 0)     // 收到主机命令中主机正常工作命令后,发送气象数据一次,若没有收到主机收到数据成功返回,最多发送3遍
	              ParseCanRxData(0,&CRBuf,&IDCom,&IDInfo,&IDDAddr);
	              if((IDCom == 11) && (IDDAddr == 52))
	              {	
	                 CanSendFlag = 0;
	                 break;
	              }
	           }  
	           if((MostWindSpeed >= OneHourWind))
               { 
                  OneHourFlag = 1;                                        // 加密标志位置位
                  DataToCanBus(IDOneHour,IDOneHourData,2,CTBuf);          // 发送加密命令到总线
               } 	                
	        }        
	        else if(IDCom == 3)	                                          // 总线对时命令,对年,月,日
		    {  		       
		       CanDateBuf1[0] = CRBuf.CANRDA.Bits.Data3_BIT;
	           CanDateBuf1[1] = CRBuf.CANRDA.Bits.Data4_BIT;
	           CanDateBuf1[2] = CRBuf.CANRDB.Bits.Data1_BIT;
	           CanDateBuf1[3] = CRBuf.CANRDB.Bits.Data2_BIT;
	           CanDateBuf1[4] = CRBuf.CANRDB.Bits.Data3_BIT;
	           CanDateBuf1[5] = CRBuf.CANRDB.Bits.Data4_BIT;
	           readdate(CanDateBuf);
	           CanDateBuf[0] = (CanDateBuf1[0] - 48)*16 + CanDateBuf1[1] - 48;
	           CanDateBuf[1] = (CanDateBuf1[2] - 48)*16 + CanDateBuf1[3] - 48;
	           CanDateBuf[2] = (CanDateBuf1[4] - 48)*16 + CanDateBuf1[5] - 48;
	           VICIntEnClr = 0xffffffff;                                  // 总线对时命令写时间前关闭所有中断
               writedate(CanDateBuf);                                     // 更新时间
               VICIntEnable = (1<<5) | (1<<14) | (1<<19) | (1<<20) | (1<<26);      // 使能本程序所用中断
		    }
		    else if(IDCom == 4)	                                          // 总线对时命令,对时,分,秒
		    {
		       CanDateBuf1[0] = CRBuf.CANRDA.Bits.Data3_BIT;
	           CanDateBuf1[1] = CRBuf.CANRDA.Bits.Data4_BIT;
	           CanDateBuf1[2] = CRBuf.CANRDB.Bits.Data1_BIT;
	           CanDateBuf1[3] = CRBuf.CANRDB.Bits.Data2_BIT;
	           CanDateBuf1[4] = CRBuf.CANRDB.Bits.Data3_BIT;
	           CanDateBuf1[5] = CRBuf.CANRDB.Bits.Data4_BIT;
	           readdate(CanDateBuf);
	           CanDateBuf[4] = (CanDateBuf1[0] - 48)*16 + CanDateBuf1[1] - 48;
	           CanDateBuf[5] = (CanDateBuf1[2] - 48)*16 + CanDateBuf1[3] - 48;
	           CanDateBuf[6] = (CanDateBuf1[4] - 48)*16 + CanDateBuf1[5] - 48;
	           VICIntEnClr = 0xffffffff;                                  // 总线对时命令写时间前关闭所有中断
               writedate(CanDateBuf);                                     // 更新时间
               VICIntEnable = (1<<5) | (1<<14) | (1<<19) | (1<<20) | (1<<26);      // 使能本程序所用中断
		    }                 
	        else if((IDCom == 34)&&(IDInfo == 26))                        // 如果主机发主机检测命令 进入主机检测状态
	        {
	           IO0SET = IO0SET | TSensorPower;                            // 高电平 开12V传感器
	           DataToCanBus(DirStart,DataDirStart,2,CTBuf);               // 开方位传感器
	           DetTemp = 0; DetHumi = 0; DetPress = 0; WindDir[101] = 0;  // 采集检测数据前清零
	           DetTemp = GetTemp();
	           DetTemp = DetTemp / 10;
	           DetHumi = GetHumi();
	           DetHumi = DetHumi / 10;
	           DetPress = GetPress();
	           DetPress = DetPress / 10; 
	           WindDir[101] = GetWindDir();
	           WindDir[101] = WindDir[101] / 10;	              
	           if(ReadCANRcvCyBuf(0,&CRBuf) == 0)                         // 进入检测命令后,解析总线命令
               {  
                  ParseCanRxData(0,&CRBuf,&IDCom,&IDInfo,&IDDAddr);
                  if(IDCom == 2)
                  {  
                     for(m=0;m<36;m++)
                     {
                        CanAzimuth[m] = 0;
                     }
                     if(CanDirToQX(&CRBuf,CanAzimuth) == 1)
                     sscanf(CanAzimuth,"$C%fP",&AzimuthValue);
	                 Azimuth[101] = (UINT32)AzimuthValue;
	                 DetWindDir = CaluWindDir1(101);                  // 单次合成检测风向
	                 DataToCanBus(DirStart,DataDirExit,2,CTBuf);      // 关方位传感器
                  }
	              while(1)          // 进入检测状态主循环    //  此处循环应加到上面的if里面 
	              {
	                 if(ReadCANRcvCyBuf(0,&CRBuf) == 0)
	                 {
	                    ParseCanRxData(0,&CRBuf,&IDCom,&IDInfo,&IDDAddr);
	                    if(IDCom == 40)                      // 进入检测状态后,接收到请求节点状态后响应传感器实测值
	                    {
	               Loop1:  sprintf(DetQIXGData,"$QIXG,%4.1f,%3d,%6.1f,%5.1f,%3d\r\n",MostWindSpeed,DetWindDir,DetPress,DetTemp,DetHumi);
	                       DataToCanBus(IDSta,(UINT8*)DetQIXGData,33,CTBuf);	   // 发送实际测量值,响应检测命令中,状态检测命令                                       	
	                    }
	                    else if(IDCom == 41)                                       // 如果是检测命令 响应传感器实测值
	                    {  
	                       sprintf(DetQIXGData,"$QIXG,%4.1f,%3d,%6.1f,%5.1f,%3d\r\n",MostWindSpeed,DetWindDir,DetPress,DetTemp,DetHumi);
	                       DataToCanBus(IDDet,(UINT8*)DetQIXGData,33,CTBuf);		                 
                           DetCounter = 0;
		                   while((IDCom != 35)&&(IDCom != 40))
		                   {
		                      if(TimeFlag == 1)
		                      {
		                         TimeFlag = 0;
		                         DataToCanBus(IDDet,(UINT8*)DetQIXGData,33,CTBuf);
		                         DetCounter++;
		                         if(DetCounter >= 60)    // 进入检测命令后,若1分钟内没有收到退出检测命令,则退出检测命令
		                         {
		                            DetCounter = 0;
		                            break;  
		                         }
		                      }  
		                      if(ReadCANRcvCyBuf(0,&CRBuf) == 0)
		                      ParseCanRxData(0,&CRBuf,&IDCom,&IDInfo,&IDDAddr);
		                   }		                  		                      
		                   if(IDCom == 40)               // 收到检测状态退出,并响应检测状态命令
		                   goto Loop1; 
		                   if(IDCom == 35)
		                   {
		                      IO0CLR = IO0CLR | TSensorPower;               // 采集完毕,关12V电压
		                      DataToCanBus(DirStart,DataDirExit,2,CTBuf);   // 关方位传感器	
		                      break;	                  
                           } 		                               
	                    }                                // 检测命令处理完毕
	                    else if(IDCom == 35)             // 收到退出检测状态命令,退出检测状态,如果一段时间没有收到同样退出
	                    {		              
		                   DataToCanBus(DirStart,DataDirExit,2,CTBuf);      // 关方位传感器
		                   IO0CLR = IO0CLR | TSensorPower;                  // 采集完毕,关12V电压
		                   break;                                           // 如果15分钟没有收到退出检测命令                   
		                }
	                 }
	                 VICIntEnClr = 0xffffffff;                              // 喂狗前关闭所有中断
	                 WdtFeed();                                             // 喂狗
	                 VICIntEnable = (1<<14) | (1<<5) | (1<<19) | (1<<20) | (1<<26);   // 使能本程序所用中断 
	              }                // 检测状态主循环退出
	           }                   // 进入检测命令后,退出解析总线命令状态
	        }   	               // 检测状态退出                          
	  }                            // 退出检测总线命令        
      VICIntEnClr = 0xffffffff;    // 喂狗前关闭所有中断
      WdtFeed();                   // 喂狗
      VICIntEnable = (1<<14) | (1<<5) | (1<<19) | (1<<20) | (1<<26);                  // 使能本程序所用中断 
   }                               // 主循环退出 
   return 0;  
}

⌨️ 快捷键说明

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