我正在尝试修改多跳示波器程序,以便汇聚节点能够同时向UART和无线电介质发送数据。就研究而言,我发现同样的硬件也用于通过UART和无线电发送数据包。在这种情况下,如何修改代码,以便根据接收到的条件将数据发送到UART或radio。在示例程序中,我每收到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处理它。有人能帮我解决我的问题吗?
发布于 2016-12-05 07:00:45
根据问题和评论:
AMSenderC。在这种情况下,如果您希望消息由相同的代码处理,则返回AM_OSCILLOSCOPE。或者另一个id加上Receive接口的新实现。您错过了将有效负载放入btrpkt.sendbusy -如果您试图在无线电堆栈繁忙时使用它,这是一个错误。https://stackoverflow.com/questions/40642915
复制相似问题