在微处理器和外部通信模块之间主要有并行通信和串行通信两种。并行通讯传输速率快,但是占用引脚较多,串行通信与之相反。串行通讯分别有单工、半双工、全双工三种模式。
单工:只能发送数据或者只能接收数据。
半双工:既可以发送又可以接收,但是某一时刻只能处于单一模式(发送或者接收),例如RS485通讯方式。
全双工:任意时刻都可以发送或者接收数据。(串口采用异步串行通信)
直接在红框内输入下方数值,回车确定即可自动对时钟树进行配置。
阻塞式发送函数:数据发完程序才能继续运行(推荐初学者使用)
HAL_UART_Transmit(UART_HandleTypeDef *huart,
uint8_t *pData,
uint16_t Size,
uint32_t Timeout
)
示例程序如下所示:
uint8_t buf[] = "123";
HAL_UART_Transmit(&huart1,buf,sizeof(buf),100);
非阻塞式发送函数:数据发完程序才能继续运行(串口中断)
HAL_UART_Transmit_IT(UART_HandleTypeDef *huart,
uint8_t *pData,
uint16_t Size
)
发送完会进入如下回调函数。
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
/* Prevent unused argument(s) compilation warning */
UNUSED(huart);
/* NOTE: This function should not be modified, when the callback is needed,
the HAL_UART_TxCpltCallback could be implemented in the user file
*/
}
通过重映射可以进行printf数据的发送,需要在函数中加入重映射程序,代码如下所示。
#include "stdio.h"
int fputc(int ch, FILE *f)
{
uint8_t temp[1] = {ch};
HAL_UART_Transmit(&huart1, temp, 1, 2);
//HAL_UART_Transmit(&huart2, temp, 1, 2);
return ch;
}
阻塞式接收函数:数据接收完程序才能继续运行
HAL_UART_Receive(UART_HandleTypeDef *huart,
uint8_t *pData,
uint16_t Size,
uint32_t Timeout
)
非阻塞式接收函数:数据发完程序才能继续运行(推荐使用)
HAL_UART_Receive_IT(UART_HandleTypeDef *huart,
uint8_t *pData,
uint16_t Size
)
接收完成完会进入如下回调函数。
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
/* Prevent unused argument(s) compilation warning */
UNUSED(huart);
/* NOTE: This function should not be modified, when the callback is needed,
the HAL_UART_RxCpltCallback could be implemented in the user file
*/
}
示例程序如下所示。
/* USER CODE BEGIN PTD */
//在主函数上方
uint8_t buf[] = "123";
char revebuf;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART2){
HAL_UART_Transmit(&huart2,buf,sizeof(buf),100);
}
}
/* USER CODE END PTD */
while (1)
{
HAL_UART_Receive_IT(&huart1,(uint8_t *)&revebuf,sizeof(revebuf));
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
串口助手接收结果如下所示。
以上如有错误恳请各位大佬指正。