Как я могу отправить сообщение другой программе и вывести, что оно получено? - PullRequest
0 голосов
/ 28 января 2019

В contiki мне нужно иметь два файла, отправитель и получатель, отправитель отправляет пакеты получателю.Моя проблема в том, что получатель не выводит, что пакеты были получены.

Я пробовал цикл while в принимающем пакете, я даже пытался создать функцию, но все равно ничего не помогло.

Мой файл sender.c

#include "contiki.h"
#include "net/rime.h"
#include "random.h"
#include "dev/button-sensor.h"
#include "dev/leds.h"

#include <stdio.h>

PROCESS(sendReceive, "Hello There");
AUTOSTART_PROCESSES(&sendReceive);

PROCESS_THREAD(sendReceive, ev, data)
{
    PROCESS_BEGIN();
    static struct abc_conn abc;
    static struct etimer et;
    static const struct abc_callbacks abc_call;
    PROCESS_EXITHANDLER(abc_close(&abc);)


  abc_open(&abc, 128, &abc_call);

  while(1) 
 {

/* Delay 2-4 seconds */
etimer_set(&et, CLOCK_SECOND * 2 + random_rand() % (CLOCK_SECOND * 2));

PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et));

packetbuf_copyfrom("Hello", 6);
abc_send(&abc);
printf("Message sent\n");
  }

  PROCESS_END();
}

Файл моего приемника

#include "contiki.h"
#include "net/rime.h"
#include "random.h"
#include "dev/button-sensor.h"
#include "dev/leds.h"

#include <stdio.h>

PROCESS(sendReceive, "Receiving Message");
AUTOSTART_PROCESSES(&sendReceive);

PROCESS_THREAD(sendReceive, ev, data)
{
    PROCESS_BEGIN();
{
  printf("Message received '%s'\n", (char *)packetbuf_dataptr());
}
    PROCESS_END();
}

Файл sender.c работает, он правильно отправляет пакеты, проблема в приемникекажется, не выводить, что он был получен.

1 Ответ

0 голосов
/ 29 января 2019

Хотя отправка проста - вам просто нужно вызвать функцию - получение данных во встроенной системе в целом более сложное.Для операционной системы должен быть способ сообщить вашему коду, что новые данные поступили извне.В Contiki это делается внутренне с событиями и с точки зрения пользователя с помощью обратных вызовов.

Итак, реализуйте функцию обратного вызова:

static void
recv_from_abc(struct abc_conn *bc)
{
  printf("Message received '%s'\n", (char *)packetbuf_dataptr());
}

В процессе вашего получателя создайте и откройте соединение, передавуказатель функции обратного вызова в качестве параметра:

static struct abc_conn c;
static const struct abc_callbacks callbacks =
    {recv_from_abc, NULL};
uint16_t channel = 128; /* matching the sender code */
abc_open(&c, channel, &callbacks);
...