我想知道如何在contiki os中获得键盘输入。
我已经尝试getchar()
,getch()
,scanf()
,gets()
但没有人工作,所以我想知道是否有人可以帮助我。
答案 0 :(得分:4)
所以要问的第一个问题是你使用什么平台以及“键盘”是什么意思。如果键盘意味着键入通过串行端口从计算机发送的字符,那么你必须知道在运行Contiki的东西上收到它们的位置。典型的安排是在uart上接收字符,例如uart1。
在这种情况下,contiki使用一个回调,例如uart1_input_handler,它将由应用程序定义。平台主循环将检查是否有要发送到input_handler的字符,然后检查是否定义了input_handler。如果是这样,将调用类似uart1_input_handler(c)的内容。
您可以通过grepping for uart1_input_handler来查看各种平台的代码:
platform / redbee-econotag / contiki-mc1322x-main.c:uart1_input_handler(uart1_getc());
cpu / msp430 / dev / uart1x.c:if(uart1_input_handler(c)){
cpu / stm32w108 / dev / uart1.c:uart1_input_handler(c);
等...
注册输入处理程序并处理字符的一些示例:
示例/壳:
/* set up the shell */
uart1_set_input(serial_line_input_byte);
serial_line_init();
serial_shell_init();
slip, in examples/ipv6/rpl-border-router/slip-bridge.c
slip_set_input_callback(slip_input_callback);
我对你想要做的事情的猜测是从shell示例开始,并尝试让这些工作。
答案 1 :(得分:1)
下面引用的示例来自github上的Wiki pages of contiki。它演示了串行输入的contiki特定机制如何工作。与上面提到的mariano一样,必须为特定于您正在使用的平台的串行驱动程序定义回调。我用过前。 “rs232_set_input(RS232_PORT_0,serial_line_input_byte);”用于我的atmega128 MCU。串行I / O驱动程序使用此回调机制将输入字符发布到serial-line.c文件中定义的“serial_line_process”。然后,此过程将serial_line_event_message广播到所有进程以及在串行线上读取的数据。像过程这样的过程。如下所述,可以捕获此事件并根据要求处理输入。
上面提到的回调在$(CONTIKI)/core/dev/serial-line.c中定义。检查出。 一旦使用serial_line_init()初始化它,就可以了。
#include "contiki.h"
#include "dev/serial-line.h"
#include <stdio.h>
PROCESS(test_serial, "Serial line test process");
AUTOSTART_PROCESSES(&test_serial);
PROCESS_THREAD(test_serial, ev, data)
{
PROCESS_BEGIN();
for(;;) {
PROCESS_YIELD();
if(ev == serial_line_event_message) {
printf("received line: %s\n", (char *)data);
}
}
PROCESS_END();
}
答案 2 :(得分:0)
我假设您使用COOJA(或者您可能将键盘连接到您的设备,因此我的答案将不正确)。 COOJA是一个模拟器,而不是模拟器。
如果您想要一个响应式设计,请使用传感器按钮(例如在天空平台上)
SENSORS_ACTIVATE(button_sensor);
/* Wait until we get a sensor event with the button sensor as data. */
PROCESS_WAIT_EVENT_UNTIL(ev == sensors_event &&
data == &button_sensor);
希望它有所帮助。