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

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


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

最佳答案

同时,我确实设法弄清楚了。这是面临同样问题的任何人的解决方案。
以下代码有效。根据您是否定义USE_SERIAL_LINE,可以决定是要使用串行线模块还是自己的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语句都应以换行符结尾。否则,只有在出现新的换行符后,字符串才会被缓冲并发送出去。

关于c - 通过Z1节点上的Cooja接收UART消息,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56514830/

10-11 21:17