国产BLE芯片横空出世盘它势在必行-串口通讯应用

发布一下 0 0

串口通讯应用目标:

串口波特率: 115200b/s

串口接收缓存:256 Byte

串口发送缓存:256 Byte

串口助手发送一帧数据,同时串口助手接收返回数据:

发送长度250B,返回250B

发送长度260B,返回4B,说明接收缓存只有256 B

国产BLE芯片横空出世盘它势在必行-串口通讯应用

图1 发送长度250

国产BLE芯片横空出世盘它势在必行-串口通讯应用

图2发送长度260

代码实战

开发该串口通信模块,只需3个步骤、3部分代码,按照此方法快速上手,此方法好处是串口接收数据不丢数据,接收一整数据帧后再做数据处理,非常适合做交互式通信接口,用户可以直接拷贝代码,放在系统对应位置中即可,这都是笔者发大量时间测试通过的代码,为你节省开发时间。

一、串口初始化配置

system_set_port_pull(GPIO_PA0, GPIO_PULL_UP, true);

system_set_port_mux(GPIO_PORT_A, GPIO_BIT_0, PORTA0_FUNC_UART0_RXD);

system_set_port_mux(GPIO_PORT_A, GPIO_BIT_1, PORTA1_FUNC_UART0_TXD);

uart_init(UART0, 1152);

fr_uart_enableIrq(UART0, Uart_irq_erbfi);

NVIC_EnableIRQ(UART0_IRQn);

二、串口中断处理

void uart0_IRQHandler(void)

{

uint8_t data;

switch (__UART_INT_GET_ID(Uart0))

{

case INT_INDEX_TXE:

{

/* Tx empty interrupt and fifo disable */

Uart0->IER_DLH.IER.PTIME = 0;

Uart0->IER_DLH.IER.ETBEI = 0;

//co_printf("---->INT_INDEX_TXE\r\n");

}

break;

case INT_INDEX_RX:

case INT_INDEX_RX_TOUT:

{

/* Rx ready */

//rx fifo at least have one data

/*while (Uart0->LSR.LSR_BIT.DR)

{

data = Uart0->DATA_DLL.DATA;

//uart_fifo_data_rx(data);

uart_putc_noint_no_wait(UART0, data);

}

*/

while (Uart0->LSR.LSR_BIT.DR)

{

data = Uart0->DATA_DLL.DATA;

//uart_putc_noint_no_wait(UART0, data);

stTxUartBuf.txBuf[stTxUartBuf.size] = data;

stTxUartBuf.size ++;

if (stTxUartBuf.size >= uartRxBufferMAX)

{

stTxUartBuf.size = 0;

}

}

App_uartTimeoutTaskStart();

}break;

case INT_INDEX_LINE:

{

volatile uint32_t line_status = Uart0->LSR.LSR_DWORD;

//co_printf("---->INT_INDEX_LINE [%x]\r\n",line_status);

}break;

default:

break;

}

}

__attribute__((section("ram_code"))) void uart0_isr(void)

{

uart0_IRQHandler();

}

三、串口接收收发接口

/*

* 功能: handle_UartRxHandle

*

* 注解: 串口接收一帧数据处理

*

* 输入: dat:缓存 len:长度

* 输出: 无

*

*/

static void handle_UartRxHandle(uint8_t *dat,uint32_t len)

{

//co_printf("len:%d\r\n",len);

uart_send_len(dat,len);

//UART_to_AT_CMD(dat,len);

}

/*

* 功能: App_uartProcess

*

* 注解: 串口接收一帧数据处理

*

* 输入: 无

* 输出: 无

*

*/

static void App_uartProcess(void *param)

{

handle_UartRxHandle(stTxUartBuf.txBuf,stTxUartBuf.size);

stTxUartBuf.size = 0;

}

/*

* 功能: App_uartHandlerInit

*

* 注解: 串口接收应用初始化

*

* 输入: 无

* 输出: 无

*

*/

static void App_uartHandlerInit(void)

{

os_timer_init(&uart_process_timer, App_uartProcess, NULL);

}

/*

* 功能: App_uartTimeoutTaskStart

*

* 注解: 开始接收并等待串行数据超时

*

* 输入: 无

* 输出: 无

*

*/

void App_uartTimeoutTaskStart(void)

{

os_timer_start(&uart_process_timer, 20, false); //start 10ms anti-shake timer

}

版权声明:内容来源于互联网和用户投稿 如有侵权请联系删除

本文地址:http://0561fc.cn/121659.html