摘要:演示程序的功能:通过中断接收串口数据,在1750us时间内没有收到新的字节的话,将收到的数据原封不动地发送出去,以测试串口的完整收发流程。对使用到的函数进行了说明,阐述了各个函数的调用顺序和调用关系,在目标板上对代码进行了测试,结果表明,可以实现预期功能。

关键词:STM32F103C8T6 STM32CubeMX UART 收发程序设计

2.1程序规划

演示程序的功能:通过中断接收串口数据,在1750us时间内没有收到新的字节的话,将收到的数据原封不动地发送出去,以测试串口的完整收发流程。

2.2 函数说明

STM32CubeMx自动生成的初始化函数,孔丙火(公众号:孔丙火)这里不再做说明。

(1)HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)

对于这个函数,孔丙火(公众号:孔丙火)认为这是一个配置函数,配置串口号、接收缓存区的指针和每次接收的数量,并使能接收中断。

图2-1是此测试程序的该函数的调用,每次接收一个字节,存在ucUartTempBuf中。

图2-1

(2)HAL_StatusTypeDef UART_Receive_IT(UART_HandleTypeDef *huart)

此函数在串口的中断服务程序中调用,作用是将接收到的字节放到接收缓存区,判断整个数据是否已接收完整(是否已达到配置的数量),接收完整的话调用HAL_UART_RxCpltCallback(),并禁止接收中断。

(3)HAL_UART_RxCpltCallback()

此函数是一个回调函数,需要用户编写,孔丙火(公众号:孔丙火)认为,在此函数中,可以将收到的数据进行转移,如果需要继续接收的话,还要再次调用HAL_UART_Receive_IT(),由于这个回调函数有可能会被多个串口中断服务程序调用,因此在函数中需要区分串口。

此篇文章的测试程序中,在此函数中启动定时器,用于1750us的定时。代码如图2-2所示。

图2-2

(4)HAL_TIM_PeriodElapsedCallback()

此函数是一个回调函数,当定时器产生溢出中断时调用,需要用户编写,此测试程序中,定时1750us的时间到,说明一个完整数据帧已接收完成,调用HAL_UART_Transmit_IT()函数,将收到的数据,原封不动地发送回去。

图2-3

(5)HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)

孔丙火(公众号:孔丙火)认为,此函数也是一个配置函数,将发送数据指针和数量赋给相应的寄存器,然后使能发送缓存区为空中断,以便通过中断的方式将数据逐个字节的发送出去。

(6)HAL_StatusTypeDef UART_Transmit_IT(UART_HandleTypeDef *huart)

此函数在uart的中断服务程序中调用,将数据发到uart硬件缓存区,并监视已发送数量,发送数量达到目标值后,禁止发送缓存区为空中断。

2.3 函数调用顺序

函数调用顺序如图2-4所示。此图只是大体上展示了各个函数的调用顺序和调用关系,并不完全准确,由于中断的存在,有的进程是并行进行的。

图2-4

2.4 测试结果

准备两帧数据:01 03 00 00 00 0A C5 CD;

01 10 00 00 00 05 0A 00 01 00 02 00 03 00 04 00 05 EA 6A;

各发送两帧,查看目标板的回复数据,如图2-5所示。自此,uart的收发流程就演示完毕,这也类似于Modbus串口通信的一个基本框架。

图2-5

文章在微信公众号同步推出,微信公众号:孔丙火,关注欣赏更多文章。

STM32F103C8T6-CubeMx串口收发程序详细设计与测试(2)——程序规划、代码编写及测试的更多相关文章

  1. 新书《编写可测试的JavaScript代码 》出版,感谢支持

    本书介绍 JavaScript专业开发人员必须具备的一个技能是能够编写可测试的代码.不管是创建新应用程序,还是重写遗留代码,本书都将向你展示如何为客户端和服务器编写和维护可测试的JavaScript代 ...

  2. STM32F103C8T6-CubeMx串口收发程序详细设计与测试(1)——CubeMx生成初始代码

    STM32F103C8T6-CubeMx串口收发程序详细设计与测试(1)--CubeMx生成初始代码 关键词:STM32F103C8T6 CubeMX UART 详细程序设计 1.开发环境 (1)ST ...

  3. [连载]《C#通讯(串口和网络)框架的设计与实现》- 10.宿主程序详细设计

    目       录 第十章           宿主程序详细设计... 2 10.1        配置文件设计... 3 10.2        加载设备驱动... 4 10.3        加载 ...

  4. stm32串口收发导致的死机

    stm32串口收发导致的死机 很久以前有偶尔遇到过串口死机的情况,那是当时的我写出来的代码自己都觉得有问题,也就没注意.用了stm32做项目以后也就没遇到过了,今天做了个高压测试,每5ms定时发送一次 ...

  5. [ZigBee] 8、ZigBee之UART剖析·二(串口收发)

    前言:上一节讲UART基本知识介绍完了,并深入剖析了一个串口发送工程,本节将进一步介绍串口收发! 1.初始化 在串口初始化部分,和上一节不同的地方是: 51 U0CSR |= 0x40; //允许接收 ...

  6. QT5 串口收发实例代码

    以下代码是自己测试门禁系统使用的 主要用到了串口的接收和发送  开发环境:xp  QT5.1.1 串口:38400   N  8  1 自动检测可用串口 在xp上测试没问题 有些usb转串口会出现波特 ...

  7. 测试的程序 test.php,保存放IIS的根目录下

    IIS+PHP的配置的方法,试过之后很多都不能达到效果.于是总结了大部分的文章后就得出了这样的方法 一.下载必须的程序:(1) 先到PHP的官方网站下载一个PHP(本文就以PHP 4.4.2为例).网 ...

  8. Selenium测试Ajax程序(转)

    上周末参加了Qclub的百度技术沙龙,听了百度的孙景卫讲了Web自动化测试,讲的非常好,然后在小组讨论时又有幸座在了一起.我们讨论的一个内容,就是Ajax应用程序比原来的非Ajax程序更不易测试,这里 ...

  9. 手机测试Android程序

    手机测试Android程序   上传者:sanpi329     我也要“分享赚钱” 2014/7/9 关注(23) 评论(0)   声明:此内容仅代表网友个人经验或观点,不代表本网站立场和观点.   ...

随机推荐

  1. Unity添加自定义拓展方法

    Shepherdog|2014-04-08 10:50|16151次浏览|Unity(373)0 通常你会发现你不能修改正在使用的那些类,无论它是基础的数据类型还是已有框架的一部分,它提供的方法让你困 ...

  2. Kibana的安装

    了解ELK Kibana 安装 Kibana的版本要和ES的一致 下载完毕后解压 这个解压就有点慢了 ELK的东西基本都是开箱即用的 解压后的目录 进入bin 双击启动kibana.bat 哎:启动从 ...

  3. basicInterpreter1.01 支持分支语句

    源码:https://files.cnblogs.com/files/heyang78/basicInterpreter-20200531-1.rar 输入: count= print(count) ...

  4. docker 修改容器配置文件

    启动docker镜像命令docker run 可以指定端口映射,但是容器一旦创建就无法在通过命令修改.通常是保存镜像在创建一个新的容器.有没有办法不保存镜像直接修改这个容器呢?答案是有的,本文已mys ...

  5. Tcahce Stashing Unlink Attack

    今年校赛有点可惜,最后两道质量不错的pwn每做出来,总的来说还是我太菜了,希望下次校赛能AK pwn题.不过这次校赛也没有白打,还是有学到新的东西的.在这里感谢出题的学长. glibc-2.29以后u ...

  6. nginx系列(七)静态文件合并combo

    根据雅虎性能优化准则,可以将大量的小型JS文件进行合并,用来提高WEB服务器的性能.下面就是笔者的一个实践. 目前必须安装在1.4.+才可以 官方:http://wiki.nginx.org/Http ...

  7. 提高SSH服务安全,ssh黑白名单

    1.调整sshd服务配置,并重载服务 # vim /etc/ssh/sshd_config PermitRootLogin no                     #禁止root用户登录 Use ...

  8. 源码解读 TDengine 中线程池的实现

    这篇文章中提到了 tsched 的源码可以一读,所以去阅读了一下,总共220来行. 1. 阅读前工作 通过上文了解到这段程序实现的是一个任务队列,同时带有线程池.这段程序是计算机操作系统里经典的con ...

  9. PHP相关的书签内容

    ThinkPHP函数详解 session方法 --ThinkPHP 开源PHP框架 ThinkPHP实现支付宝接口功能 - /折磨 - 博客园 php几个常用的概率算法(抽奖.广告首选) - 懒人技术 ...

  10. JVM运行时数据区划分

    Java内存空间 内存是非常重要的系统资源,是硬盘和cpu的中间仓库及桥梁,承载着操作系统和应用程序的实时运行.JVM内存布局规定了JAVA在运行过程中内存申请.分配.管理的策略,保证了JVM的高效稳 ...