Используйте события UART с Simplelink в Contiki-ng
На самом деле я пытаюсь получить сообщение последовательной линии, используя UART0 CC1310 с Contiki-ng.
Я реализовал функцию обратного вызова uart, которая сгруппирует все полученные символы в одну переменную и прекратит сбор, когда получит символ «\n».
int uart_handler(unsigned char c)
{
if (c == '\n')
{
end_of_string = 1;
index = 0;
}
else
{
received_message_from_uart[index] = c;
index++;
}
return 0;
}
uart0 инициализируется в основном и единственном процессе системы, а затем ожидает в бесконечном цикле while, пока не установится флаг end_of_string.
PROCESS_THREAD(udp_client_process, ev, data)
{
PROCESS_BEGIN();
uart0_init();
uart0_set_callback(uart_handler);
while (1)
{
//wait for uart message
if (end_of_string == 1 && received_message_from_uart[0] != 0)
{
LOG_INFO("Received mensaje\n");
index = 0;
end_of_string = 0;
// Delete received message from uart
memset(received_message_from_uart, 0, sizeof received_message_from_uart);
}
etimer_set(&timer, 0.1 * CLOCK_SECOND);
PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&timer));
}
PROCESS_END();
}
Как видите, цикл while останавливается на каждой итерации с минимальным временем события таймера. Хотя этот метод работает, я думаю, что это плохой способ, так как я читал , что существуют события uart, которые можно использовать, но я не смог ничего найти для CC1310.
Можно ли использовать UART CC1310 (или любой другой платформы simplelink) с событиями и прекратить выполнение ненужных итераций, пока сообщение не достигнет устройства?