Я пытаюсь изменить программу многоскачкового осциллографа, чтобы узел приемника мог отправлять данные как в 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. Может ли кто-нибудь помочь мне, как я могу решить мою проблему?
btrpkt
. 2. Вы не проверяетеsendbusy
перед отправкой. 3. Как создать экземпляр компонента, подключенного кAMSend
? Он должен иметь тот же идентификатор (AM_OSCILLOSCOPE
согласно github. com/tinyos/tinyos-main/blob/master/apps/), если вы хотите, чтобы ваше сообщение обрабатывалось тем же кодом на стороне получателя. 4. Я не очень понимаю, что вы имеете в виду, когда пишете, что для UART и радио используется одно и то же оборудование. Какая платформа? - person maral   schedule 17.11.2016components new AMSenderC(DEFAULT_INTERVAL) as RadioSend;
MultihopOscilloscopeC.AMSend -> RadioSend;
и используйте его в MultihopOscilloscopeC.nc. Все, что я хочу, это то, что мой узел-приемник должен иметь возможность обрабатывать данные в последовательный порт, если флаг FALSE, или отправлять их обратно на узел, откуда он получил packagee, если флаг TRUE. Здесь я использую (счетчик %10 == 0) как флаг упрощения. Не могли бы вы помочь мне больше здесь? - person Suraj Acharya   schedule 18.11.2016