QGC может подключить только до 15 автомобилей. Ошибка решена.

Недавно наземная станция столкнулась с ошибкой подключения нескольких транспортных средств.Когда количество подключенных транспортных средств превышает 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.

Supongo que te gusta

Origin blog.csdn.net/hellocode_7812/article/details/120776443
Recomendado
Clasificación