CC2541板,蓝牙4.0BLE协议栈串口收发实现




全局变量任务ID声明和串口回调函数声明
/*********************************************************************
 * LOCAL VARIABLES
 */
static uint8 SimpleBLETest_TaskID;   // Task ID for internal task/event processing
/*********************************************************************
 * PUBLIC FUNCTIONS
 */
static void NpiSerialCallback( uint8 port, uint8 events );   //声明串口回调函数

初始化函数,调用了几个串口函数,其实这几个串口函数基本上满足需要了,如果想要自己输出各式各样的内容,自定义函数,函数里面按照想要输出的格式调用以下几个函数就能实现,包括LCD显示屏函数也是,看明白几个初级的函数,就可以调用这些函数来实现自己想要的输出或者显示函数。

void SimpleBLETest_Init( uint8 task_id )
{  
  SimpleBLETest_TaskID = task_id;   //保存任务id到全局变量      

  NPI_InitTransport(NpiSerialCallback);  // 串口初始化 波特率默认是115200, 形参是回调函数
  NPI_WriteTransport("SimpleBLETest_Init\r\n", 20); // 按长度输出字符串
  NPI_PrintString("SimpleBLETest_Init2\r\n");      // 按字符串输出
  NPI_PrintValue("十进制输出168 = ", 168, 10);  // 可以输出一个值,用10进制表示
  NPI_PrintString("\r\n");  
  NPI_PrintValue("十六进制输出168 = 0x",168, 16);  // 可以输出一个值,用16进制表示
  NPI_PrintString("\r\n");  


  HalLcdWriteString ( "SimpleBLETest USART", HAL_LCD_LINE_1);
  // Setup a delayed profile startup  
  osal_set_event( SimpleBLETest_TaskID, SBP_START_DEVICE_EVT );
}



// 串口回调函数
static void NpiSerialCallback( uint8 port, uint8 events )
{
    (void)port;          // 避免编译告警


    if (events & (HAL_UART_RX_TIMEOUT | HAL_UART_RX_FULL))   //串口有数据
    {
        uint8 numBytes = 0;
        numBytes = NPI_RxBufLen();    //读出串口缓冲区有多少字节
        
        if(numBytes == 0)
        {
            return;
        }
        else
        { 
            uint8 *buffer = osal_mem_alloc(numBytes);  //申请缓冲区buffer
            if(buffer)
            {
                NPI_ReadTransport(buffer,numBytes);   //读取读取串口缓冲区数据,释放串口数据  
                NPI_WriteTransport(buffer, numBytes); //把收到的数据发送到串口-实现回环 
                osal_mem_free(buffer);                //释放申请的缓冲区
            }
        }
    }

}

注意:这个地方吧串口接收的数据立即发送出去了,如果你想要把串口输出的数据拿走使用,你把那个缓存定义成全局变量,就可以了,但是注意缓存的释放时间,不然可能会导致错误。

extern void   NPI_InitTransport( npiCBack_t npiCBack );这个初始化函数的参数是默认的,在npi.h中有定义:

/* UART port */
#if !defined NPI_UART_PORT
#if ((defined HAL_UART_SPI) && (HAL_UART_SPI != 0))
#define NPI_UART_PORT                  HAL_UART_PORT_1
#else
#define NPI_UART_PORT                  HAL_UART_PORT_0
#endif
#endif


#if !defined( NPI_UART_FC )
#define NPI_UART_FC                    FALSE//TRUE
#endif // !NPI_UART_FC

#define NPI_UART_FC_THRESHOLD          48
#define NPI_UART_RX_BUF_SIZE           128
#define NPI_UART_TX_BUF_SIZE           128
#define NPI_UART_IDLE_TIMEOUT          6
#define NPI_UART_INT_ENABLE            TRUE


#if !defined( NPI_UART_BR )
#define NPI_UART_BR                    HAL_UART_BR_115200

#endif // !NPI_UART_BR

扫描二维码关注公众号,回复: 4713409 查看本文章

如果想要自己更改参数,可以去npi.h文件中修改宏,或者调用另外一个初始化函数:

extern void   NPI_InitTransportEx( npiCBack_t npiCBack, uint8 baudrate, uint8 parity, uint8 stopbit);

同时需要注意的是,npi.c和npi.h中的函数已经比较高级了,更底层一些的函数在hal_uart.h和hal_uart.c中,这里面才是真正的串口函数的底层函数。

后续补充:

在后面的程序学习中,又一次调试,串口所有的函数都正常,但是就是不能收发,后来发现是npi.h中一个宏定义的问题


本来是TRUE,修改成FALSE就可以了。这个宏定义的作用是流控,应该是数据流控制的意思,使用的时候不使能。

在宏定义中加上一些定义:


有一个有趣的发现就是,在加入HAL_TO_UART=TURE后,LCD显示的内容,串口也做相应的输出。

实现结果:




猜你喜欢

转载自blog.csdn.net/Mr_fdyong/article/details/80365016