1

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

我已经尝试过getchar(), getch(), scanf(),gets()都没有成功,所以我想知道是否有人可以帮助我。

4

3 回答 3

4

getchar,getch,scanf,gets 是一种从文件(例如标准输入)中读取的 POSIX 事物——这些在 Contiki 中不存在(尽管您可能会在本机平台上使用它们)。

所以要问的第一个问题是您使用的是什么平台以及“键盘”是什么意思。如果键盘意味着键入通过串行端口从计算机发送的字符,那么您必须知道它们在运行 Contiki 的东西上的接收位置。一种典型的安排是在​​ uart 上接收字符,例如 uart1。

在这种情况下,contiki 使用将由应用程序定义的回调,例如 uart1_input_handler。平台主循环将检查是否有字符要发送到 input_handler,然后检查是否定义了 input_handler。如果是这样,将调用类似 uart1_input_handler(c) 的东西。

您可以通过对 uart1_input_handler 进行 grepping 来查看适用于各种平台的代码:

平台/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);

ETC...

一些注册输入处理程序并处理字符的示例:

示例/外壳:

/* 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 示例开始并尝试让这些示例正常工作。

于 2012-09-24T16:34:43.950 回答
1

下面引用的示例来自github上 contiki 的 Wiki 页面。它演示了串行输入的 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();
 }
于 2013-12-16T18:43:19.943 回答
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);

希望它有所帮助。

于 2016-05-12T09:49:56.003 回答