HAL提供了完善的串口驱动API,其定义在hal_uart.h和hal_uart.c中,如下图所示。
串口配置
使用串口前,需要首先配置一下串口。为此,笔者编写了一个串口配置函数zclSampleSw_Init,只需要在应用层初始化函数zclSampleSw_Init中调用一下即可完成串口配置,如下图所示。
打开配套的工程代码,在zcl_samplesw.c文件的末尾可以找到zclSampleSw_InitUart函数的定义,代码如下:
1.static void zclSampleSw_InitUart(void)
2.{
3. halUARTCfg_t uartConfig;
4. /* UART Configuration */
5. uartConfig.configured = TRUE;//允许配置
6. uartConfig.baudRate = HAL_UART_BR_115200;//波特率
7. uartConfig.flowControl = FALSE;//关闭硬件流控
8. uartConfig.flowControlThreshold= 0;//和流控相关
9. uartConfig.rx.maxBufSize = ZCLSAMPLESW_UART_BUF_LEN;//接收缓冲区大小
10. uartConfig.tx.maxBufSize = 0;//发送缓冲区大小
11. uartConfig.idleTimeout = 6;//默认超时时间
12. uartConfig.intEnable = TRUE;// 使能中断
13. uartConfig.callBackFunc = zclSampleSw_UartCB;//设置回调函数
14. /* Start UART */
15. HalUARTOpen(HAL_UART_PORT_0, &uartConfig);// 根据配置打开串口0
16.}
下面详细讲解一下上述代码。
- uartConfig.rx.maxBufSize = ZCLSAMPLESW_UART_BUF_LEN的作用是设置串口0接收缓冲区的大小,宏ZCLSAMPLESW_UART_BUF_LEN是由笔者在zcl_samplesw.c文件中定义的,定义如下:
#define ZCLSAMPLESW_UART_BUF_LEN 128
- uartConfig.tx.maxBufSize = 0的作用是配置发送缓冲区的大小,我们不需要发送缓冲区,所以设置长度为0。
- HalUARTOpen(HAL_UART_PORT_0, &uartConfig)的作用是根据配置打开串口0,HalUARTOpen是HAL提供的API。
- uartConfig.callBackFunc = zclSampleSw_UartCB的作用是设置一个回调函数。
接收串口数据
当串口接收到数据时,就会调用回调函数zclSampleSw_UartCB。开发者可以在此函数中接收并处理串口数据。在zcl_samplesw.c文件的末尾可以找到回调函数zclSampleSw_UartCB的定义,代码如下:
/**
* @fn zclSampleSw_UartCB
*
* @brief Uart Callback
*/
static void zclSampleSw_UartCB(uint8 port, uint8 event)
{
//获取当前串口接收缓冲区有多少字节的数据
uint8 rxLen = Hal_UART_RxBufLen(HAL_UART_PORT_0);
if(rxLen != 0)//如果字节数数量不等于0
{
//从串口缓冲区中读取数据
HalUARTRead(HAL_UART_PORT_0, zclSampleSw_UartBuf, rxLen);
//通过串口发送数据,例如把数据发送到串口助手
HalUARTWrite(HAL_UART_PORT_0, zclSampleSw_UartBuf, rxLen);
}
}
上述代码调用了专门用于操作串口的API,说明如下:
Hal_UART_RxBufLen :查看当前串口接收缓冲区有多少字节的数据。
HalUARTRead :从串口缓冲区中读取数据。
HalUARTWrite :通过串口发送数据,比如发送到串口助手。
启用串口的宏定义
在使用串口功能时,需要启用串口对应的宏定义HAL_UART。在下图中的Defined sybols中输入以下代码。
HAL_UART=TRUE
INT_HEAP_LEN=2048
INT_HEAP_LEN
HEAP是堆的意思,堆是一块内存空间。当程序动态地申请了一小块内存空间后,这一小块内存空间就来自于堆。工程默认的堆大小是3071个字节。定义宏INT_HEAP_LEN=2048后,堆的大小减少到2048个字节。之所以减少堆的大小,是因为串口通信功能会使用较多的栈内存空间,栈内存空间可能会不够用。
调试仿真
可以按照以下步骤进行调试仿真:
- 编译工程后,使用仿真下载器把程序烧录到开发板中
- 断开仿真下载器,使用Micro USB线把开发板连接到电脑
- 打开串口助手,通过串口助手发送字符串到开发板中
- 开发板接收到该字符串后会把此字符串发回到串口助手,如下图所示。