赞
踩
目录
前面的文章介绍了用串口的接收中断来接收数据,本文介绍通过串口从MCU向外发送数据。
文章依赖的硬件及工程配置同本文作者的其他文章:细说ARM MCU的串口接收数据的实现过程-CSDN博客 https://wenchm.blog.csdn.net/article/details/139541112
设计目的: 如果收到0x10,则MCU送出字符串:Everything is OK;如果收到的数据不是0x10,则MCU送出字符串:Received Error Data。
在HAL固件库中,常用的串口发送数据函数有以下两个:
- HAL_UART_Transmit(*huart,pData,Size,Timeout)
- HAL_UART_Transmit_IT(*huart,pData,Size)
首先在main函数前定义两个放置MCU要发送的字符的数组,可以与前面定义的RxBuffer放到相同的注释对中:
- /* USER CODE BEGIN PV */
- uint8_t CommOkMessage[]="Everything is OK\r\n";
- uint8_t CommErrMessage[]="Received ErrorData\r\n";
- uint8_t CommFlag =0;
- uint8_t RxBuffer[RXBUFFERSIZE]={0};
- /* USER CODE END PV */
定义了一个用作标志的CommFlag变量。字符串后的\r和\n称为转义字符,分别指回车和换行。所谓换行,实际就是将光标转移到下一行的起始处。
发送CommOkMessage字符串可以用如下语句:
HAL_UART_Transmit(&huart2,CommOkMessage,19,1000);
参数中的“19”是指CommOkMessage字符串共有19个字符(加上回车、换行符以及字符串结束符),“1000”是指超时时间。
在while(1)循环中编写代码实现:如果接收到的是0x10,则发送字符串CommOkMessage;如果接收到的不是0x10,则发送字符串CommErrMessage。为了避免MCU一直往外送数据,利用标志变量CommFlag进行控制。
- while(1)
- {
- /* USER CODE BEGIN 3 */
- if((RxBuffer[0] == 0x10) && (CommFlag == 1))
- {
- CommFlag =0;
- HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_SET);
- HAL_UART_Transmit(&huart2,CommOkMessage,19,1000);
- }
- else if((RxBuffer[0] != 0x10) && (CommFlag == 1))
- {
- CommFlag = 0;
- HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_RESET);
- HAL_UART_Transmit(&huart2,CommErrMessage,22,1000);
- }
- }
- /*USER CODE END 3 */
串口中断收到数据之后,把标志变量CommFlag的置位。可以在回调函数中将CommFlag置位:
- void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
- {
- CommFlag = 1;
- HAL_UART_Receive_IT(&huart2,(uint8_t *)RxBuffer,RXBUFFERSIZE);
- }
下载、在串口助手中发送0x20,3次,收到3次错误提示;修改发送的数据为0x10,发送3次,收到3次数据正确提示。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。