Riot: ドライバーxbeeとuart

作成日 2016年02月02日  ·  7コメント  ·  ソース: RIOT-OS/RIOT

こんにちは、私はarduino-dueボードでxbeeドライバーをテストしています。
xbeeの現在のドライバーはボードで動作しません。ドライバーは、xbee.cの126行目で実行を停止します。
while (dev->resp_limit != dev->resp_count) { mutex_lock(&(dev->resp_lock)); }

同じ構成とボードがriotリリース2015.09で機能します。

問題はuartドライバーにあるかもしれませんが、xbeeドライバーにはタイムアウトが必要だと思います。 現在、暴動はロックされており、問題を検出するための情報はログに記録されないためです。

drivers network ARM question

最も参考になるコメント

#4445 がマージされたため、この問題はクローズできます。

全てのコメント7件

PR#4734を作成しました。

コミットに続いて、デバッグ出力を追加します。

https://github.com/Yonezawa-T2/RIOT/commit/0b437f440d114a28bbc63c3c6a7ff9dc4ded4bfd
https://github.com/Yonezawa-T2/RIOT/commit/c16cd9281821aaec8c9dd8260a3a98db659e8ef5

ENABLE_DEBUGXBEE_ENABLE_DETAILED_DEBUGを1に設定します。

他に問題がある場合は、#4445 に興味があるかもしれません。

arduino-dueでドライバーを試しましたが、それでも失敗しますが、uartの問題だと思います。
しかし、xbeeドライバーは完全には機能しません。
_api_at_cmdが失敗しても、xbee_initは失敗しません。たとえば、_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;
    }
  1. 最初の場合: tx_buf[4] が上書きされ、宛先の短いアドレスがインデックス 5 と 6 にある
  2. 第二に、それがelse if (hdr->dst_l2addr_len == 2)なるとしたら

最後の質問:宛先の長いアドレスはどのように取得されますか? 私のxbeeでは一致しないからです。

@ l3nko

送信関数で、xbeeドライバーに他のいくつかの問題があることに気づきました:
はい。 #4445を参照してください。

最後の質問:宛先の長いアドレスはどのように取得されますか? 私のxbeeでは一致しないからです。

私はあなたの質問を正しく理解しているかどうかわかりません。 XBeeは、ショートアドレスが0xFFFF設定されていない限り、ソースアドレスとしてショートアドレスを使用します。 これも#4445で修正されました。

#4445 がマージされたため、この問題はクローズできます。

このページは役に立ちましたか?
0 / 5 - 0 評価

関連する問題

jia200x picture jia200x  ·  7コメント

chrysn picture chrysn  ·  5コメント

nikosft picture nikosft  ·  6コメント

jia200x picture jia200x  ·  5コメント

silkeh picture silkeh  ·  5コメント