一.stm32使用hal库串口接收发送测试

本文详细介绍了STM32使用HAL库进行串口通信的三种模式:查询模式、中断模式和DMA模式,并重点讲解了各种模式下的发送和接收函数,包括HAL_UART_Transmit、HAL_UART_Receive、HAL_UART_Transmit_IT、HAL_UART_Receive_IT及DMA模式的函数。同时,提到了串口中断回调函数的使用,并提供了主函数循环体的示例。
摘要由CSDN通过智能技术生成

一.hal库串口接收发送测试

1、串口的模式有3种,一是查询模式,二是中断模式,三是DMA模式

HAL_UART_Transmit();串口轮询模式发送,使用超时管理机制
HAL_UART_Receive();串口轮询模式接收,使用超时管理机制
HAL_UART_Transmit_IT();串口中断模式发送
HAL_UART_Receive_IT();串口中断模式接收
HAL_UART_Transmit_DMA();串口DMA模式发送
HAL_UART_Transmit_DMA();串口DMA模式接收

2、阻塞传输是调用这个函数并在等待时间内一直等待操作完成。
HAL_UART_Transmit
HAL_UART_Receive
查询的方式一般少用,这里不做过多介绍。
3、串口中断
串口中断函数
HAL_UART_TxHalfCpltCallback();一半数据发送完成时调用
HAL_UART_TxCpltCallback();数据完全发送完成后调用
HAL_UART_RxHalfCpltCallback();一半数据接收完成时调用
HAL_UART_RxCpltCallback();数据完全接受完成后调用
HAL_UART_ErrorCallback();传输出现错误时调用

.在串口中定义相关变量
#define size_max 255
typedef struct uart_date_type
{
 uint8_t Rx_date;//接收中断数据变量
 uint8_t Uart_RxBuffer[size_max];//接收数据缓存区
 uint8_t Uart_RX_Cnt;//接收中断计数
 uint8_t Tx_to_RX_Buffer[size_max];//数据提取缓存区
 uint8_t Flags;//提取数据标致
 uint8_t Recv_end_flag;//结束标志
 uint16_t remb_len;//记录实际数据长度
}UART_TP_DATE;
extern UART_TP_DATE U1D;




在main的主循环外开启中断
	HAL_UART_Receive_IT(&huart1,&U1D.Rx_date,1);//开启接收中断

串口接收回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{

	if(size_max<U1D.Uart_RX_Cnt)  //溢出判断
  	{
     	U1D.Uart_RX_Cnt = 0;
		memset(U1D.Uart_RxBuffer,0,sizeof(U1D.Uart_RxBuffer));//清空缓存,记得#include "string.h"
		printf("uart1 buffer full\r\n");
  	}
 	else
 	{
		U1D.Uart_RxBuffer[U1D.Uart_RX_Cnt++] = U1D.Rx_date;   //接收数据转存
		if((U1D.Uart_RxBuffer[U1D.Uart_RX_Cnt-1] == 0x0A)&&	(U1D.Uart_RxBuffer[U1D.Uart_RX_Cnt-2] == 0x0D)) //判断结束位
   		 {
			//将收到的信息发送出去
	    	 U1D.Recv_end_flag = 1; // 接受完成标志位置1
			   if(U1D.Recv_end_flag == 1)  //接收完成标志
		      { 
					memcpy(U1D.Tx_to_RX_Buffer,U1D.Uart_RxBuffer,U1D.Uart_RX_Cnt);	
		       	 	U1D.Flags=U1D.Uart_RX_Cnt;
		       		U1D.Recv_end_flag = 0;//清除接收结束标志位
		      		U1D.remb_len=U1D.Uart_RX_Cnt+1;
				  	U1D.Uart_RX_Cnt = 0;
					memset(U1D.Uart_RxBuffer,0x00,sizeof(U1D.Uart_RxBuffer)); //清空数组
				}
		}
	}
  
	HAL_UART_Receive_IT(&huart1,&U1D.Rx_date,1);
}

//到这里中断方式的串口接收的数据已存入缓存中完成。
//提取缓存中的数据,传入的数组长度需要大于等于串口的缓存长度
uint8_t get_date(uint8_t *BUF)
{
	if(U1D.Flags)
	{
		memcpy(BUF,U1D.Tx_to_RX_Buffer,U1D.remb_len);	
	  	memset(U1D.Tx_to_RX_Buffer,0,U1D.remb_len);
	  	U1D.Flags=0;
		return 1;
	}
	return 0;
}.重定向问题
函数版:
/*
  * 函数功能: 重定向c库函数printf到DEBUG_USARTx
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明:无
*/

int fputc(int ch, FILE *f)
{
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
  return ch;
}
/*
  * 函数功能: 重定向c库函数getchar,scanf到DEBUG_USARTx 
  * 在串口上输入时,最后需要加空格,才能被存储
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明:无 
 */
int fgetc(FILE *f)
{
  uint8_t ch = 0;
  HAL_UART_Receive(&huart1, &ch, 1, 0xffff);
  return ch;
}

寄存器版:
/*重定向Printf函数*/  
int fputc(int ch,FILE *f)  
{  
    return (SendChar(ch));  
}  
/*重定向Scanf函数*/  
int fgetc(FILE *f)  
{  
   return (SendChar(GetKey()));  
    /*调用scanf()在串口中输入数据时,必须以空格结束,否则无法完成发送*/  
}
int SendChar(int ch)  
{  
    while(!(USART1->SR & USART_FLAG_TXE));  
    USART1->DR = (ch & 0x1FF);  
    return ch;  
}  
int GetKey(void)  
{  
    while(!(USART1->SR & USART_FLAG_RXNE));  
    return ((int)(USART1->DR & 0X1FF));  
}  

主函数的循环体演示:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
实测代码:https://download.csdn.net/download/weixin_44386927/13772536

  • 2
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32使用HAL库实现串口通讯的理论讲解可以简要概括如下: 首先,需要明确的是HAL库是什么,它是ST公司官方提供的用于简化STM32芯片开发的一套库函数集合。它封装了底层的硬件操作,提供了一些高级的API函数,使得开发者能够更方便地进行硬件编程。 在STM32中实现串口通讯,主要涉及到以下几个方面的内容: 1. 引入HAL库:在工程中引入HAL库文件,可以通过下载ST官方提供的开发包得到。引入HAL库后,就可以在代码中使用HAL库提供的函数。 2. 初始化串口:调用HAL库提供的函数,进行串口的初始化设置。包括设置波特率、数据位、停止位、校验位等等。 3. 串口发送数据:通过HAL库提供的发送函数,将要发送的数据写入串口发送缓冲区,然后等待数据发送完成。 4. 串口接收数据:通过HAL库提供的接收函数,可以判断是否接收到了新的数据,若有新的数据到达,则可以通过读取接收缓冲区的方式获取到数据。 5. 中断处理:为了提高串口通讯的效率,一般会使用中断来处理串口接收数据。在中断中,可以读取接收缓冲区的数据,并进行相应的处理。 总结一下,实现STM32串口通讯主要是通过引入HAL库,进行初始化设置,然后使用库函数发送和接收数据。另外,还可以采用中断的方式处理接收数据。这样就可以实现STM32与其他设备之间的串口通讯。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值