Привет, я тестирую драйвер xbee с платой arduino-due.
Текущий драйвер для xbee не работает с платой, драйвер перестает работать в строке 126 xbee.c:
while (dev->resp_limit != dev->resp_count) {
mutex_lock(&(dev->resp_lock));
}
Такая же конфигурация и плата работают с Riot выпуска 2015.09.
Возможно, проблема в драйвере uart, но я думаю, что у драйвера xbee должен быть тайм-аут. Потому что теперь RIOT заблокирован и не регистрирует никакой информации для обнаружения проблемы.
Создан PR № 4734.
Следующие коммиты добавляют дополнительные отладочные данные.
https://github.com/Yonezawa-T2/RIOT/commit/0b437f440d114a28bbc63c3c6a7ff9dc4ded4bfd
https://github.com/Yonezawa-T2/RIOT/commit/c16cd9281821aaec8c9dd8260a3a98db659e8ef5
Установите ENABLE_DEBUG
и XBEE_ENABLE_DETAILED_DEBUG
на 1.
Также вас может заинтересовать # 4445, если у вас возникнут другие проблемы.
Я пробовал драйвер с arduino-due, но он все равно не работает, но я думаю, что это проблема uart.
Но драйвер xbee работает не идеально:
xbee_init не дает сбой, если _api_at_cmd не работает, например, если _get_addr_long возвращает значение <0, xbee_init должен завершиться неудачно, что-то вроде:
if(_get_addr_long(dev, dev->addr_long.uint8, 8) < 0) {
DEBUG("xbee: Initialization failed\n");
return -1;
}
Наконец, не записывайте отладочную информацию "xbee: response timeout"
в isr_resp_timeout, а переместите ее в _api_at_cmd, потому что в первом случае она выполняется в другом потоке и не всегда может распечатать отладку.
Создан PR № 4749.
Хорошо, я протестировал новый драйвер, и он работает так, как хотел.
Я заметил некоторые другие проблемы с драйвером xbee в функции отправки:
dev->tx_buf[0] = API_START_DELIMITER; dev->tx_buf[4] = 0; /* set to zero to disable response frame */ /* set size, API id and address field depending on dst address length */ if (_is_broadcast(hdr)) { dev->tx_buf[1] = (uint8_t)((size + 5) >> 8); dev->tx_buf[2] = (uint8_t)(size + 5); dev->tx_buf[3] = API_ID_TX_SHORT_ADDR; dev->tx_buf[4] = 0xff; dev->tx_buf[5] = 0xff; } if (hdr->dst_l2addr_len == 2) { dev->tx_buf[1] = (uint8_t)((size + 5) >> 8); dev->tx_buf[2] = (uint8_t)(size + 5); dev->tx_buf[3] = API_ID_TX_SHORT_ADDR; memcpy(dev->tx_buf + 5, gnrc_netif_hdr_get_dst_addr(hdr), 2); pos = 7; } else { dev->tx_buf[1] = (uint8_t)((size + 11) >> 8); dev->tx_buf[2] = (uint8_t)(size + 11); dev->tx_buf[3] = API_ID_TX_LONG_ADDR; memcpy(dev->tx_buf + 5, gnrc_netif_hdr_get_dst_addr(hdr), 8); pos = 13; }
- в первую очередь, если: tx_buf [4] перезаписывается, короткий адрес назначения находится в индексах 5 и 6
- во-вторых, если, может быть, это будет
else if (hdr->dst_l2addr_len == 2)
Последний вопрос: как получить длинный адрес назначения? потому что с моим xbee не совпадает.
@ l3nko
Я заметил некоторые другие проблемы с драйвером xbee в функции отправки:
Да. См. №4445.Последний вопрос: как получить длинный адрес назначения? потому что с моим xbee не совпадает.
Не уверен, что правильно понял ваш вопрос. XBee использует короткий адрес в качестве исходного адреса, если его короткий адрес не настроен на 0xFFFF
. Это также исправлено в # 4445.
Этот вопрос можно закрыть, так как # 4445 был объединен.
Самый полезный комментарий
Этот вопрос можно закрыть, так как # 4445 был объединен.