получить ввод с клавиатуры contiki

Я хочу знать, как я могу получить ввод с клавиатуры в contiki os.

Я уже пробовал getchar(),getch(),scanf(),gets(), и ни один из них не работал, поэтому я хочу знать, может ли кто-нибудь мне помочь.


person user1689063    schedule 21.09.2012    source источник


Ответы (3)


getchar, getch, scanf, gets - это вещи POSIX, которые считываются из файлов (например, stdin) --- они не существуют в Contiki (хотя вы, вероятно, могли бы использовать их с нативной платформой).

Итак, первый вопрос, который нужно задать, — какую платформу вы используете и что вы подразумеваете под «клавиатурой». Если под клавиатурой подразумевается ввод символов, которые передаются через последовательный порт с компьютера, то вам нужно знать, откуда они принимаются на устройстве, на котором работает Contiki. Типичным устройством является получение символов на uart, скажем, uart1.

В этом случае contiki использует обратный вызов, такой как uart1_input_handler, который будет определен приложением. Основные циклы платформы проверяют, есть ли символы для отправки в input_handler, а затем проверяют, определен ли input_handler. Если это так, вызовет что-то вроде uart1_input_handler(c).

Вы можете увидеть этот код для различных платформ, выполнив поиск uart1_input_handler:

платформа/redbee-econotag/contiki-mc1322x-main.c: uart1_input_handler(uart1_getc());

процессор/msp430/dev/uart1x.c: если (uart1_input_handler (c)) {

процессор/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);

Я предполагаю, что вы хотите начать с примеров оболочки и попытаться заставить их работать.

person Mariano Alvira    schedule 24.09.2012
comment
Большое спасибо, Мариано, я был полностью потерян, но теперь я знаю, что искать :), и я использую платформу Sky, и да, когда я говорю «клавиатура», я имею в виду набор символов, которые отправляются через последовательный порт. - person user1689063; 27.09.2012
comment
следует отметить этот ответ, ответил ли он на ваш вопрос или нет? - person errordeveloper; 18.10.2012

Приведенный ниже пример взят из вики-страниц contiki на github. . Он демонстрирует, как работает специальный механизм contiki для последовательного ввода. Как и Мариано, упомянутый выше, обратный вызов должен быть определен для последовательных драйверов, характерных для используемой вами платформы. Я использовал напр. «rs232_set_input(RS232_PORT_0, serial_line_input_byte);» для моего микроконтроллера atmega128. Драйверы последовательного ввода-вывода используют этот механизм обратного вызова для отправки входных символов в "serial_line_process", определенный в файле serial-line.c. Затем этот процесс рассылает сообщение 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();
 }
person Maneesh18187    schedule 16.12.2013

Я предполагаю, что вы используете COOJA (или, может быть, вы подключили клавиатуру к своему устройству, поэтому мой ответ будет неверным). COOJA — это эмулятор, а не симулятор.

Если вам нужен адаптивный дизайн, используйте сенсорную кнопку (например, на платформе Sky).

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);

Надеюсь, это помогло.

person user6324836    schedule 12.05.2016