1

我目前正在开发一个在 Z1 设备上运行以进行调试的 contiki 程序。我想向该设备发送 UART 消息,并发现 Cooja 似乎支持“在 Z1 上显示串行端口”的功能。该工具实际上帮助我读取了从 mote 发送的 UART 消息,但是当我尝试发回一些东西时,Int 处理程序并没有被调用。以下是我在代码中初始化 UART 的方法:

uart0_init(0);
uart0_set_input(uart_handler);
uart0_writeb('U');

在处理程序本身中,我只是切换所有 LED(这绝对有效) - 但是,它们永远不会被切换。我什至尝试在 uart0-library 中的 ISR 处理程序中发送一个字节,但即使是那个字节也永远不会被发送。这意味着 Cooja 和 Z1 mote 之间的整个 UART 通信似乎无法正常工作。有没有人遇到过同样的问题并且能够为我提供解决方案?这将是一个很大的帮助!

4

1 回答 1

1

与此同时,我确实设法弄清楚了。这是任何面临同样问题的人的解决方案。以下代码有效。根据您是否定义 USE_SERIAL_LINE,您可以决定是要使用 serial-line-module 还是您自己的 int 处理程序。

#include <stdio.h>
#include <string.h>
#include "contiki.h"
#include "contiki-net.h"
#include "dev/uart0.h"


#define USE_SERIAL_LINE

#ifdef USE_SERIAL_LINE
#include "dev/serial-line.h"
#endif


PROCESS(init_system_proc, "Init system process");
AUTOSTART_PROCESSES(&init_system_proc);

int uart_handler(unsigned char c){
    printf("Single Byte input.\n");
    return 1;
}

PROCESS_THREAD(init_system_proc, ev, data){
        PROCESS_BEGIN();
        uart0_init(0);
#ifdef USE_SERIAL_LINE
        serial_line_init();
        uart0_set_input(serial_line_input_byte);
#else
        uart0_set_input(uart_handler);
#endif

        while (1) {
            PROCESS_YIELD();
#ifdef USE_SERIAL_LINE
        if(ev == serial_line_event_message)
            printf("Serial input.\n");
#endif
    }
    PROCESS_END();
}

使用 printf 进行 UART 输出时需要记住一件事。仅当出现“\n”时才会发送 UART 消息 - 这意味着每个 printf 语句都应以换行符结尾。否则,您的字符串只会在出现换行符时被缓冲并发送出去。

于 2019-06-10T16:58:51.047 回答