在高级语言中,I/O 流输入(input)操作一般都要求指定要读取的数据的最大长度(字节数)。当接收到至少1字节、最多所指定的字节数时,函数返回。

STM32 串口接收数据时,HAL API 要求指定数据长度。但无论轮询、中断或是DMA方式,都必须完整地接收到这么多字节,程序流程才继续。如何接收变长消息,我想不到特别好的实现方式。一种方式是,轮询加超时。另一种方式是,设计消息协议,使消息头为定长,且消息头内包含消息体的长度。但是,如果通讯异常,导致消息数据错误或丢失,那么,还是缺少“提前返回”的机制。

相对来说,轮询加超时的方式似乎更好些。效率低,但是是可靠的。我也不确定。

DMA是STM32内的一个硬件模块,它独立于CPU在外围设备和内存之间进行数据传输,解放了CPU。每个型号的STM32 MCU有1-2个DMA,每个DMA有一定数量的Channel。每个Channel两端分别绑定到外围设备和内存。每个Channel可与哪种外围设备绑定,这是STM32设计时固定下来的,要查询参考手册得知。

Nucleo-F303RE 的 USART2 支持DMA。使用 DMA模式发送数据,要启用 DMA Channel的中断和USART2的中断。数据发送完成时,HAL会触发USART2 的中断进而调用中断回调函数。概况起来:

  • 调用 HAL_UART_Transmit_DMA() 函数发送数据
  • 实现 HAL_UART_TxCpltCallback() 回调函数。当数据发送完成后,此函数被HAL调用

下面的例程使用 DMA 方式依次从串口发送3条消息。App_loop() 在main() 函数的主循环中被调用。当串口数据发送完成时,txDone 标志被置1,此时将闪烁 LED(blink()),并发送下一条消息:

static void blink();static const char * msgArr[] = { "We still can find a way\n", //"Because nothing lasts for ever\n", //"Event the cold November rain\n" };static int msgIndex = 0;
volatile uint8_t txDone = 1;void App_loop() {if (txDone) {blink();txDone = 0;const char * msg = msgArr[msgIndex];HAL_UART_Transmit_DMA(&huart2, (uint8_t *) msg, strlen(msg));msgIndex = (1 + msgIndex) % 3;}
}void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) {txDone = 1;
}

从Cube HAL的角度来说,就这么多。

转载于:https://www.cnblogs.com/vinccc/p/8296103.html

串口通讯(DMA模式)相关推荐

  1. Cypress EZ-USB FX3 DMA模式下的串口通讯

    由于公司设备升级后出了问题,需要对USB驱动进行修改,原本使用的是寄存器模式进行UART传输,但是由于FX3寄存器模式会出现长时间延时等待的问题,不得不对其传输模式进行修改.虽然赛普拉斯的EZ-USB ...

  2. STM32从零到一,从标准库移植到HAL库,UART串口1以DMA模式收发不定长数据代码详解+常见问题 一文解析

    前言 本文的参考资料 感谢提供标准库版本的CSDN同学:这两篇文章至少是我看过的最详细的标准库配置DMA版本.而且代码实测稳定能用. STM32 | DMA配置和使用如此简单(超详细)_...| .. ...

  3. 【沁恒WCH CH32V307V-R1的单线半双工模式串口通讯】

    [沁恒WCH CH32V307V-R1的单线半双工模式串口通讯] 1. 前言 2. 软件配置 2.1 安装MounRiver Studio 3. UASRT项目测试 3.1 打开UASRT工程 3.2 ...

  4. 串口工作在DMA模式下有时接收异常

    1 前言 客户反馈在使用STM32F205的串口工作在DMA模式时,有时能够接收数据,有时完全没有数据,但如果换成中断模式来接收又能100%正常收到数据. 2 复现现象 2.1 问题背景 与客户沟通, ...

  5. 手把手教你从0创建STM32串口空闲+DMA数据接收工程

    串口通讯是嵌入式系统中最常用的通讯方式. STM32的串口接收普通的方式是在串口读数据寄存器非空RXNE中断(Read data register not empty)中1个字节1个字节的接收串口数据 ...

  6. 串口通讯基础及S3C2410 UART控制器

    数据通信的基本方式可分为并行通信与串行通信两种: 并行通信:是指利用多条数据传输线将一个资料的各位同时传送.它的特点是传输速度快,适用于短距离通信,但要求通讯速率较高的应用场合. 串行通信:是指利用一 ...

  7. linux can总线接收数据串口打包上传_USART串口通讯

    在计算机科学里,大部分复杂的问题都可以通过分层来简化.如芯片被分为内核层和片上外设:STM32 标准库则是在寄存器与用户代码之间的软件层.对于通讯协议,我们也以分层的方式来理解,最基本的是把它分为物理 ...

  8. 【STM32学习笔记】(9)——串口通讯(USART)详解

    本文主要参考了野火的零死角玩转STM32和正点原子的STM32F1 开发指南 V1.1(精英板-库函数版本),文章中大部分知识都是从两本书中提取出来,串口通信协议的知识主要参考野火的书籍,而串口实验部 ...

  9. 【STM32】 STM32 F4 串口通讯

    概念 串口,即串行接口,是一种可以将接收来自CPU的并行数据字符转换为连续的串行数据流发送出去,同时可将接收的串行数据流转换为并行的数据字符供给CPU的器件. 串口通信(Serial Communic ...

  10. STM32的USART串口通讯程序

    文章目录 一.STM32 USART串口通信 1.串口通信简介 1.1.物理层 1.2.协议层 2.STM32 的 USART 简介 二.STM32的USART串口通讯程序 1.创建项目 2.添加.s ...

最新文章

  1. Android Handler杂记(结合别人的blog)
  2. poj 1950 Dessert(dfs枚举,模拟运算过程)
  3. 麒麟 UKUI 3.0 发布预告视频,能否接替 Win 7 成为大家的新选择?
  4. ajax上传.mp4文件不出错,ajax视频如何上传?
  5. is_enabled:selenium中判断元素是否可以使用;is_selected()/is_displayed()
  6. 关于宁盾平台Spring框架RCE 0day漏洞修复的公告
  7. matlab colarbar设置,matlab color bar 如何改变色调
  8. 【生产调度】基于Harmony Search (HSPMS) 和 Shuffled Complex Evolution (SCEPMS) 实现并行机器调度附matlab代码
  9. Java進階:ExecutorService 線程池
  10. 2020面试要点大全
  11. 【LeetCode每日一题】——714.买卖股票的最佳时机含手续费
  12. 6U VPX NVME存储板 速度≥10GB/S 最大32TB
  13. Linux下使用AppImageLauncher安装AppImage文件
  14. p20华为云电脑白屏_华为P20云电脑方案曝光:运行Windows系统
  15. js设置页面语音播放
  16. 来看看Jmeter官网给我们的提示之如何减少资源使用
  17. 如何在3个月内写出博士论文
  18. 腾讯广点通深度用户挖掘与精准广告定向
  19. iOS开发-发送邮件及短信
  20. TCP/IP协议学习记录之九:Traceroute程序

热门文章

  1. (1)数据结构-绪论
  2. (8)机器学习_混淆矩阵(分类模型评估)
  3. python property使用
  4. java io 读取配置文件_(转)Java 读写Properties配置文件
  5. android从本地图片导入应用,android – 将图像添加到图库
  6. VGG16的10折交叉验证实现cifar10的分类(keras实现)
  7. 卷积神经网络 第一周作业 Convolution+model+-+Application+-+v1
  8. hyperparameter_hunter 超参数优化模块实践
  9. 当前读和快照读是什么 区别
  10. fisco bcos PerformanceDT.java 源码解析阅读注释