解决了socket_id地址未对齐引起的硬件故障问题,将uint8_t类型值改为int

This commit is contained in:
小马_666 2025-02-06 08:57:18 +08:00
parent 28aded7bdf
commit e5d7708387
4 changed files with 45 additions and 53 deletions

View File

@ -1,12 +1,12 @@
/*** /***
* @Author: mbw * @Author: mbw
* @Date: 2025-01-24 08:40:39 * @Date: 2025-01-24 08:40:39
* @LastEditors: mbw && 1600520629@qq.com * @LastEditors: mbw && 1600520629@qq.com
* @LastEditTime: 2025-01-25 14:49:06 * @LastEditTime: 2025-01-25 17:18:45
* @FilePath: \JT-DT-YD4N02A_RTT_MRS-NT26K\bsp\inc\bsp_h308.h * @FilePath: \JT-DT-YD4N02A_RTT_MRS-NT26K\bsp\inc\bsp_h308.h
* @Description: * @Description:
* @ * @
* @Copyright (c) 2025 by ${git_name_email}, All Rights Reserved. * @Copyright (c) 2025 by ${git_name_email}, All Rights Reserved.
*/ */
#ifndef __BSP_H308_H__ #ifndef __BSP_H308_H__
#define __BSP_H308_H__ #define __BSP_H308_H__
@ -76,16 +76,16 @@ typedef struct __attribute__((packed))
rt_uint8_t checksum; // 校验 rt_uint8_t checksum; // 校验
} TsH308Data; } TsH308Data;
typedef struct typedef struct __attribute__((packed))
{ {
uint8_t end_of_life; // 寿命到期 uint8_t end_of_life; // 寿命到期
uint8_t last_life; // 上次状态 uint8_t last_life; // 上次状态
uint8_t to_be_calib; // 待标定 uint8_t to_be_calib; // 待标定
uint8_t alarm_value; // 报警器阈值 LEL uint8_t alarm_value; // 报警器阈值 LEL
uint8_t detection_flag; // 实时检测的标志 uint8_t detection_flag; // 实时检测的标志
uint8_t fault_code; // 故障码
uint32_t expiration_seconds; // 传感器到期时间s uint32_t expiration_seconds; // 传感器到期时间s
TeH308Status status_buffer[H308_SAMPLING_TIMS]; // 采样缓存数组 TeH308Status status_buffer[H308_SAMPLING_TIMS]; // 采样缓存数组
TeH308FaultCode fault_code; // 故障码
TsH308Data Data; TsH308Data Data;
} TsH308; } TsH308;

View File

@ -2,7 +2,7 @@
* @Author : stark1898y 1658608470@qq.com * @Author : stark1898y 1658608470@qq.com
* @Date : 2024-09-04 13:33:49 * @Date : 2024-09-04 13:33:49
* @LastEditors: mbw && 1600520629@qq.com * @LastEditors: mbw && 1600520629@qq.com
* @LastEditTime: 2025-01-25 13:38:31 * @LastEditTime: 2025-02-06 08:55:35
* @FilePath: \JT-DT-YD4N02A_RTT_MRS-NT26K\bsp\src\at_device_nt26k.c * @FilePath: \JT-DT-YD4N02A_RTT_MRS-NT26K\bsp\src\at_device_nt26k.c
* @Description : * @Description :
* *
@ -47,9 +47,11 @@
char data_buf[AT_CLIENT_RECV_BUFF_LEN] = {0}; char data_buf[AT_CLIENT_RECV_BUFF_LEN] = {0};
nt26k_sys_info nt26k = {0}; nt26k_sys_info nt26k = {0};
struct rt_completion nt26k_init_complate; struct rt_completion nt26k_init_complate;
volatile rt_uint8_t socket_id = 0; volatile int socket_id = 0;
volatile rt_uint8_t ntp_flag = 0; volatile rt_uint8_t ntp_flag = 0;
// 将本地时间转换为对应时区时间 // 将本地时间转换为对应时区时间
void Time_Zone_Conversion(TsRtcDateTime *timeInfo) void Time_Zone_Conversion(TsRtcDateTime *timeInfo)
{ {
@ -361,32 +363,24 @@ int at_send_data(struct at_device *device, const char *data, rt_size_t size)
{ {
#define NT26K_SEND_RESP_TIME (3000) #define NT26K_SEND_RESP_TIME (3000)
const char *line_buffer = RT_NULL; const char *line_buffer = RT_NULL;
rt_uint8_t retry = 0;
at_response_t resp = at_create_resp(AT_CLIENT_RECV_BUFF_LEN, 2, NT26K_SEND_RESP_TIME); at_response_t resp = at_create_resp(AT_CLIENT_RECV_BUFF_LEN, 2, NT26K_SEND_RESP_TIME);
rt_uint8_t max_retry_count = (rt_uint8_t)Flash_Get_SysCfg(kIotRetryId);
if (resp == RT_NULL) if (resp == RT_NULL)
{ {
LOG_E("no memory for nt26k device(%s) response structure.", device->name); LOG_E("no memory for nt26k device(%s) response structure.", device->name);
at_delete_resp(resp); at_delete_resp(resp);
return -RT_ERROR; return -RT_ERROR;
} }
if (at_obj_exec_cmd(device->client, resp, TCP_SEND_DATA, socket_id, data) == RT_EOK)
while (retry < max_retry_count)
{ {
if (at_obj_exec_cmd(device->client, resp, TCP_SEND_DATA, socket_id, data) == RT_EOK) if ((line_buffer = at_resp_get_line(resp, 2)) != RT_NULL)
{ {
if ((line_buffer = at_resp_get_line(resp, 2)) != RT_NULL) if (rt_strstr(line_buffer, "SEND OK") != RT_NULL)
{ {
if (rt_strstr(line_buffer, "SEND OK") != RT_NULL) LOG_D("send data success, socket_id: %d", socket_id);
{ at_delete_resp(resp);
LOG_D("send data success, socket_id: %d", socket_id); return RT_EOK;
at_delete_resp(resp);
return RT_EOK;
}
} }
} }
retry++;
rt_thread_mdelay(1000);
} }
at_delete_resp(resp); at_delete_resp(resp);
@ -1411,8 +1405,9 @@ int Time_Calibration(struct at_device *device)
rtc_dt.hour, rtc_dt.minute, rtc_dt.second); // 设置时间 rtc_dt.hour, rtc_dt.minute, rtc_dt.second); // 设置时间
LOG_I("RTC时间: %04d-%02d-%02d %02d:%02d:%02d \n", LOG_I("RTC时间: %04d-%02d-%02d %02d:%02d:%02d \n",
rtc_dt.year, rtc_dt.month, rtc_dt.day, rtc_dt.hour, rtc_dt.minute, rtc_dt.second); rtc_dt.year, rtc_dt.month, rtc_dt.day, rtc_dt.hour, rtc_dt.minute, rtc_dt.second);
at_delete_resp(resp);
ntp_flag = 1; ntp_flag = 1;
at_delete_resp(resp);
return RT_EOK; return RT_EOK;
} }
else else

View File

@ -2,7 +2,7 @@
* @Author: mbw * @Author: mbw
* @Date: 2024-11-14 10:21:04 * @Date: 2024-11-14 10:21:04
* @LastEditors: mbw && 1600520629@qq.com * @LastEditors: mbw && 1600520629@qq.com
* @LastEditTime: 2025-01-25 15:07:34 * @LastEditTime: 2025-01-25 17:15:31
* @FilePath: \JT-DT-YD4N02A_RTT_MRS-NT26K\bsp\src\bsp_h308.c * @FilePath: \JT-DT-YD4N02A_RTT_MRS-NT26K\bsp\src\bsp_h308.c
* @Description: * @Description:
* *
@ -93,48 +93,46 @@ MSH_CMD_EXPORT(Sensor_ShowData, Sensor_ShowData);
uint8_t H308_GetFrameData(const char *p_src, const rt_uint8_t src_len, TsH308Data *pData) uint8_t H308_GetFrameData(const char *p_src, const rt_uint8_t src_len, TsH308Data *pData)
{ {
// A+000.00 +31.1 0657.80 +18.1 B+008.0 00 12
rt_uint8_t xor = 0;
uint8_t ret = 0;
char *p_str = strstr(p_src, "A+"); // 查找子字符串的位置
uint32_t offset = p_str - p_src; // 计算偏移量
TsH308StrData _H308StrData = {0}; TsH308StrData _H308StrData = {0};
rt_uint8_t xor = 0; if ((p_str != NULL) && (offset <= src_len - 44))
uint8_t ret = RT_ERROR;
char *p_str = rt_strstr(p_src, "A+"); // 查找子字符串的位置
if (p_str != NULL && strlen(p_str) >= src_len)
{ {
if (sscanf(p_str, "A+%6s %6s %8s %6s B+%6s %2s %2s\r\n", if (sscanf(p_str, "A+%6s %6s %8s %6s B+%6s %2s %2s",
_H308StrData.vol, _H308StrData.temp, _H308StrData.laser_temp, _H308StrData.vol, _H308StrData.temp, _H308StrData.laser_temp, _H308StrData.signal_strength,
_H308StrData.signal_strength, _H308StrData.gain, _H308StrData.gain, _H308StrData.fault_code, _H308StrData.checksum) == 7)
_H308StrData.fault_code, _H308StrData.checksum) == 7)
{ {
pData->checksum = (rt_uint8_t)strtol(_H308StrData.checksum, NULL, 16); pData->checksum = (rt_uint8_t)strtol(_H308StrData.checksum, NULL, 16);
xor = H308_XorChecksum(p_str, 44); // 对数据进行异或校验 xor = H308_XorChecksum(p_str, 44); // 对数据进行异或校验
if (xor == pData->checksum) if (xor== pData->checksum)
{ {
pData->lel = atof(_H308StrData.vol) * 20; pData->lel = (float)(atof(_H308StrData.vol) * 20);
pData->temp = atof(_H308StrData.temp); pData->temp = (float)atof(_H308StrData.temp);
pData->laser_temp = atof(_H308StrData.laser_temp); pData->laser_temp = (float)atof(_H308StrData.laser_temp);
pData->signal_strength = atof(_H308StrData.signal_strength); pData->signal_strength = (float)atof(_H308StrData.signal_strength);
pData->gain = atof(_H308StrData.gain); pData->gain = (float)atof(_H308StrData.gain);
pData->fault_code = (rt_uint8_t)strtol(_H308StrData.fault_code, NULL, 16); pData->fault_code = (rt_uint8_t)strtol(_H308StrData.fault_code, NULL, 16);
ret = RT_EOK; pData->checksum = (rt_uint8_t)strtol(_H308StrData.checksum, NULL, 16);
ret = 0;
} }
else else
{ {
LOG_E("XOR check failed: expected %02X, got %02X", pData->checksum, xor); LOG_E("xor failed");
ret = RT_ERROR; ret = RT_ERROR;
} }
} }
else else
{ {
LOG_E("sscanf failed");
ret = RT_ERROR; ret = RT_ERROR;
LOG_E("H308_ExtractData failed");
} }
} }
else
{
LOG_E("Invalid data frame or length");
ret = RT_ERROR;
}
return ret; return ret;
} }
@ -340,7 +338,7 @@ static void h308_thread_entry(void *param)
{ {
uint8_t len = lwrb_get_full(&uart4_rx_rb); uint8_t len = lwrb_get_full(&uart4_rx_rb);
lwrb_read(&uart4_rx_rb, str, len); lwrb_read(&uart4_rx_rb, str, len);
rt_memset(&str[len - 2], 0, 2);
if (len >= 44) if (len >= 44)
{ {
ret = H308_GetFrameData((const char *)str, len, &H308.Data); ret = H308_GetFrameData((const char *)str, len, &H308.Data);

View File

@ -2,7 +2,7 @@
* @Author: mbw * @Author: mbw
* @Date: 2024-10-09 08:42:14 * @Date: 2024-10-09 08:42:14
* @LastEditors: mbw && 1600520629@qq.com * @LastEditors: mbw && 1600520629@qq.com
* @LastEditTime: 2025-01-25 09:42:09 * @LastEditTime: 2025-02-06 08:41:05
* @FilePath: \JT-DT-YD4N02A_RTT_MRS-NT26K\bsp\src\bsp_nt26k.c * @FilePath: \JT-DT-YD4N02A_RTT_MRS-NT26K\bsp\src\bsp_nt26k.c
* @Description: * @Description:
* *
@ -794,18 +794,17 @@ int Nt26k_Process_Events(Nt26kEvent nt26k_recv_event, struct at_device *device,
if (event) // 处理该事件 if (event) // 处理该事件
{ {
// 打印事件的名称 LOG_D("%s上报\n", event->event_name);// 打印事件的名称
LOG_D("%s上报\n", event->event_name);
for (size_t i = 0; i < max_retry_count; i++) for (size_t i = 0; i < max_retry_count; i++)
{ {
if (nt26k_conncet_tcp_flag) if (nt26k_conncet_tcp_flag)
{ {
if (event->send_func) if (event->send_func)// 如果事件有关联的发送函数,则调用该发送函数
{ {
#ifdef TEST_ENABLE #ifdef TEST_ENABLE
RTC_ShowTime(); // 每次发送打印下时间,容易定位问题 RTC_ShowTime(); // 每次发送打印下时间,容易定位问题
#endif #endif
// 如果事件有关联的发送函数,则调用该发送函数
rt_thread_mdelay(IMEI_Delay()); rt_thread_mdelay(IMEI_Delay());
int result = event->send_func(device, nt26k_ops); int result = event->send_func(device, nt26k_ops);
if (result != RT_EOK) if (result != RT_EOK)