问题一:mavlink使用多个串口,进入硬件错误中断void HardFault_Handler(void)。
我在mavlink中使用了多个串口,其中串口选择是定义了一个变量
uint32_t MAVLINK_CHAN = SY_CHAN;
在调试过程中发现会莫名的进入硬件错误,经过debug跟踪发现在mavlink会获取串口指针
/**
* @brief Finalize a MAVLink message with channel assignment and send
*/
MAVLINK_HELPER void _mav_finalize_message_chan_send(mavlink_channel_t chan, uint32_t msgid,
const char *packet,
uint8_t min_length, uint8_t length, uint8_t crc_extra)
{
uint16_t checksum;
uint8_t buf[MAVLINK_NUM_HEADER_BYTES];
uint8_t ck[2];
/*************这个地方*******************/
mavlink_status_t *status = mavlink_get_channel_status(chan);
/*************这个地方*******************/
uint8_t header_len = MAVLINK_CORE_HEADER_LEN;
uint8_t signature_len = 0;
uint8_t signature[MAVLINK_SIGNATURE_BLOCK_LEN];
bool mavlink1 = (status->flags & MAVLINK_STATUS_FLAG_OUT_MAVLINK1) != 0;
bool signing = (!mavlink1) && status->signing && (status->signing->flags & MAVLINK_SIGNING_FLAG_SIGN_OUTGOING);
/*省略*/
}
#ifndef MAVLINK_GET_CHANNEL_STATUS
MAVLINK_HELPER mavlink_status_t* mavlink_get_channel_status(uint8_t chan)
{
#ifdef MAVLINK_EXTERNAL_RX_STATUS
// No m_mavlink_status array defined in function,
// has to be defined externally
#else
static mavlink_status_t m_mavlink_status[MAVLINK_COMM_NUM_BUFFERS];
#endif
return &m_mavlink_status[chan];
}
#endif
而我的由于使用了多个串口,串口号是按照UART1 = 1,UART2 = 2...分配的。而MAVLINK的默认
MAVLINK_COMM_NUM_BUFFERS 为4,当使用串口大于4的时候就会报错。
解决办法一:修改num > 最大串口号。
解决办法二:自己维护一个串口列表进行重映射。文章来源:https://www.uudwc.com/A/XkDX4/
办法一简单,直接选择了办法一,解决问题。文章来源地址https://www.uudwc.com/A/XkDX4/