Недавно наземная станция столкнулась с ошибкой подключения нескольких транспортных средств.Когда количество подключенных транспортных средств превышает 15, наземная станция не может создать соединение и не может отключиться. После прохождения теста версии QGroundControl DeBUG было обнаружено, что сообщение об ошибке: Исчерпаны каналы mavlink.
Итак, приступайте к анализу кода! Первый — это интерфейсный код, запускаемый функцией подключения: LinkSettings.qml.
QGCButton {
text: qsTr("Connect")
enabled: _currentSelection && !_currentSelection.link
onClicked: {
QGroundControl.linkManager.createConnectedLink(_currentSelection)
}
Запускается функция createConnectedLink в классе linkManager.
Вот перегрузка функции, которая вызывает другую функцию createConnectedLink.
На этот раз вызывается функция _addLink()
На этот раз вы можете увидеть код ошибки. Это означает, что мы близки к проблеме.Во-первых, mavlinkChannel=0, что означает, что канала недостаточно, чтобы вызвать ошибки, поэтому давайте откроем _reserveMavlinkChannel(), чтобы посмотреть.Прежде чем читать код, давайте подумаем об этом Для выделения должна использоваться функция _reserveMavlinkChannel().Для канала MavLink, когда значение канала равно 0, это означает, что доступного канала нет.
int LinkManager::_reserveMavlinkChannel(void)
{
// Find a mavlink channel to use for this link, Channel 0 is reserved for internal use.
for (uint8_t mavlinkChannel = 1; mavlinkChannel < MAVLINK_COMM_NUM_BUFFERS; mavlinkChannel++) {
if (!(_mavlinkChannelsUsedBitMask & 1 << mavlinkChannel)) {
mavlink_reset_channel_status(mavlinkChannel);
// Start the channel on Mav 1 protocol
mavlink_status_t* mavlinkStatus = mavlink_get_channel_status(mavlinkChannel);
mavlinkStatus->flags |= MAVLINK_STATUS_FLAG_OUT_MAVLINK1;
_mavlinkChannelsUsedBitMask |= 1 << mavlinkChannel;
return mavlinkChannel;
}
}
return 0; // All channels reserved
}
Чтобы понять этот код, нужно немного терпения.Прежде всего, интуитивно почувствуйте, что когда mavlinkChannel больше, чем MAVLINK_COMM_NUM_BUFFERS, канал будет равен 0, поэтому давайте проверим определение макроса.
В файле mavlink_types.h в библиотеке mavLink определение макроса MAVLINK_COMM_NUM_BUFFERS равно 16, а начальное значение канала mavlinkChannel равно 1, поэтому он может подключать только до транспортных средств 15. Согласно комментариям, мы можем знать, что мы можем увеличьте значение MAVLINK_COMM_NUM_BUFFERS. Но насколько можно настроить, нам нужно прочитать функцию _reserveMavlinkChannel().
Сначала сдвиньте значение 1 влево на бит mavlinkChannel, а затем сравните его со значением _mavlinkChannelsUsedBitMask, чтобы выбрать двоичное число бита mavlinkChannel в двоичном представлении _mavlinkChannelsUsedBitMask.Когда выделение канала завершено, вам нужно присвоить 1 в бит mavlinkChannel _mavlinkChannelsUsedBitMask, то есть следующий код:
Таким образом, можно понять, что при использовании 3 каналов двоичное значение _mavlinkChannelsUsedBitMask равно 111, а при использовании 4 каналов двоичное значение _mavlinkChannelsUsedBitMask равно 1111.
Итак, давайте еще раз посмотрим на оператор _mavlinkChannelsUsedBitMask:
_mavlinkChannelsUsedBitMask — это 32-битное целочисленное значение, которое может представлять до 32 единиц, поэтому вернемся к настройке значения MAVLINK_COMM_NUM_BUFFERS, максимальное значение, которое мы можем установить в настоящее время, должно быть 32.