#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);
}