0

我正在尝试修改多跳示波器程序,以便接收节点也能够将数据发送到 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 处理它。谁能帮我解决我的问题?

4

1 回答 1

0

根据问题和评论:

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