Я хочу знать, как я могу получить ввод с клавиатуры в contiki os.
Я уже пробовал getchar()
,getch()
,scanf()
,gets()
, и ни один из них не работал, поэтому я хочу знать, может ли кто-нибудь мне помочь.
Я хочу знать, как я могу получить ввод с клавиатуры в contiki os.
Я уже пробовал getchar()
,getch()
,scanf()
,gets()
, и ни один из них не работал, поэтому я хочу знать, может ли кто-нибудь мне помочь.
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);
Я предполагаю, что вы хотите начать с примеров оболочки и попытаться заставить их работать.
Приведенный ниже пример взят из вики-страниц 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();
}
Я предполагаю, что вы используете 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);
Надеюсь, это помогло.