W800/W801开发版入门(二)——串口通信UART

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发送数据
			}
		}
	}
}

参考

  1. W801芯片产品规格书_V2.0.pdf
  2. W801_寄存器手册_V3.0.pdf
  3. W801芯片设计指导书V3.1.pdf
相关推荐
深圳启明云端科技1 小时前
ESP-IDF HTTP POST请求发送音频-ESP32物联网方案
物联网·http·音视频
一只搬砖的猹3 小时前
cJson系列——常用cJson库函数
linux·前端·javascript·python·物联网·mysql·json
忘川8563 小时前
以太网帧结构
网络·物联网·网络协议
嵌入式科普4 小时前
嵌入式科普(25)Home Assistant米家集成意味着IOT的核心是智能设备
物联网·homeassistant·米家集成
2401_8827275713 小时前
低代码配置式组态软件-BY组态
前端·后端·物联网·低代码·前端框架
深圳市青牛科技实业有限公司 小芋圆18 小时前
开关电源特点、分类、工作方式
前端·科技·单片机·物联网·分类·数据挖掘·新能源
电子科技圈21 小时前
芯科科技蓝牙、Wi-Fi、Wi-SUN产品广获业界认可,技术创新引领行业潮流
科技·mcu·物联网·iot
极客小张21 小时前
基于STM32的智慧农业控制系统设计:python可视化、UART、I2C、TCP/HTTP技术
python·stm32·单片机·物联网·tcp/ip·毕业设计·课程设计
html组态1 天前
web组态可视化编辑器
前端·物联网·编辑器·web组态·组态·组态软件
中科岩创1 天前
中科岩创桥梁自动化监测解决方案
大数据·网络·物联网