目录
1、条件及工程配置
2、实现串口发送的库函数
3、修改whlie(1)中的代码
4、修改回调函数
5、下载运行
前面的文章介绍了用串口的接收中断来接收数据,本文介绍通过串口从MCU向外发送数据。
1、条件及工程配置
文章依赖的硬件及工程配置同本文作者的其他文章:细说ARM MCU的串口接收数据的实现过程-CSDN博客 https://wenchm.blog.csdn.net/article/details/139541112
设计目的: 如果收到0x10,则MCU送出字符串:Everything is OK;如果收到的数据不是0x10,则MCU送出字符串:Received Error Data。
2、实现串口发送的库函数
在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”是指超时时间。
3、修改whlie(1)中的代码
在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 */
4、修改回调函数
串口中断收到数据之后,把标志变量CommFlag的置位。可以在回调函数中将CommFlag置位:
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{CommFlag = 1;HAL_UART_Receive_IT(&huart2,(uint8_t *)RxBuffer,RXBUFFERSIZE);
}
5、下载运行
下载、在串口助手中发送0x20,3次,收到3次错误提示;修改发送的数据为0x10,发送3次,收到3次数据正确提示。