我希望我的multihopOscilloscope也能通过无线电和串口发送数据

时间:2016-11-16 21:44:40

标签: tinyos nesc

我正在尝试修改多跳示波器程序,以便汇聚节点能够同时向UART和无线电介质发送数据。据研究,我发现同样的硬件也用于通过UART和无线电发送数据包。 在这种情况下,如何修改我的代码,以便我可以根据收到的条件将数据发送到UART或无线电。在示例文档中,我每收到10个数据包就通过无线电发送数据。

我的汇聚节点的接收模块是:

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;

}

一旦数据发送回收到数据包的节点,它就无法再通过UART处理它。任何人都可以帮助我如何解决我的问题?

1 个答案:

答案 0 :(得分:0)

根据问题和评论:

  1. 您必须使用与接收者相同的ID实例化AMSenderC。在这种情况下,AM_OSCILLOSCOPE如果您希望消息由相同的代码处理。或者另一个id加上Receive接口的新实现。
  2. 您错过了将有效负载放入btrpkt
  3. 您必须检查sendbusy - 如果您在忙碌时尝试使用无线电堆栈,则会出现错误。