#include "soft_port_uart4.h" #include "control_attitude.h" #include "control_rate.h" #include "data_save.h" #include "drv_usart.h" #include "my_math.h" #include "params.h" #include "payload.h" #include "soft_gs.h" #include "soft_imu.h" #include "soft_time.h" #include "soft_usharpradar.h" #include "string.h" #include "ver_config.h" // 硬件未链接 struct _uart_device *payload_uart = NULL; // 选择串口 4 设备 Port4PayloadType port4_payload_type = PORT4_PAYLOAD_NONE; // 串口 4 接收到的数据 struct port4_rx_data port4_data; // 串口 4 吊舱 static struct payload_diaocang _port4_payload_diaocang = {0}; // 串口 4 遥控遥测 struct GCS_Link p4_gcs_link = { .link_protocal_type = GCS_LINK_PROTOCAL_TYPE_VKLINK, /* 默认使用 VKLINK 协议 */ .vklink_protocal_version = 300, /* 默认 vklink v300 版本 */ .link_status = COMP_NOEXIST, /* 默认状态是未连接地面站 */ }; struct payload_diaocang *port4_get_payload(void) { return &_port4_payload_diaocang; } // @brief 串口 4 初始化 void port_uart4_initial(void) { // port4_payload_type = params_get_value(ParamNum_Port4Multiplexing); port4_payload_type = PORT4_YUNYIV8; memset(&_port4_payload_diaocang, 0, sizeof(_port4_payload_diaocang)); _port4_payload_diaocang._link_status = COMP_NOEXIST; uint32_t baudrate = 115200; switch (port4_payload_type) { case PORT4_PAYLOAD_DATALINK: p4_gcs_link.uart = uart_find("uart4"); baudrate = 115200; break; break; default: baudrate = 115200; break; } // uart4_init(baudrate); payload_uart = uart_find("uart4"); if (payload_uart) { payload_uart->ops->init(baudrate); } } // @brief 获取串口 4 复用功能 Port4PayloadType port4_get_af_config(void) { return port4_payload_type; } /** * @brief 地面站串口中断发送数据 * * @param data * @param len * @return uint32_t */ uint32_t payload_port_tx_data(const uint8_t *data, uint32_t len) { uint32_t ret = 0; if (payload_uart) { ret = payload_uart->ops->write(data, len); } return ret; } void Port4_Service(void) { // static uint32_t lastSendMsgTime = 0; uint8_t ch = 0; switch (port4_payload_type) { case PORT4_PAYLOAD_NONE: while (payload_uart->ops->read(&ch, 1) == 1) { port4_data.data[port4_data.len] = ch; port4_data.len++; if (port4_data.len > sizeof(port4_data.data)) break; } if (port4_data.len) { gs_send_payload_msg(&gcs_link, port4_data.data, port4_data.len); port4_data.len = 0; } break; case PORT4_PAYLOAD_DATALINK: gs_receive_msg_poll(&p4_gcs_link); gs_send_msg_poll(&p4_gcs_link); break; default: break; } }