STM32串口收发数据方式总结

STM32串口收发数据方式总结


2021-5-3更新

重新梳理了一下,并用代码一一实现:(HAL库)

大致三种方式:阻塞、中断、DMA

		//-----串口收发方式测试------------------------------------------------------------------------------------------------------------------

		
		//1、阻塞模式:HAL_UART_Transmit、HAL_UART_Receive
		//(1)阻塞发送--函数体中完成发送过程
		HAL_UART_Transmit(&huart2, usart2_data_buffer, sizeof(usart2_data_buffer), 1000);
		//(1)阻塞接收--函数体中完成接收过程,要么收到指定长度的数据,要么超时--没有开启中断标志位,不涉及中断
		HAL_UART_Receive(&huart2, usart2_data_buffer, 10, 10000);
		
		//2、中断模式:HAL_UART_Transmit_IT、HAL_UART_Receive_IT
		//使用中断,要在开启中断的同时,设定中断标志位,不然程序也不知道什么情况下中断噻
		//个人感觉中断发送用的不是太多,毕竟发送的数据是知道的,直接用阻塞的方式发送就行了。可能一些对实时性要求比较高的地方比较好用吧
		//中断接收用的还是比较多的,因为不知道从机会发来什么数据,什么时候发,什么时候发完一次
		//(1)中断发送--使用标志位:TXE:发送数据寄存器空--__HAL_UART_ENABLE_IT(huart, UART_IT_TXE);
		HAL_UART_Transmit_IT(&huart2, usart2_data_buffer, sizeof(usart2_data_buffer));
		//(1)中断接收--使用标志位:RXNE:读数据寄存器非空--__HAL_UART_ENABLE_IT(huart, UART_IT_RXNE);
		HAL_UART_Receive_IT(&huart2, usart2_data_buffer, 10);
				
		//(2)中断接收--使用标志位:RXNE:读数据寄存器非空 + IDLE:监测到总线空闲
		//加了个检测空闲中断,IDLE就是串口收到一帧数据后,发生的中断。可以有效的解决“从机什么时候发完一次”的问题
		//一帧数据即一次性发来的数据,数据间的时间间隔小于某个值(具体多少不太清楚,但是平时串口收发两次中间间隔肯定大于这个值)
		//参考链接:http://bbs.21ic.com/icview-1594484-1-2.html?_dsign=0b20e05f
		//在需要的地方开启这两个标志位中断,然后直接在中断服务函数中判断就行了,开启一次就行了,不用放在循环里	
		__HAL_UART_ENABLE_IT(&huart2, UART_IT_RXNE);
		__HAL_UART_ENABLE_IT(&huart2, UART_IT_IDLE);
	
		//3、DMA模式:HAL_UART_Transmit_DMA、HAL_UART_Receive_DMA
		//DMA,直接内存访问,第一次在32程序中用到,原理就是跳过cpu直接进行内存访问
		//32实现方式和很简单,指定源地址和目的地址,地址增量这三个必要的参数,其他的就是一些中断位等等,开启DMA就可以传输了
		//像配置串口那样配置一下DMA通道时钟,选择通道优先级,并开启中断(因为HAL_UART_Transmit_DMA用到了中断)
		//(1)DMA发送--使用起来就像中断一样,发了之后就不用管了,主程序该干嘛干嘛,DMA自己就操作了
		HAL_UART_Transmit_DMA(&huart2, usart2_data_buffer, sizeof(usart2_data_buffer));
		//(1)DMA接收--比较省心,还节约cpu资源
		HAL_UART_Receive_DMA(&huart2, usart2_data_buffer, 10);


		//-----串口收发方式测试------------------------------------------------------------------------------------------------------------------

并重新梳理了一下中断模式下数据接收处理流程

 

 

 


2019-11-07

最近做项目发现自己的32串口使用学的太烂了(只是懂了串口的实现原理,但是使用上-空白),就有集中学习了一下串口接收数据的方式:在ProcessOn上整理了思维导图分享如下:(主要整理接受不定长数据的方法,目前整理了两种方法,DMA的以后有空再整理)

附图片:


  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值