解决了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

@ -2,7 +2,7 @@
* @Author: mbw
* @Date: 2025-01-24 08:40:39
* @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
* @Description:
* @
@ -76,16 +76,16 @@ typedef struct __attribute__((packed))
rt_uint8_t checksum; // 校验
} TsH308Data;
typedef struct
typedef struct __attribute__((packed))
{
uint8_t end_of_life; // 寿命到期
uint8_t last_life; // 上次状态
uint8_t to_be_calib; // 待标定
uint8_t alarm_value; // 报警器阈值 LEL
uint8_t detection_flag; // 实时检测的标志
uint8_t fault_code; // 故障码
uint32_t expiration_seconds; // 传感器到期时间s
TeH308Status status_buffer[H308_SAMPLING_TIMS]; // 采样缓存数组
TeH308FaultCode fault_code; // 故障码
TsH308Data Data;
} TsH308;

View File

@ -2,7 +2,7 @@
* @Author : stark1898y 1658608470@qq.com
* @Date : 2024-09-04 13:33:49
* @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
* @Description :
*
@ -47,9 +47,11 @@
char data_buf[AT_CLIENT_RECV_BUFF_LEN] = {0};
nt26k_sys_info nt26k = {0};
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;
// 将本地时间转换为对应时区时间
void Time_Zone_Conversion(TsRtcDateTime *timeInfo)
{
@ -361,18 +363,13 @@ int at_send_data(struct at_device *device, const char *data, rt_size_t size)
{
#define NT26K_SEND_RESP_TIME (3000)
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);
rt_uint8_t max_retry_count = (rt_uint8_t)Flash_Get_SysCfg(kIotRetryId);
if (resp == RT_NULL)
{
LOG_E("no memory for nt26k device(%s) response structure.", device->name);
at_delete_resp(resp);
return -RT_ERROR;
}
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)
@ -385,9 +382,6 @@ int at_send_data(struct at_device *device, const char *data, rt_size_t size)
}
}
}
retry++;
rt_thread_mdelay(1000);
}
at_delete_resp(resp);
return -RT_ERROR;
@ -1411,8 +1405,9 @@ int Time_Calibration(struct at_device *device)
rtc_dt.hour, rtc_dt.minute, rtc_dt.second); // 设置时间
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);
at_delete_resp(resp);
ntp_flag = 1;
at_delete_resp(resp);
return RT_EOK;
}
else

View File

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

View File

@ -2,7 +2,7 @@
* @Author: mbw
* @Date: 2024-10-09 08:42:14
* @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
* @Description:
*
@ -794,18 +794,17 @@ int Nt26k_Process_Events(Nt26kEvent nt26k_recv_event, struct at_device *device,
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++)
{
if (nt26k_conncet_tcp_flag)
{
if (event->send_func)
if (event->send_func)// 如果事件有关联的发送函数,则调用该发送函数
{
#ifdef TEST_ENABLE
RTC_ShowTime(); // 每次发送打印下时间,容易定位问题
#endif
// 如果事件有关联的发送函数,则调用该发送函数
rt_thread_mdelay(IMEI_Delay());
int result = event->send_func(device, nt26k_ops);
if (result != RT_EOK)