📄 can_ad.c
字号:
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 + -