tests/periph_uart: added two UART driver tests
- test for UART driver in blocking mode - test for UART driver in interrupt driven mode
This commit is contained in:
parent
037820d6a6
commit
477bc5a73d
10
tests/periph_uart_blocking/Makefile
Normal file
10
tests/periph_uart_blocking/Makefile
Normal file
@ -0,0 +1,10 @@
|
||||
export APPLICATION = periph_uart_blocking
|
||||
include ../Makefile.tests_common
|
||||
|
||||
BOARD_BLACKLIST := chronos mbed_lpc1768 msb-430 msb-430h native qemu-i386 redbee-econotag telosb \
|
||||
wsn430-v1_3b wsn430-v1_4 z1
|
||||
# all listed boards: no periph_conf.h defined,
|
||||
|
||||
DISABLE_MODULE += auto_init
|
||||
|
||||
include $(RIOTBASE)/Makefile.include
|
||||
107
tests/periph_uart_blocking/main.c
Normal file
107
tests/periph_uart_blocking/main.c
Normal file
@ -0,0 +1,107 @@
|
||||
/*
|
||||
* Copyright (C) 2014 Freie Universität Berlin
|
||||
*
|
||||
* This file is subject to the terms and conditions of the GNU Lesser General
|
||||
* Public License v2.1. See the file LICENSE in the top level directory for more
|
||||
* details.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @ingroup tests
|
||||
* @{
|
||||
*
|
||||
* @file
|
||||
* @brief Test for low-level UART driver in blocking mode
|
||||
*
|
||||
* This test will test the functionality of all configured UART interface. While instructions are
|
||||
* given on the STDIO UART interface, the test will ask the user to iteratively connect to every
|
||||
* other UART interface and make some input there.
|
||||
*
|
||||
* The test makes only sense, if at least 2 UART devices are configured...
|
||||
*
|
||||
* @author Hauke Petersen <hauke.petersen@fu-berlin.de>
|
||||
*
|
||||
* @}
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "board.h"
|
||||
#include "periph/uart.h"
|
||||
|
||||
/* only build this test, if the target supports the UART driver interface */
|
||||
#if UART_NUMOF
|
||||
|
||||
static int baudrates[] = {115200, 57600, 9600, 38400, 115200, 115200};
|
||||
|
||||
void uart_print(uart_t dev, char *str)
|
||||
{
|
||||
int i = 0;
|
||||
|
||||
while (str[i] != '\0') {
|
||||
uart_write_blocking(dev, str[i++]);
|
||||
}
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
char *hello = "Testing this UART device:\n";
|
||||
char *ask = "Please enter a few chars with newline in the end\n";
|
||||
char buf[128];
|
||||
int p, i;
|
||||
char tmp;
|
||||
|
||||
puts("Test UART driver in blocking mode\n");
|
||||
puts("Setting up remaining UART devices:");
|
||||
for (int i = UART_0; i < UART_NUMOF; i++) {
|
||||
if (i != STDIO) {
|
||||
printf("Setting up UART_%i @ %i", i, baudrates[i]);
|
||||
if (uart_init_blocking(i, baudrates[i]) >= 0) {
|
||||
puts(" ...ok");
|
||||
}
|
||||
else {
|
||||
puts(" ...failed");
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("\n");
|
||||
|
||||
for (i = UART_0; i < UART_NUMOF; i++) {
|
||||
if (i != STDIO) {
|
||||
printf("Please Connect to UART_%i @ %i now, press return when done\n", i, baudrates[i]);
|
||||
do {
|
||||
tmp = getchar();
|
||||
} while (tmp != '\n');
|
||||
|
||||
uart_print(i, hello);
|
||||
uart_print(i, ask);
|
||||
p = 0;
|
||||
memset(buf, 0, 128);
|
||||
printf("Input was: ");
|
||||
do {
|
||||
uart_read_blocking(i, &buf[p++]);
|
||||
printf("%c", buf[p - 1]);
|
||||
} while (buf[p - 1] != '\n');
|
||||
buf[p] = '\0';
|
||||
uart_print(i, buf);
|
||||
printf("\n");
|
||||
}
|
||||
}
|
||||
|
||||
puts("If you were able to see your inputs on each UART device, the test was successful!");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
int main(void)
|
||||
{
|
||||
puts("This board does not support the low-level UART driver interface.");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* UART_NUMOF */
|
||||
11
tests/periph_uart_int/Makefile
Normal file
11
tests/periph_uart_int/Makefile
Normal file
@ -0,0 +1,11 @@
|
||||
export APPLICATION = periph_uart_int
|
||||
include ../Makefile.tests_common
|
||||
|
||||
BOARD_BLACKLIST := chronos mbed_lpc1768 msb-430 msb-430h native qemu-i386 redbee-econotag telosb \
|
||||
wsn430-v1_3b wsn430-v1_4 z1
|
||||
# all listed boards: no periph_conf.h defined,
|
||||
|
||||
USEMODULE += lib
|
||||
USEMODULE += vtimer
|
||||
|
||||
include $(RIOTBASE)/Makefile.include
|
||||
146
tests/periph_uart_int/main.c
Normal file
146
tests/periph_uart_int/main.c
Normal file
@ -0,0 +1,146 @@
|
||||
/*
|
||||
* Copyright (C) 2014 Freie Universität Berlin
|
||||
*
|
||||
* This file is subject to the terms and conditions of the GNU Lesser General
|
||||
* Public License v2.1. See the file LICENSE in the top level directory for more
|
||||
* details.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @ingroup tests
|
||||
* @{
|
||||
*
|
||||
* @file
|
||||
* @brief Test for low-level UART driver in blocking mode
|
||||
*
|
||||
* This application tests the interrupt driven mode for the low-level UART driver.
|
||||
*
|
||||
* The test will read characters from the UART into a receiving buffer, until a newline is received.
|
||||
* When this happens, the received string will be printed to stdout.
|
||||
*
|
||||
* In the same time, a string is written to the UART every 2 seconds, to make sure the transmission
|
||||
* is working as well.
|
||||
*
|
||||
* @author Hauke Petersen <hauke.petersen@fu-berlin.de>
|
||||
*
|
||||
* @}
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "cpu.h"
|
||||
#include "msg.h"
|
||||
#include "kernel.h"
|
||||
#include "thread.h"
|
||||
#include "board.h"
|
||||
#include "vtimer.h"
|
||||
#include "ringbuffer.h"
|
||||
#include "periph/uart.h"
|
||||
#include "periph_conf.h"
|
||||
|
||||
/* only build this test if the UART driver is supported */
|
||||
#if UART_NUMOF
|
||||
|
||||
#define DEV UART_0
|
||||
#define BAUD 115200
|
||||
|
||||
static volatile int main_pid;
|
||||
|
||||
static char uart_stack[KERNEL_CONF_STACKSIZE_MAIN];
|
||||
|
||||
static char rx_mem[128];
|
||||
static char tx_mem[128];
|
||||
static ringbuffer_t rx_buf;
|
||||
static ringbuffer_t tx_buf;
|
||||
|
||||
|
||||
void rx(void *ptr, char data)
|
||||
{
|
||||
msg_t msg;
|
||||
|
||||
ringbuffer_add_one(&rx_buf, data);
|
||||
if (data == '\n') {
|
||||
msg_send(&msg, main_pid, 1);
|
||||
}
|
||||
}
|
||||
|
||||
int tx(void *ptr)
|
||||
{
|
||||
char data;
|
||||
|
||||
if (tx_buf.avail > 0) {
|
||||
data = ringbuffer_get_one(&tx_buf);
|
||||
uart_write(DEV, data);
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void *uart_thread(void *arg)
|
||||
{
|
||||
(void)arg;
|
||||
char *status = "I am written to the UART every 2 seconds\n";
|
||||
|
||||
while (1) {
|
||||
ringbuffer_add(&tx_buf, status, strlen(status));
|
||||
uart_tx_begin(DEV);
|
||||
|
||||
vtimer_usleep(2000 * 1000);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
char buf[128];
|
||||
int res;
|
||||
msg_t msg;
|
||||
|
||||
main_pid = thread_getpid();
|
||||
|
||||
puts("\nTesting interrupt driven mode of UART driver\n");
|
||||
|
||||
puts("Setting up buffers...");
|
||||
ringbuffer_init(&rx_buf, rx_mem, 128);
|
||||
ringbuffer_init(&tx_buf, tx_mem, 128);
|
||||
|
||||
printf("Initializing UART @ %i", BAUD);
|
||||
if (uart_init(DEV, BAUD, rx, tx, 0) >= 0) {
|
||||
puts(" ...done");
|
||||
}
|
||||
else {
|
||||
puts(" ...failed");
|
||||
return 1;
|
||||
}
|
||||
|
||||
puts("Starting timer thread that triggers UART output...");
|
||||
thread_create(uart_stack, KERNEL_CONF_STACKSIZE_MAIN, PRIORITY_MAIN - 1,
|
||||
0, uart_thread, 0, "uart");
|
||||
|
||||
while (1) {
|
||||
msg_receive(&msg);
|
||||
|
||||
printf("RECEIVED INPUT: ");
|
||||
res = ringbuffer_get(&rx_buf, buf, rx_buf.avail);
|
||||
buf[res] = '\0';
|
||||
printf("%s", buf);
|
||||
|
||||
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
int main(void)
|
||||
{
|
||||
puts("This platform does not support the low-level UART driver");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* UART_NUMOF */
|
||||
Loading…
x
Reference in New Issue
Block a user