HAL提供了完善的串口驱动API,其定义在hal_uart.h和hal_uart.c中,如下图所示。
第6章:硬件适配层应用——串口 - 图1

串口配置

使用串口前,需要首先配置一下串口。为此,笔者编写了一个串口配置函数zclSampleSw_Init,只需要在应用层初始化函数zclSampleSw_Init中调用一下即可完成串口配置,如下图所示。
第6章:硬件适配层应用——串口 - 图2

打开配套的工程代码,在zcl_samplesw.c文件的末尾可以找到zclSampleSw_InitUart函数的定义,代码如下:

  1. 1.static void zclSampleSw_InitUart(void)
  2. 2.{
  3. 3. halUARTCfg_t uartConfig;
  4. 4. /* UART Configuration */
  5. 5. uartConfig.configured = TRUE;//允许配置
  6. 6. uartConfig.baudRate = HAL_UART_BR_115200;//波特率
  7. 7. uartConfig.flowControl = FALSE;//关闭硬件流控
  8. 8. uartConfig.flowControlThreshold= 0;//和流控相关
  9. 9. uartConfig.rx.maxBufSize = ZCLSAMPLESW_UART_BUF_LEN;//接收缓冲区大小
  10. 10. uartConfig.tx.maxBufSize = 0;//发送缓冲区大小
  11. 11. uartConfig.idleTimeout = 6;//默认超时时间
  12. 12. uartConfig.intEnable = TRUE;// 使能中断
  13. 13. uartConfig.callBackFunc = zclSampleSw_UartCB;//设置回调函数
  14. 14. /* Start UART */
  15. 15. HalUARTOpen(HAL_UART_PORT_0, &uartConfig);// 根据配置打开串口0
  16. 16.}

下面详细讲解一下上述代码。

  • uartConfig.rx.maxBufSize = ZCLSAMPLESW_UART_BUF_LEN的作用是设置串口0接收缓冲区的大小,宏ZCLSAMPLESW_UART_BUF_LEN是由笔者在zcl_samplesw.c文件中定义的,定义如下:
  1. #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的定义,代码如下:
  1. /**
  2. * @fn zclSampleSw_UartCB
  3. *
  4. * @brief Uart Callback
  5. */
  6. static void zclSampleSw_UartCB(uint8 port, uint8 event)
  7. {
  8. //获取当前串口接收缓冲区有多少字节的数据
  9. uint8 rxLen = Hal_UART_RxBufLen(HAL_UART_PORT_0);
  10. if(rxLen != 0)//如果字节数数量不等于0
  11. {
  12. //从串口缓冲区中读取数据
  13. HalUARTRead(HAL_UART_PORT_0, zclSampleSw_UartBuf, rxLen);
  14. //通过串口发送数据,例如把数据发送到串口助手
  15. HalUARTWrite(HAL_UART_PORT_0, zclSampleSw_UartBuf, rxLen);
  16. }
  17. }

上述代码调用了专门用于操作串口的API,说明如下:

  1. Hal_UART_RxBufLen :查看当前串口接收缓冲区有多少字节的数据。
  2. HalUARTRead :从串口缓冲区中读取数据。
  3. HalUARTWrite :通过串口发送数据,比如发送到串口助手。

启用串口的宏定义

在使用串口功能时,需要启用串口对应的宏定义HAL_UART。在下图中的Defined sybols中输入以下代码。

  1. HAL_UART=TRUE
  2. INT_HEAP_LEN=2048

第6章:硬件适配层应用——串口 - 图3

INT_HEAP_LEN

HEAP是堆的意思,堆是一块内存空间。当程序动态地申请了一小块内存空间后,这一小块内存空间就来自于堆。工程默认的堆大小是3071个字节。定义宏INT_HEAP_LEN=2048后,堆的大小减少到2048个字节。之所以减少堆的大小,是因为串口通信功能会使用较多的栈内存空间,栈内存空间可能会不够用。

调试仿真

可以按照以下步骤进行调试仿真:

  • 编译工程后,使用仿真下载器把程序烧录到开发板中
  • 断开仿真下载器,使用Micro USB线把开发板连接到电脑
  • 打开串口助手,通过串口助手发送字符串到开发板中
  • 开发板接收到该字符串后会把此字符串发回到串口助手,如下图所示。
    第6章:硬件适配层应用——串口 - 图4