BLE 协议栈 之串口收发

这篇博客探讨了如何使用BLE协议栈优化串口收发,避免数据延迟问题。通过NPI.c中的函数调用和NPI_InitTransport配置,可以在UART 0 (alt.2)上实现高效串口通信。串口接收回调函数NpiSerialCallback作为中断处理,BLE协议将中断转换为事件处理方式。同时,介绍了如何处理HAL_UART_RX_full等中断事件,并展示了添加LCD显示的初步步骤。

     曾经曾经的一篇关于串口收发的博客,是直接使用串口中断收发的,虽然这样实现了收发功能,但是对于大量数据传送的时候,就会出现数据收发不及时的情况,无意间发现了一种更为简单的方式,十分方便快捷~

      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

 

 


 

 


 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值