Я хочу, чтобы мой multihopOscilloscope также отправлял данные через радио и последовательный порт.

Я пытаюсь изменить программу многоскачкового осциллографа, чтобы узел приемника мог отправлять данные как в 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. Может ли кто-нибудь помочь мне, как я могу решить мою проблему?


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


Ответы (1)


Согласно вопросу и комментариям:

  1. Вы должны создать экземпляр AMSenderC с тем же идентификатором, что и у получателя. В этом случае AM_OSCILLOSCOPE, если вы хотите, чтобы сообщение обрабатывалось одним и тем же кодом. Или другой id плюс новая реализация интерфейса Receive.
  2. Вы пропустили размещение полезной нагрузки в btrpkt.
  3. Вы должны проверить sendbusy - это ошибка, если вы пытаетесь использовать стек радио, когда он занят.
person maral    schedule 04.12.2016