UART简介
通用异步收发传输器,即为UART(Universal Asynchronous Receiver/Transmitter),是一种常见的数据通信协议,用于在计算机和外部设备之间传输数据。UART通信是一种异步通信方式,它通过串行数据传输,允许设备之间以逐位的方式交换信息,并且UART是通用的,因为其的传输速度、数据速度和其他的参数是可配置的。
在UART中,字母"A"代表"异步",表示UART通信不依赖于共享的时钟信号来同步数据传输,而是使用特殊的起始位和停止位来标志数据字的开头和结尾,以便发送器和接收器能够协调数据传输。采用这种异步通信方式使UART非常适用于各种设备之间的数据传输,特别是在需要不同速率的设备之间进行通信时。UART通信较为简单和灵活,可以在很多低速或嵌入式应用中使用。
程序实例
跑马灯实现
w801开发板有7个led灯,分别表示为WM_IO_PB_05/25/26/18/17/16/11,实现跑马灯效果的源代码如下。
c
#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
// w801测试板用WM_IO_PB_05/25/26/18/17/16/11
// W800测试板:PB00是绿,PB01是红,PB02是蓝
//初始IO
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(绿、红、蓝)
c
#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
// w801测试板用WM_IO_PB_05/25/26/18/17/16/11
// W800测试板:PB00是绿,PB01是红,PB02是蓝
//初始IO
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;
}
}
UART通信实例
该实例中,开发板通过串口接收到数据,并通过URAT串口0发送接收到的数据。
cpp
#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");
}
//为串口绑定接收回调函数
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发送数据
}
}
}
}