Универсальный асинхронный приемник/передатчик, или UART (Универсальный асинхронный приемник/передатчик), — это общий протокол передачи данных, используемый для передачи данных между компьютерами и внешними устройствами. Связь UART — это метод асинхронной связи, который позволяет устройствам обмениваться информацией побитно посредством последовательной передачи данных. UART является универсальным, поскольку его скорость передачи, скорость передачи данных и другие параметры настраиваются.
В UART буква «А» означает «асинхронный», что означает, что связь UART не полагается на общий тактовый сигнал для синхронизации передачи данных, а использует специальные стартовые и стоповые биты для обозначения начала и конца слова данных. для передачи Передатчик и приемник могут координировать передачу данных. Использование этого метода асинхронной связи делает UART очень подходящим для передачи данных между различными устройствами, особенно когда требуется связь между устройствами, которым требуются разные скорости. Связь UART относительно проста и гибка и может использоваться во многих низкоскоростных или встроенных приложениях.
плата разработки w801иметь7индивидуальныйledлампа,Представлено как WM_IO_PB_05/25/26/18/17/16/11 соответственно.,Исходный код для достижения эффекта выделения выглядит следующим образом.
#include "wm_include.h"
int led[7]={WM_IO_PB_05,WM_IO_PB_25,WM_IO_PB_26,WM_IO_PB_18,WM_IO_PB_17,WM_IO_PB_16,WM_IO_PB_11};
void UserMain(void)
{
#if DEMO_CONSOLE
CreateDemoTask();
#endif
// WM_IO_PB_05/25/26/18/17/16/11 для тестовой платы w801
// Тестовая плата W800: PB00 — зеленый, PB01 — красный, PB02 — синий.
//Начальный ввод-вывод
for(int i=0;i<7;i++) {
tls_gpio_cfg(led[i],WM_GPIO_DIR_OUTPUT,WM_GPIO_ATTR_PULLLOW);
}
int i=0;
while (1){
tls_gpio_write(led[i],0); // 0 означает, что свет включен, 1 означает, что свет выключен.
delay(1000 * 1000);
tls_gpio_write(led[i],1);
i++;
i %= 7;
}
}
Плата разработки W800иметь3индивидуальныйлампа,Объединение в RGB-подсветку,Можно комбинировать разные цвета,соответственноWM_IO_PB_00,WM_IO_PB_01,WM_IO_PB_02(зеленый、красный、синий)
#include "wm_include.h"
int led[3]={WM_IO_PB_00,WM_IO_PB_01,WM_IO_PB_02};
void UserMain(void)
{
#if DEMO_CONSOLE
CreateDemoTask();
#endif
// WM_IO_PB_05/25/26/18/17/16/11 для тестовой платы w801
// Тестовая плата W800: PB00 — зеленый, PB01 — красный, PB02 — синий.
//Начальный ввод-вывод
for(int i=0;i<3;i++) {
tls_gpio_cfg(led[i],WM_GPIO_DIR_OUTPUT,WM_GPIO_ATTR_PULLLOW);
}
int i=0;
while (1){
tls_gpio_write(led[i],0); // 0 означает, что свет включен, 1 означает, что свет выключен.
delay(1000 * 1000);
tls_gpio_write(led[i],1);
i++;
i %= 3;
}
}
В этом примере плата разработки получает данные через последовательный порт и отправляет полученные данные через последовательный порт URAT 0.
#include "wm_include.h"
#include <string.h>
//Определяем семафор
tls_os_sem_t * sem_rx = NULL;
// Сохранение длины полученных данных
u16 rx_length = 0;
char rx_fifo_buf[1024] = {0};
// Получить функцию обратного вызова
s16 my_uart_rx_callback(u16 len, void* user_data) {
// Освободите полученный семафор
tls_os_sem_release(sem_rx);
// Накопить полученные символы
rx_length += len;
return WM_SUCCESS;
}
void UserMain(void){
printf("\n user task \n");
#if DEMO_CONSOLE
CreateDemoTask();
#endif
// Выберите контакты, которые будут использоваться, и их конкретные альтернативные функции.
/* UART0_RX-PB20 UART0_TX-PB19 */
wm_uart1_rx_config(WM_IO_PB_20);
wm_uart1_tx_config(WM_IO_PB_19);
//Настраиваем параметры UART
tls_uart_options_t opt;
opt.baudrate = UART_BAUDRATE_B115200; //скорость передачи данных
opt.paritytype = TLS_UART_PMODE_DISABLED; //Нет проверки четности
opt.stopbits = TLS_UART_ONE_STOPBITS; //Стоповый бит
opt.charlength = TLS_UART_CHSIZE_8BIT; //данные长度
opt.flow_ctrl = TLS_UART_FLOW_CTRL_NONE; //Нет управления потоком
if (WM_SUCCESS != tls_uart_port_init(TLS_UART_0, &opt, 0))
{
printf("uart0 init error\n");
}
//Привязываем Tweet к последовательному порту функцию обратного вызова
tls_uart_rx_callback_register((u16) TLS_UART_0, (s16(*)(u16, void*))my_uart_rx_callback, NULL);
//Используется для определения успешности получения семафора
tls_os_status_t os_status = TLS_OS_ERROR;
//Создаем семафор для использования между функцией обратного вызова и потоком связи
tls_os_sem_create(&sem_rx, 0);
// Получить длину данных
u16_t rx_len = 0;
while(1) {
os_status = tls_os_sem_acquire(sem_rx, 20);
if(os_status) {
if(rx_length > 0) {
rx_len = tls_uart_read(TLS_UART_0, rx_fifo_buf, rx_length);//Данные, полученные последовательным портом 0
// Удалить символы новой строки из полученных символов
for (int i = 0; i < rx_len; i++) {
if (rx_fifo_buf[i] == '\r' || rx_fifo_buf[i] == '\n') {
rx_fifo_buf[i] = '\0';
rx_length = i;
break;
}
}
printf("Длина: %d; символы: %s\n",rx_length,rx_fifo_buf);
rx_length = 0;
tls_uart_write(TLS_UART_0, rx_fifo_buf, rx_len); //Последовательный порт 0 отправляет данные
}
}
}
}