当解析不出飞控数据时闪红灯

This commit is contained in:
OPTOC
2025-09-04 16:01:12 +08:00
parent 2e5b3416a6
commit bd9ffa3de2
9 changed files with 112 additions and 22 deletions

View File

@@ -76,7 +76,7 @@ typedef struct
uint8_t connect_pc; uint8_t connect_pc;
// int (*embedded_read)(device_t *port, void *buffer, uint32_t length); // int (*embedded_read)(device_t *port, void *buffer, uint32_t length);
// int (*embedded_write)(device_t *port, const void *data, uint32_t size); // int (*embedded_write)(device_t *port, const void *data, uint32_t size);
uint8_t last_color;
}device_t; }device_t;

View File

@@ -466,21 +466,23 @@ void msp_recv_loop(msp_port_t *msp)
} }
} }
} }
void msp_recv_buf(msp_port_t *msp, void *data, uint32_t size) int msp_recv_buf(msp_port_t *msp, void *data, uint32_t size)
{ {
uint8_t res = 0;
uint32_t size_lat = size; uint32_t size_lat = size;
uint8_t* data_char = (uint8_t*)data; uint8_t* data_char = (uint8_t*)data;
while (size_lat --) while (size_lat --)
{ {
uint8_t c = data_char[size - size_lat - 1]; uint8_t c = data_char[size - size_lat - 1];
if (msp_parse_received_data(msp, c)) if (msp_parse_received_data(msp, c))
{ {
if (msp->c_state == MSP_COMMAND_RECEIVED) if (msp->c_state == MSP_COMMAND_RECEIVED)
{ {
msp_process_received_command(msp); msp_process_received_command(msp);
// break; res ++;
} }
} }
} }
return res;
} }

View File

@@ -318,8 +318,9 @@ void msp_recv_loop(msp_port_t *msp);
* @param msp 接口 * @param msp 接口
* @param data 接收数据 * @param data 接收数据
* @param size 接收数据长度 * @param size 接收数据长度
* @retval 解析成功次数
*/ */
void msp_recv_buf(msp_port_t *msp,void *data, uint32_t size); int msp_recv_buf(msp_port_t *msp,void *data, uint32_t size);
/** /**
* @brief MSP数据包解析 * @brief MSP数据包解析
* *

View File

@@ -179,10 +179,11 @@ void mavlink_recv_loop(mavlink_device_t* mavlink_device)
} }
} }
void mavlink_recv_buf(mavlink_device_t* mavlink_device, void *data, uint32_t size) int mavlink_recv_buf(mavlink_device_t* mavlink_device, void *data, uint32_t size)
{ {
uint8_t res = 0;
bool success = false; bool success = false;
mavlink_message_t message; mavlink_message_t message;
uint32_t size_lat = size; uint32_t size_lat = size;
@@ -196,8 +197,9 @@ void mavlink_recv_buf(mavlink_device_t* mavlink_device, void *data, uint32_t siz
if(success){ if(success){
// printf("Received message from serial with ID #%d (sys:%d|comp:%d):\n", message.msgid, message.sysid, message.compid); // printf("Received message from serial with ID #%d (sys:%d|comp:%d):\n", message.msgid, message.sysid, message.compid);
mavlik_packet_processing(mavlink_device,&message); mavlik_packet_processing(mavlink_device,&message);
// break; success = false;
res++;
} }
} }
return res;
} }

View File

@@ -101,7 +101,8 @@ void mavlink_recv_loop(mavlink_device_t* mavlink_device);
* @param mavlink_device 接口 * @param mavlink_device 接口
* @param data 数据 * @param data 数据
* @param size 大小 * @param size 大小
* @retval 解析成功次数
*/ */
void mavlink_recv_buf(mavlink_device_t* mavlink_device, void *data, uint32_t size); int mavlink_recv_buf(mavlink_device_t* mavlink_device, void *data, uint32_t size);
#endif #endif

View File

@@ -128,10 +128,27 @@ void Protocol_buf_decode(void* data, uint32_t size)
protocol.pro_type = Protocol_buf_search(data, size); protocol.pro_type = Protocol_buf_search(data, size);
break; break;
case PROTOCOL_MSP: case PROTOCOL_MSP:
msp_recv_buf(&protocol.msp, data, size); protocol.analysis_sussess_count += msp_recv_buf(&protocol.msp, data, size);
break; break;
case PROTOCOL_MAVLINK: case PROTOCOL_MAVLINK:
mavlink_recv_buf(&protocol.mavlink_device, data, size); protocol.analysis_sussess_count += mavlink_recv_buf(&protocol.mavlink_device, data, size);
break; break;
} }
}
protocol_status_t get_protocol_status(void)
{
protocol.protocol_status = PROTOCOL_STATUS_OK;
if(protocol.pro_type == PROTOCOL_IDLE)
{
protocol.protocol_status = PROTOCOL_STATUS_TYPE_IDLE;
} else if(protocol.analysis_sussess_count == 0)
{
protocol.protocol_status = PROTOCOL_STATUS_NO_DATA;
}
protocol.analysis_sussess_count = 0;
return protocol.protocol_status;
} }

View File

@@ -23,6 +23,13 @@ typedef enum
PORT_LINUX_UART = 0, PORT_LINUX_UART = 0,
PORT_LINUX_SBDATA, PORT_LINUX_SBDATA,
}port_type_m; }port_type_m;
typedef enum
{
PROTOCOL_STATUS_OK = 0,
PROTOCOL_STATUS_NO_DATA, //没有收到数据,或者数据小于一定量
PROTOCOL_STATUS_TYPE_IDLE, //协议类型未知
PROTOCOL_STATUS_ANALYSIS_ERROR, //长时间解析失败
}protocol_status_t;
typedef struct typedef struct
{ {
protocol_port_t port; protocol_port_t port;
@@ -32,6 +39,8 @@ typedef struct
mavlink_device_t mavlink_device; mavlink_device_t mavlink_device;
msp_port_t msp; msp_port_t msp;
protocol_status_t protocol_status;
uint16_t analysis_sussess_count; //数据解析成功次数
}protocol_t; }protocol_t;
/** /**
@@ -66,4 +75,10 @@ int Protocol_buf_search(void* data, uint32_t size);
* @param size 数据长度 * @param size 数据长度
*/ */
void Protocol_buf_decode(void* data, uint32_t size); void Protocol_buf_decode(void* data, uint32_t size);
/**
* @brief 获取协议状态
*
* @retval 协议状态
*/
protocol_status_t get_protocol_status(void);
#endif #endif

View File

@@ -27,6 +27,12 @@ void sertrf_start(void)
NULL, NULL,
4096, 4096,
20); 20);
os_thread_create(&sertrf.task_thread,
"task_thread",
task_thread,
NULL,
2048,
10);
} }
void embedded_thread(void* arg) void embedded_thread(void* arg)
{ {
@@ -54,15 +60,52 @@ void embedded_thread(void* arg)
embedded_device_write(&sertrf.device, data, pc_size); embedded_device_write(&sertrf.device, data, pc_size);
} }
// printf_chill_time(10,1000); // printf_chill_time(10,1000);
pc_link_rgb_color(&sertrf.device);
//需要添加一些延时,否则会卡死,导致看门狗复位 //需要添加一些延时,否则会卡死,导致看门狗复位
// vTaskDelay(( TickType_t ) 1000 / configTICK_RATE_HZ); // vTaskDelay(( TickType_t ) 1000 / configTICK_RATE_HZ);
os_thread_sleep(1); os_thread_sleep(1);
} }
} }
void task_thread(void* arg)
{
while(true)
{
size_t start_time = os_get_sys_time();
pc_link_rgb_color(&sertrf.device);
if(sertrf.device.connect_pc > DISCONNECT)
{
size_t end_time = 0;
if(start_time - end_time > 1000)
{
switch(get_protocol_status())
{
case PROTOCOL_STATUS_OK:
rgb_color_change(0, sertrf.device.last_color);
break;
case PROTOCOL_STATUS_NO_DATA:
rgb_color_change(0, RGB_COLOR_RAD);
break;
case PROTOCOL_STATUS_TYPE_IDLE:
rgb_color_change(0, RGB_COLOR_RAD);
break;
case PROTOCOL_STATUS_ANALYSIS_ERROR:
rgb_color_change(0, RGB_COLOR_RAD);
break;
default:
break;
}
end_time = os_get_sys_time();
}
}
os_thread_sleep(100);
}
}
void pc_link_rgb_color(device_t* device) void pc_link_rgb_color(device_t* device)
{ {
static uint8_t last_connect = 255, last_wifi_mode = 0; static uint8_t last_connect = 255, last_wifi_mode = 0;
uint8_t new_color = 0;
if(device->connect_pc != last_connect || last_wifi_mode != device->init_device.wifi_mode) if(device->connect_pc != last_connect || last_wifi_mode != device->init_device.wifi_mode)
{ {
switch (device->connect_pc) switch (device->connect_pc)
@@ -70,34 +113,39 @@ void pc_link_rgb_color(device_t* device)
case DISCONNECT: case DISCONNECT:
{ {
if(device->init_device.wifi_mode == WIFI_NETIF_MODE_AP) if(device->init_device.wifi_mode == WIFI_NETIF_MODE_AP)
rgb_color_change(0, RGB_COLOR_GREEN_WHITE); new_color = RGB_COLOR_GREEN_WHITE;
else else
rgb_color_change(0, RGB_COLOR_GREEN_PURPLE); new_color = RGB_COLOR_GREEN_PURPLE;
break; break;
} }
case CONNECT_WIFI_TCP: case CONNECT_WIFI_TCP:
{ {
if(device->init_device.wifi_mode == WIFI_NETIF_MODE_AP) if(device->init_device.wifi_mode == WIFI_NETIF_MODE_AP)
rgb_color_change(0, RGB_COLOR_WHITE); new_color = RGB_COLOR_WHITE;
else else
rgb_color_change(0, RGB_COLOR_PURPLE); new_color = RGB_COLOR_PURPLE;
break; break;
} }
case CONNECT_WIFI_UDP: case CONNECT_WIFI_UDP:
{ {
if(device->init_device.wifi_mode == WIFI_NETIF_MODE_AP) if(device->init_device.wifi_mode == WIFI_NETIF_MODE_AP)
rgb_color_change(0, RGB_COLOR_WHITE); new_color = RGB_COLOR_WHITE;
else else
rgb_color_change(0, RGB_COLOR_PURPLE); new_color = RGB_COLOR_PURPLE;
break; break;
} }
case CONNECT_BLE: case CONNECT_BLE:
rgb_color_change(0, RGB_COLOR_GREEN); new_color = RGB_COLOR_GREEN;
break; break;
} }
if(device->last_color != new_color)
rgb_color_change(0,new_color);
device->last_color = new_color;
last_connect = device->connect_pc; last_connect = device->connect_pc;
last_wifi_mode = device->init_device.wifi_mode; last_wifi_mode = device->init_device.wifi_mode;
} }

View File

@@ -9,7 +9,7 @@ typedef struct
{ {
device_t device; device_t device;
os_thread_t embedded_thread; os_thread_t embedded_thread;
os_thread_t task_thread;
}sertrf_t; }sertrf_t;
/** /**
@@ -36,6 +36,10 @@ void sertrf_status(void);
* @brief embedded thread * @brief embedded thread
*/ */
void embedded_thread(void* arg); void embedded_thread(void* arg);
/**
* @brief task thread
*/
void task_thread(void* arg);
/** /**
* @brief 根据连接状态显示不同的颜色 * @brief 根据连接状态显示不同的颜色
* *