得到键盘输入contiki

时间:2012-09-21 14:31:11

标签: contiki

我想知道如何在contiki os中获得键盘输入。

我已经尝试getchar()getch()scanf()gets()但没有人工作,所以我想知道是否有人可以帮助我。

3 个答案:

答案 0 :(得分:4)

getchar,getch,scanf,gets是从文件中读取的POSIX东西(例如stdin)---这些在Contiki中不存在(尽管你可以将它们与原生平台一起使用)。

所以要问的第一个问题是你使用什么平台以及“键盘”是什么意思。如果键盘意味着键入通过串行端口从计算机发送的字符,那么你必须知道在运行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);

希望它有所帮助。