【问题标题】:Contiki: print data received using RimeContiki:打印使用 Rime 接收的数据
【发布时间】:2017-08-10 02:23:07
【问题描述】:

如何在recv_uc函数中打印接收到的数据?在这种情况下是 var 的值。我使用packetbuf_copyfrom(&var, 5)var 放入发送的数据包中。

PROCESS(sending_rand, "Sending rand");
AUTOSTART_PROCESSES(&sending_rand);

static void
recv_uc(struct unicast_conn *c, const rimeaddr_t *from)
{
    printf("unicast message received from %d.%d\nreceived data: %d\n",
            from->u8[0], from->u8[1], /* print data received */);
}

static const struct unicast_callbacks unicast_call = {recv_uc};
static struct unicast_conn unicast;

PROCESS_THREAD(sending_rand, ev, data)
{
    static struct etimer et;//oggetto di tipo etimer
    int var;  

    PROCESS_EXITHANDLER(unicast_close(&unicast);)

    PROCESS_BEGIN();

    unicast_open(&unicast, 129, &unicast_call);

    while(1) {

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

        PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et));

        var = random_rand();

        packetbuf_copyfrom(&var, 5);
        addr.u8[0] = 1;
        addr.u8[1] = 0;
        if(!rimeaddr_cmp(&addr, &rimeaddr_node_addr)) {
            unicast_send(&unicast, &addr);
        }

        printf("unicast message sent\n");
    }

    PROCESS_END();
}

【问题讨论】:

    标签: c contiki


    【解决方案1】:

    一种方法是使用packetbuf_dataptr() 函数来访问内容。

    int var;
    memcpy(&var, packetbuf_dataptr(), sizeof(var));
    printf("var=%d\n", var);
    

    您的发送代码存在与var 大小相关的错误。它是 2、4 或 8 个字节,具体取决于平台。它永远不是 5,所以这是错误的:

    packetbuf_copyfrom(&var, 5); // Undefined behavior!
    

    如果大小很重要,请始终使用int16_t / uint16_tint32_t / uint32_t!它们在有效包含在每个 Contiki 文件中的标头中进行了类型定义。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-29
      相关资源
      最近更新 更多