mavlink 避坑指南

问题一: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 > 最大串口号。

解决办法二:自己维护一个串口列表进行重映射。

办法一简单,直接选择了办法一,解决问题。

你可能感兴趣的:(单片机)