我在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 > 最大串口号。
解决办法二:自己维护一个串口列表进行重映射。
办法一简单,直接选择了办法一,解决问题。