Получайте сообщения UART через Cooja на Z1 - PullRequest
0 голосов
/ 09 июня 2019

В настоящее время я разрабатываю программу contiki, которая работает на устройстве Z1 для целей отладки.Я хотел бы отправить сообщения UART на это устройство и узнал, что Cooja поддерживает это с помощью функции «Показать последовательный порт на Z1».Этот инструмент на самом деле помог мне прочитать сообщения UART, отправленные из мотива, но когда я пытаюсь что-то отправить обратно, обработчик Int просто не вызывается.Вот как я инициализирую UART в коде:

uart0_init(0);
uart0_set_input(uart_handler);
uart0_writeb('U');

В самом обработчике я просто переключаю все светодиоды (что определенно работает) - однако они никогда не переключаются.Я даже пытался отправить байт в обработчике ISR в библиотеке uart0, но даже этот байт никогда не отправлялся.Это означает, что вся связь UART между Cooja и мотыльком Z1, кажется, не работает правильно.Кто-нибудь когда-нибудь сталкивался с такой же проблемой и может дать мне решение для этого?Было бы здорово помочь!

1 Ответ

1 голос
/ 10 июня 2019

Мне удалось выяснить это в то же время. Вот решение для тех, кто сталкивается с той же проблемой. Следующий код работает. В зависимости от того, определяете ли вы USE_SERIAL_LINE, вы можете решить, хотите ли вы использовать модуль последовательной линии или собственный обработчик int.

#include <stdio.h>
#include <string.h>
#include "contiki.h"
#include "contiki-net.h"
#include "dev/uart0.h"


#define USE_SERIAL_LINE

#ifdef USE_SERIAL_LINE
#include "dev/serial-line.h"
#endif


PROCESS(init_system_proc, "Init system process");
AUTOSTART_PROCESSES(&init_system_proc);

int uart_handler(unsigned char c){
    printf("Single Byte input.\n");
    return 1;
}

PROCESS_THREAD(init_system_proc, ev, data){
        PROCESS_BEGIN();
        uart0_init(0);
#ifdef USE_SERIAL_LINE
        serial_line_init();
        uart0_set_input(serial_line_input_byte);
#else
        uart0_set_input(uart_handler);
#endif

        while (1) {
            PROCESS_YIELD();
#ifdef USE_SERIAL_LINE
        if(ev == serial_line_event_message)
            printf("Serial input.\n");
#endif
    }
    PROCESS_END();
}

Есть одна вещь, которую вы должны иметь в виду при использовании printf для вывода UART. Сообщение UART будет отправлено только при появлении «\ n» - это означает, что каждый оператор printf должен заканчиваться символом новой строки. В противном случае ваша строка буферизируется и отправляется только после появления символа новой строки.

...