DMA可以直接传输数据,减少了CPU的负担,是个很好的功能,但是用的时候难免会一头雾水。这次做个小小的串口收发程序就碰到了许多问题。

之前没有注意,选择了DMA的circular模式,然后奇怪的事情发生了

很明显我这个HAL_UART_Transmit_DMA是写在while(1)外面的,但是串口调试的结果与我的预期刚刚好相反

当时我十分迷惑,因为我明明没有放进死循环里面,但是它还是持续刷屏

我认为它应该是只发送一次的,很明显,当时的我对于DMA完全不了解(现在也是)

后面想了一下觉得应该是DMA的模式的问题,就改成了Normal模式,输出就正常了,就输出了一次语句

在此之后,我又做了一些试验,以下是部分源码

#include "main.h"
#include "dma.h"
#include "usart.h"
#include "gpio.h"
#include <stdio.h>
#include <string.h> uint8_t str_Tx1[] = "Hello World! This is stm32F103RCT6!\r\n";
uint8_t str_Tx2[64];
uint8_t str_Rx1 = 0;
uint8_t str_Rx2[64]; void SystemClock_Config(void); int main(void)
{
HAL_Init(); SystemClock_Config(); MX_GPIO_Init();
MX_DMA_Init();
MX_UART4_Init(); HAL_UART_Transmit_DMA(&huart4,str_Tx1,sizeof(str_Tx1)); while (1)
{
HAL_UART_Receive(&huart4,&str_Rx1,1,1000); // 等待用户发送数据,1秒后无响应则执行后面的语句
HAL_UART_Transmit_DMA(&huart4,&str_Rx1,sizeof(str_Rx1)); // 发送用户所发送的数据
HAL_UART_Receive(&huart4,str_Rx2,64,1000); // 等待用户发送数据,1秒后无响应则执行后面的语句
HAL_UART_Transmit_DMA(&huart4,str_Rx2,sizeof(str_Rx2)); // 发送用户所发送的数据
}
}

打开串口之后如下图所示

与此同时我注意到了右下角的接收数据量还是在一直增加的

先加1,再加64(也就是我两个字符串的数据量)

然后我发送了一个9,应该是第一句接收到了

    HAL_UART_Receive(&huart4,&str_Rx1,1,1000);  // 等待用户发送数据,1秒后无响应则执行后面的语句

我再发送了一个Hello,应该是第二个字符串接收到了

    HAL_UART_Receive(&huart4,str_Rx2,64,1000);  // 等待用户发送数据,1秒后无响应则执行后面的语句

这时候如果我发送一个2,就会覆盖掉这个字符串的第一位

发送66,则会出现以下情况

也就是后面的发送数据写入字符串是覆盖写入,当写入量等于1的时候会覆盖第二个字符串的首位字符,当写入数量大于1的时候会写入第一个字符串,输入的第一个字符写入第一个字符串,其余的覆盖掉第二个字符串

鉴于我对于DMA的认识还是很浅,很多细节还是不甚了解,希望有大神不吝赐教,能在评论区指出我的过错,非常感谢!

最新文章

  1. JS学习笔记9之event事件及其他事件
  2. iOS 隐藏键盘的几种常见方法
  3. WebForm简单控件,复合控件
  4. UNIX:高级环境编程 - 第十五章 IPC:进程间通信
  5. Flex Array 与 ArrayCollection.转自网络
  6. 【转载】onclick与onCommand的区别
  7. 关于fputs和fgets的几个细节
  8. ios 调用js方法(ios监听js方法执行)
  9. transcode_step()在转码过程中对pts、dts、duration的处理
  10. Java版求1000以内的完全数
  11. 把MSSQL的表数据查询成 insert into格式的函数
  12. Git时光机穿梭之工作区和暂存区
  13. python写一个md5解密器
  14. java web 登录后更新JSESSIONID
  15. Excel技巧--巧用差异化插入空行
  16. Elasticsearch 2.3.3 JAVA api说明文档
  17. zabbix监控haproxy
  18. Openlayers 3计算长度和面积
  19. 使用Node.js完成路由
  20. (二分搜索)Can you solve this equation? -- hdu -- 2199

热门文章

  1. 对象头源码讲解,原来,指向objectMonitor的指针在这里
  2. spring学习三:Spring的Aop、代理
  3. 我们如何监视所有 Spring Boot 微服务?
  4. Spring Boot 的配置文件有哪几种格式?它们有什么区别?
  5. C printf格式化输出
  6. XML 文档定义有几种形式?它们之间有何本质区别?解析 XML 文档有哪几种方式?
  7. 使用 Spring 有哪些方式?
  8. centos下安装配置maven
  9. 遇到过的问题之“解决 No qualifying bean of type 问题”
  10. (stm32学习总结)—GPIO位带操作