全局变量任务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
如果想要自己更改参数,可以去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显示的内容,串口也做相应的输出。
实现结果: