我目前正在开发一个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通信似乎无法正常工作。有没有人遇到过同样的问题,并且能够为我提供解决方案?这将是很大的帮助!
答案 0 :(得分:1)
与此同时,我确实设法弄清楚了。这是面临相同问题的任何人的解决方案。 以下代码有效。根据是否定义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语句都应以换行符结尾。否则,只有在出现新的换行符后,您的字符串才会被缓冲并发送出去。