企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
* 导师视频讲解:[**去听课**](https://www.bilibili.com/video/BV1k34y1D7Vz/) >[success] **技术支持说明:** >**1**.一般以自主学习为主 > **2**.可到官方问答社区中提问:[**去提问**](https://bbs.csdn.net/forums/zigbee) > **3**.工程师**会尽快**解答社区问题,但他们是一线开发,【**难以保证**】解答时效,解答辛苦,感谢理解! <br/> HAL提供了完善的串口驱动API,其定义在hal\_uart.h和hal\_uart.c中,如下图所示。 ![](https://img.kancloud.cn/9c/0d/9c0d94a441fdbf8860f773089a96b309_322x784.png =200x) <br/> ## **串口配置** 使用串口前,需要首先配置一下串口。为此,笔者编写了一个串口配置函数zclSampleSw\_Init,只需要在应用层初始化函数zclSampleSw\_Init中调用一下即可完成串口配置,如下图所示。 ![](https://img.kancloud.cn/f1/cb/f1cb8db4ef33ec0395f215b14acc8ba4_638x186.png =600x) ### 打开配套的工程代码,在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的作用是设置一个回调函数。 <br/> ## **接收串口数据** 当串口接收到数据时,就会调用回调函数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 :通过串口发送数据,比如发送到串口助手。 ``` <br/> ## **启用串口的宏定义** 在使用串口功能时,需要启用串口对应的宏定义HAL\_UART。在下图中的Defined sybols中输入以下代码。 ``` HAL_UART=TRUE INT_HEAP_LEN=2048 ``` ![](https://img.kancloud.cn/9b/44/9b442dbffb7e436d90542b6b4fa819eb_830x792.png =600x) ### #### **INT\_HEAP\_LEN** HEAP是堆的意思,堆是一块内存空间。当程序动态地申请了一小块内存空间后,这一小块内存空间就来自于堆。工程默认的堆大小是3071个字节。定义宏INT_HEAP_LEN=2048后,堆的大小减少到2048个字节。之所以减少堆的大小,是因为串口通信功能会使用较多的栈内存空间,栈内存空间可能会不够用。 <br/> ## **调试仿真** 可以按照以下步骤进行调试仿真: * 编译工程后,使用仿真下载器把程序烧录到开发板中 * 断开仿真下载器,使用Micro USB线把开发板连接到电脑 * 打开串口助手,通过串口助手发送字符串到开发板中 * 开发板接收到该字符串后会把此字符串发回到串口助手,如下图所示。 ![](https://img.kancloud.cn/c7/a0/c7a039ed8a79c5d91b7084171c0c4d36_830x654.png =500x) <br/> <br/> ## **项目定制** * 如需项目定制开发,可扫码添加项目经理好友(注明“**项目定制**”) * 定制范围:**NB-IoT**、**CATn(4G)**、**WiFi**、**ZigBee**、**BLE Mesh**以及**STM32**、**嵌入式Linux**等IoT技术方案 * 善学坊官网:[www.sxf-iot.com](https://www.sxf-iot.com/) ![](https://img.kancloud.cn/ca/73/ca739f92cab220a3059378642e3bd502_430x430.png =200x) * 非项目定制**勿扰**,此处**非**技术支持