添加了探头有遮挡时的数据处理,协议中添加了错误日志,优化了协议解析时处理收到的错误数据的逻辑

This commit is contained in:
95384 2024-11-18 16:48:30 +08:00
parent 7148a72c16
commit ca14efe43d
8 changed files with 120 additions and 30 deletions

View File

@ -115,6 +115,26 @@ typedef struct _mcs_para{
float32_t precipitation_intensity;/* 光辐射 */ float32_t precipitation_intensity;/* 光辐射 */
}mcs_para; }mcs_para;
extern mcs_para g_stMcs_Para; extern mcs_para g_stMcs_Para;
typedef struct _error_log{
uint16_t tof_error_NS:1; /* 接受南北信号tofytofx<0很小 */
uint16_t tof_error_WE:1; /* 接受东西信号tofytofx<0很小 */
uint16_t error_2:1; /* 保留 */
uint16_t error_3:1; /* 保留 */
uint16_t error_4:1; /* 保留 */
uint16_t error_5:1; /* 保留 */
uint16_t error_6:1; /* 保留 */
uint16_t error_7:1; /* 保留 */
uint16_t error_8:1; /* 保留 */
uint16_t error_9:1; /* 保留 */
uint16_t error_10:1; /* 保留 */
uint16_t error_11:1; /* 保留 */
uint16_t error_12:1; /* 保留 */
uint16_t error_13:1; /* 保留 */
uint16_t error_14:1; /* 保留 */
uint16_t error_15:1; /* 保留 */
}error_log;
extern error_log g_error_log;
#pragma pack(pop) #pragma pack(pop)
// 切换通道 // 切换通道

View File

@ -49,6 +49,7 @@ typedef enum
FRT_REGISTER_TRANSDUCER_CFG_8R0 = 32, /* 换能器参数 */ FRT_REGISTER_TRANSDUCER_CFG_8R0 = 32, /* 换能器参数 */
FRT_REGISTER_RSSI_RANGE = 33, /* RSSI有效范围 */ FRT_REGISTER_RSSI_RANGE = 33, /* RSSI有效范围 */
FRT_REGISTER_WAVE_DATA = 34, /* 波形数据 */ FRT_REGISTER_WAVE_DATA = 34, /* 波形数据 */
FRT_REGISTER_ERROR_LOG = 35, /* 错误日志 */
}FRT_MsgRegister; }FRT_MsgRegister;
#pragma pack(push,1) #pragma pack(push,1)

View File

@ -9,6 +9,7 @@
#include "FIR.h" #include "FIR.h"
#define AVE_TIME 600 //滑动平均时间最大600 #define AVE_TIME 600 //滑动平均时间最大600
#define COVER_TINE 10 //探头遮挡后导致的接收次数过小的报错临界次数
uint32_t run_time_us; uint32_t run_time_us;
@ -40,7 +41,7 @@ float32_t av_speedy=0;
Weather_param weather_info={0x00}; Weather_param weather_info={0x00};
mcs_para g_stMcs_Para={0x00}; mcs_para g_stMcs_Para={0x00};
error_log g_error_log={0x00};
@ -363,8 +364,10 @@ char str[100];
void wind_task(void const * argument) void wind_task(void const * argument)
{ {
//错误次数统计,南北,东西分开(接受信号很小)
int flag_init_msc_value = 1; uint8_t tof_error_log_NS = 0;
uint8_t tof_error_log_WE = 0;
// int flag_init_msc_value = 1;
arm_rfft_fast_init_f32(&s,FFT_DATA_LEN); arm_rfft_fast_init_f32(&s,FFT_DATA_LEN);
firFilterInit(); firFilterInit();
@ -403,26 +406,38 @@ void wind_task(void const * argument)
// 接受信号很小 // 接受信号很小
if(tofx<0||tofy<0) if(tofx<0||tofy<0)
{ {
tof_error_log_NS ++;
// 放弃本次采样,可以有效筛选雨滴等导致的异常大的风速数据 // 放弃本次采样,可以有效筛选雨滴等导致的异常大的风速数据
// 但是持续的遮挡会导致风速数据保持不变。 // 但是持续的遮挡会导致风速数据保持不变。
continue; // 连续10次采样有问题判定为有遮挡置错误标志位将声速与风速分量置0
if(tof_error_log_NS >= COVER_TINE)
{
g_error_log.tof_error_NS = 1;
weather_info.wind_c = 0;
weather_info.wind_velocity_x = 0;
}
else
{
continue;
}
// 手动设置渡越时间差为0会在探头受遮挡的时候输出0持续遮挡的时候也输出0但是计算出声速将变得很大 // 手动设置渡越时间差为0会在探头受遮挡的时候输出0持续遮挡的时候也输出0但是计算出声速将变得很大
// tofx = tofx/ADC_SAMP_RATE_MHz+REV_MUTE_DELAY_US-1.0f/DRIVE_FREQ_MHz+0.0001f; // tofx = tofx/ADC_SAMP_RATE_MHz+REV_MUTE_DELAY_US-1.0f/DRIVE_FREQ_MHz+0.0001f;
// tofy = tofy/ADC_SAMP_RATE_MHz+REV_MUTE_DELAY_US-1.0f/DRIVE_FREQ_MHz+0.0001f; // tofy = tofy/ADC_SAMP_RATE_MHz+REV_MUTE_DELAY_US-1.0f/DRIVE_FREQ_MHz+0.0001f;
// dtof = 0; // dtof = 0;
}else{ }else{
// 遮挡没有之后数据正常,将标志位取消,错误计数置零
tof_error_log_NS = 0;
g_error_log.tof_error_NS = 0;
// 计算成us // 计算成us
tofx = ((tofx-FIR_PHASE_DELAY)/ADC_SAMP_RATE_MHz)+REV_MUTE_DELAY_US-1.0f/DRIVE_FREQ_MHz+0.0001f; tofx = ((tofx-FIR_PHASE_DELAY)/ADC_SAMP_RATE_MHz)+REV_MUTE_DELAY_US-1.0f/DRIVE_FREQ_MHz+0.0001f;
tofy = ((tofy-FIR_PHASE_DELAY)/ADC_SAMP_RATE_MHz)+REV_MUTE_DELAY_US-1.0f/DRIVE_FREQ_MHz+0.0001f; tofy = ((tofy-FIR_PHASE_DELAY)/ADC_SAMP_RATE_MHz)+REV_MUTE_DELAY_US-1.0f/DRIVE_FREQ_MHz+0.0001f;
// 通过各通道渡越时间求时间差 // 通过各通道渡越时间求时间差
dtof = tofx-tofy; dtof = tofx-tofy;
weather_info.wind_c = DISTANCE/2.0f*(1.0f/tofx+1.0f/tofy);
weather_info.wind_velocity_x = 0-DISTANCE*dtof/1.41422f/tofx/tofx;
} }
weather_info.wind_c = DISTANCE/2.0f*(1.0f/tofx+1.0f/tofy);
weather_info.wind_velocity_x = 0-DISTANCE*dtof/1.41422f/tofx/tofx;
// 通道3 通道4 测试东西风速 // 通道3 通道4 测试东西风速
// 通道3发送 通道4接收 // 通道3发送 通道4接收
@ -447,12 +462,21 @@ void wind_task(void const * argument)
// 如果测量的信号幅值过小。 // 如果测量的信号幅值过小。
if(tofx<0||tofy<0) if(tofx<0||tofy<0)
{ {
tof_error_log_WE ++;
// 放弃本次采样,可以有效筛选雨滴等导致的异常大的风速数据 // 放弃本次采样,可以有效筛选雨滴等导致的异常大的风速数据
// 但是持续的遮挡会导致风速数据保持不变。 // 但是持续的遮挡会导致风速数据保持不变。
// 连续10次采样有问题判定为有遮挡置错误标志位将声速与风速分量置0
continue; if(tof_error_log_WE >= COVER_TINE)
{
g_error_log.tof_error_WE = 1;
weather_info.wind_c = 0;
weather_info.wind_velocity_y = 0;
}
else
{
continue;
}
// 手动设置渡越时间差为0会在探头受遮挡的时候输出0持续遮挡的时候也输出0但是计算出声速将变得很大 // 手动设置渡越时间差为0会在探头受遮挡的时候输出0持续遮挡的时候也输出0但是计算出声速将变得很大
// tofx = tofx/ADC_SAMP_RATE_MHz+REV_MUTE_DELAY_US-1.0f/DRIVE_FREQ_MHz+0.0001f; // tofx = tofx/ADC_SAMP_RATE_MHz+REV_MUTE_DELAY_US-1.0f/DRIVE_FREQ_MHz+0.0001f;
// tofy = tofy/ADC_SAMP_RATE_MHz+REV_MUTE_DELAY_US-1.0f/DRIVE_FREQ_MHz+0.0001f; // tofy = tofy/ADC_SAMP_RATE_MHz+REV_MUTE_DELAY_US-1.0f/DRIVE_FREQ_MHz+0.0001f;
@ -460,17 +484,19 @@ void wind_task(void const * argument)
// dtof = 0; // dtof = 0;
}else{ }else{
// 遮挡没有之后数据正常,将标志位取消,错误计数置零
tof_error_log_WE = 0;
g_error_log.tof_error_WE = 0;
// 计算成us // 计算成us
tofx = ((tofx-FIR_PHASE_DELAY)/ADC_SAMP_RATE_MHz)+REV_MUTE_DELAY_US-1.0f/DRIVE_FREQ_MHz+0.000001f; tofx = ((tofx-FIR_PHASE_DELAY)/ADC_SAMP_RATE_MHz)+REV_MUTE_DELAY_US-1.0f/DRIVE_FREQ_MHz+0.000001f;
tofy = ((tofy-FIR_PHASE_DELAY)/ADC_SAMP_RATE_MHz)+REV_MUTE_DELAY_US-1.0f/DRIVE_FREQ_MHz+0.000001f; tofy = ((tofy-FIR_PHASE_DELAY)/ADC_SAMP_RATE_MHz)+REV_MUTE_DELAY_US-1.0f/DRIVE_FREQ_MHz+0.000001f;
// 通过各通道渡越时间求时间差 // 通过各通道渡越时间求时间差
dtof = tofx-tofy; dtof = tofx-tofy;
weather_info.wind_c = DISTANCE/2.0f*(1.0f/tofx+1.0f/tofy);
weather_info.wind_velocity_y = DISTANCE*dtof/1.41422f/tofx/tofx;
} }
weather_info.wind_c = DISTANCE/2.0f*(1.0f/tofx+1.0f/tofy);
weather_info.wind_velocity_y = DISTANCE*dtof/1.41422f/tofx/tofx;
weather_info.wind_velocity = sqrtf(weather_info.wind_velocity_x*weather_info.wind_velocity_x + weather_info.wind_velocity_y*weather_info.wind_velocity_y); weather_info.wind_velocity = sqrtf(weather_info.wind_velocity_x*weather_info.wind_velocity_x + weather_info.wind_velocity_y*weather_info.wind_velocity_y);
// 分母加0.0001 保证分母不为0 // 分母加0.0001 保证分母不为0
weather_info.wind_angle = acosf(weather_info.wind_velocity_x/(weather_info.wind_velocity+0.000001f)); weather_info.wind_angle = acosf(weather_info.wind_velocity_x/(weather_info.wind_velocity+0.000001f));

View File

@ -14,6 +14,7 @@ static void send_uart_pack(device_handle device,FRT_MsgFunctionCode_e cmd_type,
static void FRT_MsgProc_ReadRegister(device_handle device, void *pMsg); static void FRT_MsgProc_ReadRegister(device_handle device, void *pMsg);
static void FRT_MsgProc_WriteRegister(device_handle device, void *pMsg); static void FRT_MsgProc_WriteRegister(device_handle device, void *pMsg);
static u_int16_t FRT_ReadReg(unsigned char regId); static u_int16_t FRT_ReadReg(unsigned char regId);
/* 读 */
static u_int16_t FRT_ReadRegMinWindDiretion(void *pMsg); static u_int16_t FRT_ReadRegMinWindDiretion(void *pMsg);
static u_int16_t FRT_ReadRegAverageWindDirection(void *pMsg); static u_int16_t FRT_ReadRegAverageWindDirection(void *pMsg);
static u_int16_t FRT_ReadRegMaxWindDirection(void *pMsg); static u_int16_t FRT_ReadRegMaxWindDirection(void *pMsg);
@ -24,27 +25,28 @@ static u_int16_t FRT_ReadRegTemperature(void *pMsg);
static u_int16_t FRT_ReadRegHumidity(void *pMsg); static u_int16_t FRT_ReadRegHumidity(void *pMsg);
static u_int16_t FRT_ReadRegPressure(void *pMsg); static u_int16_t FRT_ReadRegPressure(void *pMsg);
static u_int16_t FRT_ReadRegRain(void *pMsg); static u_int16_t FRT_ReadRegRain(void *pMsg);
/* 读 */
static u_int16_t FRT_ReadRegPrecipitationIntensity(void *pMsg); static u_int16_t FRT_ReadRegPrecipitationIntensity(void *pMsg);
static u_int16_t FRT_ReadRegDeviceAddr(void *pMsg); static u_int16_t FRT_ReadRegDeviceAddr(void *pMsg);
static u_int16_t FRT_ReadRegCommuBaudRate(void *pMsg); static u_int16_t FRT_ReadRegCommuBaudRate(void *pMsg);
static u_int16_t FRT_ReadRegSpeedAverageTime(void *pMsg); static u_int16_t FRT_ReadRegSpeedAverageTime(void *pMsg);
static u_int16_t FRT_ReadRegTempHumUpdateTime(void *pMsg); static u_int16_t FRT_ReadRegTempHumUpdateTime(void *pMsg);
static u_int16_t FRT_ReadRegRainPowerCtl(void *pMsg); static u_int16_t FRT_ReadRegRainPowerCtl(void *pMsg);
/* 写 */
static u_int16_t FRT_WriteRegDeviceAddr(void *pMsg); static u_int16_t FRT_WriteRegDeviceAddr(void *pMsg);
static u_int16_t FRT_WriteRegCommuBaudRate(void *pMsg); static u_int16_t FRT_WriteRegCommuBaudRate(void *pMsg);
static u_int16_t FRT_WriteRegSpeedAverageTime(void *pMsg); static u_int16_t FRT_WriteRegSpeedAverageTime(void *pMsg);
static u_int16_t FRT_WriteRegTempHumUpdateTime(void *pMsg); static u_int16_t FRT_WriteRegTempHumUpdateTime(void *pMsg);
static u_int16_t FRT_WriteRegSoftReset(void *pMsg); static u_int16_t FRT_WriteRegSoftReset(void *pMsg);
static u_int16_t FRT_WriteRegResetDefault(void *pMsg); static u_int16_t FRT_WriteRegResetDefault(void *pMsg);
/* 读配置 */
static u_int16_t FRT_ReadRegTransducerCFG1R5(void *pMsg); static u_int16_t FRT_ReadRegTransducerCFG1R5(void *pMsg);
static u_int16_t FRT_ReadRegTransducerCFG4R5(void *pMsg); static u_int16_t FRT_ReadRegTransducerCFG4R5(void *pMsg);
static u_int16_t FRT_ReadRegTransducerCFG8R0(void *pMsg); static u_int16_t FRT_ReadRegTransducerCFG8R0(void *pMsg);
static u_int16_t FRT_ReadRegRSSIRange(void *pMsg); static u_int16_t FRT_ReadRegRSSIRange(void *pMsg);
static u_int16_t FRT_ReadRegWaveData(void *pMsg); static u_int16_t FRT_ReadRegWaveData(void *pMsg);
static u_int16_t FRT_ReadRegErrorData(void *pMsg);
/* 写配置 */
static u_int16_t FRT_WriteRegTransducerCFG1R5(void *pMsg); static u_int16_t FRT_WriteRegTransducerCFG1R5(void *pMsg);
static u_int16_t FRT_WriteRegTransducerCFG4R5(void *pMsg); static u_int16_t FRT_WriteRegTransducerCFG4R5(void *pMsg);
static u_int16_t FRT_WriteRegTransducerCFG8R0(void *pMsg); static u_int16_t FRT_WriteRegTransducerCFG8R0(void *pMsg);
@ -82,6 +84,7 @@ FRT_RegProcTable_s g_RegTbl[] =
{ FRT_REGISTER_TRANSDUCER_CFG_4R5, FRT_ReadRegTransducerCFG4R5 }, /* 读换能器参数寄存器值4R5 */ { FRT_REGISTER_TRANSDUCER_CFG_4R5, FRT_ReadRegTransducerCFG4R5 }, /* 读换能器参数寄存器值4R5 */
{ FRT_REGISTER_TRANSDUCER_CFG_8R0, FRT_ReadRegTransducerCFG8R0 }, /* 读换能器参数寄存器值8R0 */ { FRT_REGISTER_TRANSDUCER_CFG_8R0, FRT_ReadRegTransducerCFG8R0 }, /* 读换能器参数寄存器值8R0 */
{ FRT_REGISTER_RSSI_RANGE, FRT_ReadRegRSSIRange }, /* 读RSSI有效范围 */ { FRT_REGISTER_RSSI_RANGE, FRT_ReadRegRSSIRange }, /* 读RSSI有效范围 */
{ FRT_REGISTER_ERROR_LOG, FRT_ReadRegErrorData }, /* 读错误日志 */
}; };
/* 写寄存器处理表 */ /* 写寄存器处理表 */
@ -466,6 +469,16 @@ static u_int16_t FRT_ReadRegRSSIRange(void *pMsg)
return FRT_swap_endian_16(value); return FRT_swap_endian_16(value);
} }
/**
* @brief
* @param
* @retval
*/
static u_int16_t FRT_ReadRegErrorData(void *pMsg)
{
u_int16_t value=*((u_int16_t*)&g_error_log);
return FRT_swap_endian_16(value);
}
/** /**
* @brief 1R5 * @brief 1R5
@ -612,7 +625,7 @@ void FRT_MsgProc_ReadRegister(device_handle device, void *pMsg)
start_reg_addr < 0x00 ||\ start_reg_addr < 0x00 ||\
(start_reg_addr > 0x08 && start_reg_addr < 0x14) ||\ (start_reg_addr > 0x08 && start_reg_addr < 0x14) ||\
(start_reg_addr > 0x17 && start_reg_addr < 0x1E) ||\ (start_reg_addr > 0x17 && start_reg_addr < 0x1E) ||\
start_reg_addr > 0x22 \ start_reg_addr > 0x23 \
) )
{ {
@ -624,7 +637,7 @@ void FRT_MsgProc_ReadRegister(device_handle device, void *pMsg)
reg_num < 0x01 ||\ reg_num < 0x01 ||\
(((reg_num + start_reg_addr - 1) > 0x08) && ((reg_num + start_reg_addr - 1) < 0x14)) ||\ (((reg_num + start_reg_addr - 1) > 0x08) && ((reg_num + start_reg_addr - 1) < 0x14)) ||\
(((reg_num + start_reg_addr -1) > 0x17) && ((reg_num + start_reg_addr -1) < 0x1E)) ||\ (((reg_num + start_reg_addr -1) > 0x17) && ((reg_num + start_reg_addr -1) < 0x1E)) ||\
((reg_num + start_reg_addr -1) > 0x22) \ ((reg_num + start_reg_addr -1) > 0x23) \
) )
{ {
@ -759,13 +772,20 @@ static int uart_read_frt_climate_pack(device_handle uart_handle,u_int8_t *buff,
// 判断首字符是否是地址,是地址再开始读取,不是则将索引退一步 // 判断首字符是否是地址,是地址再开始读取,不是则将索引退一步
if(offset == sizeof(unsigned char)) if(offset == sizeof(unsigned char))
{ {
if(buff[0] != g_stConfigInfo.addr) if(buff[0] != g_stConfigInfo.addr && buff[0] != 0xFF)
{ {
memcpy(buff, buff + 1, offset - 1); memcpy(buff, buff + 1, offset - 1);
offset--; offset--;
buff_size--; buff_size--;
} }
} }
// 判断地址对不对,不对缩一位
else if(buff[1] != FRT_FUNCTION_CODE_READ_REGISTER && buff[1] != FRT_FUNCTION_CODE_WRITE_REGISTER)
{
memcpy(buff, buff + 1, offset - 1);
offset--;
buff_size--;
}
// 读寄存器 // 读寄存器
else if (buff[1] == FRT_FUNCTION_CODE_READ_REGISTER & offset == 8) else if (buff[1] == FRT_FUNCTION_CODE_READ_REGISTER & offset == 8)
{ {

View File

@ -166,7 +166,7 @@ void Flash_EnableReadProtection(void)
/* USER CODE BEGIN 2 */ /* USER CODE BEGIN 2 */
init_term_uart(); init_term_uart();
init_rs485_uart(); init_rs485_uart();
init_ec801_uart(); // init_ec801_uart();
term_printf("Micro Climate Station Sensor.\r\n"); term_printf("Micro Climate Station Sensor.\r\n");
term_printf("Version 1.0.0 Build: %s %s\r\n",__DATE__,__TIME__); term_printf("Version 1.0.0 Build: %s %s\r\n",__DATE__,__TIME__);
HAL_ADCEx_Calibration_Start(&hadc1,ADC_SINGLE_ENDED); HAL_ADCEx_Calibration_Start(&hadc1,ADC_SINGLE_ENDED);

View File

@ -1,4 +1,4 @@
#define REMOTE_UPDATE // 控制是否远程升级 //#define REMOTE_UPDATE // 控制是否远程升级
#ifdef REMOTE_UPDATE #ifdef REMOTE_UPDATE
/** /**

View File

@ -701,7 +701,7 @@
<data> <data>
<extensions></extensions> <extensions></extensions>
<cmdline></cmdline> <cmdline></cmdline>
<hasPrio>32</hasPrio> <hasPrio>1</hasPrio>
<buildSequence>inputOutputBased</buildSequence> <buildSequence>inputOutputBased</buildSequence>
</data> </data>
</settings> </settings>
@ -786,7 +786,7 @@
</option> </option>
<option> <option>
<name>IlinkIcfFile</name> <name>IlinkIcfFile</name>
<state>$PROJ_DIR$\stm32l496xx_flash_app-1109.icf</state> <state>$PROJ_DIR$\stm32l496xx_flash.icf</state>
</option> </option>
<option> <option>
<name>IlinkIcfFileSlave</name> <name>IlinkIcfFileSlave</name>

View File

@ -39,5 +39,28 @@
| 30 | 换能器参数1R5 | 2 Byte | 读写:无符号整数; 0-100 | | 30 | 换能器参数1R5 | 2 Byte | 读写:无符号整数; 0-100 |
| 31 | 换能器参数4R5 | 2 Byte | 读写:无符号整数; 0-100 | | 31 | 换能器参数4R5 | 2 Byte | 读写:无符号整数; 0-100 |
| 32 | 换能器参数8R0 | 2 Byte | 读写:无符号整数; 0-100 | | 32 | 换能器参数8R0 | 2 Byte | 读写:无符号整数; 0-100 |
| 33 | RSSI有效范围 | 2 Byte | 读写:无符号整数; 0-100 | | 33 | RSSI有效范围 | 2 Byte | 读:无符号整数; 0-100 |
| 34 | | | |
| 35 | 错误日志 | 2Byte | 读 |
错误日志解析:
| 位 | 备注 |
| :-: | :------------------: |
| 0 | 南北方向探头遮挡 |
| 1 | 东西方向探头遮挡 |
| 1 | |
| 3 | |
| 4 | |
| 5 | |
| 6 | |
| 7 | |
| 8 | |
| 9 | |
| 10 | |
| 11 | |
| 12 | |
| 13 | |
| 14 | |
| 15 | |