w801实现亮灯代码
  JpL9yicV96yg 2023年11月02日 53 0
#include "uart.h"
#include "wm_uart.h"
#include "wm_include.h"
#include "wm_config.h"
#include <stdint.h>

//#include "MagicRF_Parameter.h"
#include "wm_timer.h"
#include "wm_gpio_afsel.h"
#include <string.h>



//task资源
#define  UART_TASK_SIZE      					1024
static OS_STK 			uart_task_stk[UART_TASK_SIZE];
//static void timerout(unsigned char *arg);

char str1[100] = "open";
char str2[100] = "close";

//存储接收到的数据
unsigned char rx_buf[1024] = {0};

unsigned char str[]="open";
//存储收到数据的长度
uint16_t rx_length = 0;
char rx_fifo_buf[2048] = {0};
uint16_t rx_buf_length = 0;
//定义一个信号量
tls_os_sem_t * sem_rx = NULL;


//接收回调函数
s16 my_uart_rx_callback(u16 len, void* user_data)
{
	//将接收到字符累加,这里很坑,下面章节会具体讲这个函数。
	rx_length += len;
	tls_os_sem_release(sem_rx);
    return WM_SUCCESS;
}


//串口初始化
void my_uart_init()
{	
	//初始化uart引脚,函数内部会自动开启串口时钟,
	wm_uart0_rx_config(WM_IO_PB_20);
	wm_uart0_tx_config(WM_IO_PB_19);
	
	//配置uart参数
	tls_uart_options_t opt;
//	opt.baudrate=UART_BAUDRATE_B57600;
	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_uart_tx_callback_register(2, (s16(*) (struct tls_uart_port *))tls_uart_free_tx_sent_data);
}
	uint16_t rx_len = 0;	
//uart线程
void my_uart_task(void *sdata)
{

	//用于判断信号量是否成功获取
	tls_os_status_t os_status  = TLS_OS_ERROR;
	//创建信号量,用于回调函数和线程之间通信
	tls_os_sem_create(&sem_rx, 0);
	//初始化串口
	my_uart_init();

	for(;;)
	{
		int io=1;
		
		os_status = tls_os_sem_acquire(sem_rx, 20);
		    //若发生错误,即在20个周期内未收到sem_rx信号
			//这将表示这个串口在20个时钟周期内没有收到数据
		if(os_status)
		{
		
			if(rx_length > 0)
			{
				
				
				printf("\n0长度:%d\n",strlen(rx_buf));
				rx_len = tls_uart_read(TLS_UART_0, rx_buf, rx_length);
				rx_length = 0;
				
				printf("\n长度:%d\n",strlen(rx_buf));
				printf(rx_buf[4]);
				printf("\n");
				printf(rx_buf);
				printf("\n");
				printf(rx_buf[5]);
				printf("\nstr长度:%d\n",strlen(str));
	
	
                // 控制台输出
				tls_uart_write(TLS_UART_0,rx_buf , rx_len);
				
				char dest[6]={0};
				memcpy(dest, rx_buf,strlen(rx_buf)-2);
				
				
				printf("dest长度:%d\n",strlen(dest));
				printf(dest[4]);
				printf("\ndest:%s\n",dest);
				
				
				if (strncmp(rx_buf, str1,4)==0) {
					
					io=0;
					tls_gpio_cfg(WM_IO_PB_25,WM_GPIO_DIR_OUTPUT,WM_GPIO_ATTR_PULLLOW);
					tls_gpio_write(WM_IO_PB_25,0);
	
				}	else if (strncmp(rx_buf, str2,5)==0) {
					tls_gpio_cfg(WM_IO_PB_25,WM_GPIO_DIR_OUTPUT,WM_GPIO_ATTR_PULLLOW);
					tls_gpio_write(WM_IO_PB_25,1);
				} else {
					tls_gpio_cfg(WM_IO_PB_11,WM_GPIO_DIR_OUTPUT,WM_GPIO_ATTR_PULLLOW);
					tls_gpio_write(WM_IO_PB_11,0);
				}
				rx_buf[0]=0;				
	}
}

//创建uart线程
void create_my_uart_task(void)
{
	tls_os_task_create(NULL, NULL,
				   my_uart_task,
				   NULL,
				   (void *)uart_task_stk,          /* task's stack start address */
				   UART_TASK_SIZE * sizeof(u32), /* task's stack size, unit:byte */
				   32,
				   0);
	
}
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  k5GskpyrCqoj   2023年11月13日   34   0   0 单片机sdcc编译器