曾经曾经的一篇关于串口收发的博客,是直接使用串口中断收发的,虽然这样实现了收发功能,但是对于大量数据传送的时候,就会出现数据收发不及时的情况,无意间发现了一种更为简单的方式,十分方便快捷~
BLE协议栈中对于串口收发已经封装的很彻底了,主要的函数都在NPI.c 实现了,只要调用就可以了。当然串口的配置是在NPI_InitTransport函数中,改变相应的配置是在NPI.h中。
硬件原因,所以串口使用的是uart 0 (alt.2) 收发引脚在P1.4 和P1.5 上,所以初始化的时候需要进行一些修改。
宏定义:
HAL_UART=TRUE
去掉电源管理定义 :xPOWER_SAVING
在SimpleBLECentral_Init中进行初始化:
/************* uart init ************************************/
NPI_InitTransport(NpiSerialCallback);
PERCFG = 0x01; //位置1 P1口
P1SEL = 0x30; //P1_4,P1_5用作串口(外部设备功能)
U0CSR |= 0x80; //设置为UART方式
NPI_WriteTransport("Hello World\n",12);
/**************************************************************/
如果只需要发送功能可以将NpiSerialCallback改成NULL
NpiSerialCallback是串口接收回调函数 在NPI_InitTransport调用 简单的可以看做中断处理函数就可以了,顺便说一句,BLE将以前左右的中断函数变成了event事件,处理中断时,只要做出相应事件判断,然后清除事件触发标志,再处理就行了。
回调函数,将接收的字节,再发送出去!
/*********************** uart call back **********************************************/
static void NpiSerialCallback( uint8 port, uint8 events )
{
(void)port;
uint8 numBytes = 0;
uint8 buf[128];
if (events & HAL_UART_RX_TIMEOUT) //串口有数据
{
numBytes = NPI_RxBufLen(); //读出串口缓冲区有多少字节
if(numBytes)
{
//从串口缓冲区读出numBytes字节数据
NPI_ReadTransport(buf,numBytes);
//把串口接收到的数据再打印出来
NPI_WriteTransport(buf,numBytes);
}
}
}
/**************************************************************************************/
接收中断触发事件:
/* UART Events */
#define HAL_UART_RX_FULL 0x01
#define HAL_UART_RX_ABOUT_FULL 0x02
#define HAL_UART_RX_TIMEOUT 0x04
#define HAL_UART_TX_FULL 0x08
#define HAL_UART_TX_EMPTY 0x10
添加LCD 显示:
添加宏定义:
LCD_TO_UART
在Hal_LCD.h 的HalLcdWriteString 函数中添加
#ifdef LCD_TO_UART
NPI_WriteTransport ( (uint8*)str,osal_strlen(str));
NPI_WriteTransport ("\n",1);
#endif
并添加头文件:
#ifdef LCD_TO_UART
#include "npi.h"
#endif
这篇博客探讨了如何使用BLE协议栈优化串口收发,避免数据延迟问题。通过NPI.c中的函数调用和NPI_InitTransport配置,可以在UART 0 (alt.2)上实现高效串口通信。串口接收回调函数NpiSerialCallback作为中断处理,BLE协议将中断转换为事件处理方式。同时,介绍了如何处理HAL_UART_RX_full等中断事件,并展示了添加LCD显示的初步步骤。
2万+

被折叠的 条评论
为什么被折叠?



