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 > 最大串口号。

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

办法一简单,直接选择了办法一,解决问题。文章来源地址https://uudwc.com/A/XkDX4

原文地址:https://blog.csdn.net/ben392797097/article/details/133346416

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请联系站长进行投诉反馈,一经查实,立即删除!

上一篇 2023年09月29日 07:35
Python异步框架大战:FastAPI、Sanic、Tornado VS Go 的 Gin
下一篇 2023年09月29日 08:35