2016-11-16 7 views
0

マルチホップオシロスコーププログラムを変更して、シンクノードがUARTとラジオの両方にデータを送信できるようにしようとしています。調査したところでは、同じハードウェアがUARTとラジオを介してパケットを送信するために使用されていることが分かりました。 この場合、受信した条件に基づいてデータをUARTまたはラジオに送信できるように、コードを変更するにはどうすればよいですか。ここでサンプルのプロローグでは、受信した10パケットごとにラジオ経由でデータを送信します。私のマルチホップオシロスコープがラジオとシリアルポートでデータを送信したい場合

私のシンクノードの受信モジュールをれる:データは、それがパケットを受信し、そこからノードに送り返すと、再びUARTを介してそれを処理することができない

event message_t* Receive.receive(message_t* msg, void *payload, uint8_t len) { 
oscilloscope_t* in = (oscilloscope_t*)payload; 
    counter++; 
am_addr_t rec = call AMPacket.source(msg); 

oscilloscope_t* out; 
counter++; 
    call Leds.led0On(); 
if (uartbusy == FALSE) { 
    out = (oscilloscope_t*)call SerialSend.getPayload(&uartbuf, sizeof(oscilloscope_t)); 
    if (len != sizeof(oscilloscope_t) || out == NULL) { 
return msg; 
    } 
    else { 
memcpy(out, in, sizeof(oscilloscope_t)); 
    } 
    uartlen = sizeof(oscilloscope_t); 
    post uartSendTask(); 
} else { 
    message_t *newmsg = call UARTMessagePool.get(); 
    if (newmsg == NULL) { 
    report_problem(); 
    return msg; 
    } 

    //Serial port busy, so enqueue. 
    out = (oscilloscope_t*)call SerialSend.getPayload(newmsg, sizeof(oscilloscope_t)); 
    if (out == NULL) { 
return msg; 
    } 
    memcpy(out, in, sizeof(oscilloscope_t)); 

    if (call UARTQueue.enqueue(newmsg) != SUCCESS) { 

    call UARTMessagePool.put(newmsg); 
    fatal_problem(); 
    return msg; 
    } 
} 
if(counter % 10 == 0){ 
oscilloscope_t* btrpkt = (oscilloscope_t*)(call Packet.getPayload(&pkt, sizeof(oscilloscope_t))); 
call Leds.led1On(); 
if (call AMSend.send(rec, &pkt, sizeof(oscilloscope_t)) == SUCCESS) { 
call Leds.led0On(); 
    sendbusy = TRUE; 
    } 
} 
return msg; 

} 

。誰も私の問題を解決する方法を教えてくれますか?質問やコメントによると

+0

1.ペイロードを 'btrpkt'に入れません。 2.送信しようとする前に 'sendbusy'をチェックしません。 3. 'AMSend'に配線されたコンポーネントをどのようにインスタンス化しますか?あなたのメッセージを同じコードで処理したい場合は、同じID(https://github.com/tinyos/tinyos-main/blob/master/apps/MultihopOscilloscopeLqi/MultihopOscilloscopeAppC.ncによる「AM_OSCILLOSCOPE」)が必要です受信側で 4.同じハードウェアがUARTやラジオで使用されていると書いて、何を意味するのか分かりません。どのプラットフォーム? – maral

+0

Maral、私はノード用のマイカプラットフォームを使用しています。私はコードを短縮するためにsendbusyフラグをチェックしていません。 MultihopOscilloscopeAppC.ncでAMSend Instantatin 'コンポーネントをRadioSendとして新しいAMSenderC(DEFAULT_INTERVAL)を提出;' 'MultihopOscilloscopeC.AMSend - > RadioSend;' とMultihopOscilloscopeC.nc でこれを使用して、私が欲しいのは私のシンクノードができるはずですですフラグがFALSEの場合はシリアルポートにデータを処理し、フラグがTRUEの場合はパケットを受信したノードにデータを戻します。ここでは、単純化のためのフラグに(カウンタ%10 == 0)を使用しています。もっと助けてくれますか? –

答えて

0

  1. あなたは、受信機の場合と同じIDを持つAMSenderCをインスタンス化する必要があります。この場合、メッセージを同じコードで処理する場合は、AM_OSCILLOSCOPEを入力します。または別のIDにReceiveインターフェイスの新しい実装を加えました。
  2. ペイロードをbtrpktに入れていませんでした。
  3. sendbusyを確認する必要があります。使用中に無線スタックを使用しようとするとバグです。
関連する問題