【STM32CubeMX】串口通信

news2024/9/23 9:25:00

前言

  本文记录下我学习STM32CubeMX时的流程,方便以后回忆。本章记录串口通信。这里居然有玄学问题,给我整了好久,头都大了。可能也是我能力有限才有的吧,泪目。

目录

  • 串口通信

串口通信

  1. STM32CubeMX中的串口配置,配置完后就可以生成了。

    在这里插入图片描述
    在这里插入图片描述

  2. Keil5中打开生成的工程文件。写下发送函数,发送测试。

    uint8_t send_str1[] = "hello world\r\n";	//这个在开头定义,所以说截图中没看到。
    //&huart1 为串口1 , send_str1 为要发送的数据 , sizeof(send_str1) 为要发送的数据的长度 , 1000 为设置超时时间
    HAL_UART_Transmit(&huart1,send_str1,sizeof(send_str1),1000);	//堵塞模式发送,超时时间1000ms
    //关于&huart1这个名称,在串口端口初始化函数原型上已有它的名称结构在声明了,所以说要是换串口后,不知道名称,也可以跳转去看。
    

    在这里插入图片描述

    stm32f1xx_hal_uart.h文件中,串口操作相关函数。在725行位置处。

    • 堵塞模式,传输函数将会阻塞,一直等待缓冲区可用时再传输数据,如果超过了超时时间,缓冲区在一定时间内无法发送数据时,传输函数将会超时退出。
    • 非堵塞模式,则与上述相反,没有超时时间的概念,有数据就收发,不存在数据传输等待。
    //堵塞模式发送 
    HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
    //堵塞模式接收
    HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
    //非堵塞模式发送
    HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
    //非堵塞模式接收
    HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
    
  3. 接收测试

      接收测试的思路本来是想在接受完后,用发送函数发给串口调试助手。

    1. 测试方法一,在主函数中加入下述代码。现象,接收函数一直响应,不管有无数据。而且就算有数据它也会一直重复响应那一串数据,我想可能是中断标志或者数据缓冲区没清除干净,但是试了各种方法后到不行,挺奇怪的。
    if(HAL_UART_Receive(&huart1,rece_str1,16,100))
    {
        HAL_UART_Transmit(&huart1,rece_str1,sizeof(send_str1),1);
        //memset(send_str1, 0, sizeof(send_str1));
    }
    

    在这里插入图片描述

    1. 测试方法二,在主函数中加入下述代码。现象,莫名的卡顿感,怎么个卡顿呢,就是在必须要在规定的超时时间内收到规定长度的字节长度否正就丢弃(这是我后来才发现的,具体测试三说),把接收时间缩短或者换非堵塞模式又收不到。虽然说总感觉是接收函数出了问题,但是还是没头绪。

      if(RESET != __HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE))   //判断是否是空闲中断
      {
          HAL_UART_Receive(&huart1,rece_str1,16,2000);
          HAL_UART_Transmit(&huart1,rece_str1,sizeof(send_str1),2000);
          memset(rece_str1,0,16);                                 //清空缓冲区
          __HAL_UART_CLEAR_IDLEFLAG(&huart1);                     //清除空闲中断标志(否则会一直不断进入中断)
      }
      

      在这里插入图片描述

    2. 测试方法三,在主函数中加入下述代码。这其实就是在测试方法二的基础上,将HAL_UART_Receive()函数的接收字节从16个变为1个。(多加了一个发送换行)

      if(RESET != __HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE))   //判断是否是空闲中断
      {
          HAL_UART_Receive(&huart1,rece_str1,1,2000);
          HAL_UART_Transmit(&huart1,rece_str1,1,2000);
          HAL_UART_Transmit(&huart1,"\r\n",2,2000);
          memset(rece_str1,0,16);                                 //清空缓冲区
          __HAL_UART_CLEAR_IDLEFLAG(&huart1);                     //清除空闲中断标志(否则会一直不断进入中断)
      }
      

      在这里插入图片描述

      总结:我现在,只有单字节正常接收的能力。串口收发以后可能都要基于测试方法三,单字节单字节的收,在整合成多字节了,多字节就像其它方法一样各种问题。当然,可能还有其它解决思路,有时间在探究。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/479890.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MiniGPT-4引领潮流,GPT-4提前发布图片阅读功能

ChatGPT中国站翻译自medium.com 让我们来看看如何玩Minigpt-4并将其应用到日常生活中。 今年三月,OpenAI 宣布了 GPT-4 的图像识别功能,这意味着 GPT 技术又被提升一个维度。-4 尚未发布给大众使用很长时间,所以终于有人忍不住了!…

由 ChatGPT 团队开发,堪称辅助神器!IntelliJ IDEA 神级插件

什么是Bito? 为什么要使用Bito? 如何安装Bito插件 如何使用Bito插件 什么是Bito? Bito是一款由ChatGPT团队开发的IntelliJ IDEA编辑器插件,旨在提高开发人员的工作效率。此插件强大之处在于它不仅可以帮助开发人员更快地提交…

vulnhub靶机sar

准备工作 下载连接:https://download.vulnhub.com/sar/sar.zip 下载完后解压,然后双击打开,VMware导入OVA 网络环境:DHCP、NAT 信息收集 主机发现 先扫描整个C段 192.168.100.132应该就是我们的目标 端口扫描 扫描目标主机…

3个经典线程同步问题

生产者消费者问题 问题描述 系统中有一组生产者进程和一组消费者进程,生产者进程每次生产一个产品放入缓冲区,消费者进程每次从缓冲区中取出一个产品并使用。生产者、消费者共享一个初始为空、大小为n的缓冲区 伪码描述 semaphore mutex 1;//互斥信…

Zabbix服务端监控目标主机的Web服务(网站的访问延迟)

zabbix服务端和目标主机的部署见上一篇文章: http://t.csdn.cn/XD5Hc Zabbix服务端监控目标主机 服务端启动zabbix服务后,在浏览器上访问:http://IP/zabbix 1.创建主机群主(名字自定义) 2.创建主机 主…

javaEE基于SSh学生选课系统

设计内容1. 搜集相关资料、作出功能需求分析; 2. 各个功能模块的基本功能大体如下: (1). 管理员模块 包括个人中心、专业管理、班级管理、课程管理、教师管理、选课管理。. (2).教师模块 包括个人中心、课程信息、出勤管理、成绩管理。 (3)…

大数据-玩转数据-netcat

Netcat(简称nc)是一款强大的命令行网络工具,用来在两台机器之间建立TCP/UDP连接,并通过标准的输入输出进行数据的读写。 一、Windows 下载安装 netcat(nc)命令 1、netcat(nc)下载地址: https://eternallybored.org/…

《程序员面试金典(第6版)》面试题 16.08. 整数的英语表示

题目描述 给定一个整数,打印该整数的英文描述。 示例 1: 输入: 123输出: “One Hundred Twenty Three” 示例 2: 输入: 12345输出: “Twelve Thousand Three Hundred Forty Five” 示例 3: 输入: 1234567输出: “One Million Two Hundred Thirty Four Thousand…

Kali 更换源(超详细,附国内优质镜像源地址)

1.进入管理员下的控制台。 2. 输入密码后点击“授权”。 3.在控制台内输入下面的内容。 vim /etc/apt/sources.list 4.敲击回车后会进入下面的页面。 5.来到这个页面后的第一部是按键盘上的“i”键,左下角出现“插入”后说明操作正确。 6.使用“#”将原本的源给注释…

武汉大学惯性导航课程合集【2021年秋】1.2 惯性器件的误差和标定

前提平台惯导NED与本地对齐,body系和navigation对齐。地表IMU感受到的是 朝天上的力【0,0,-9.8】和 赤道的【15deg/hr,0,0】或者北极 【0,0,-15deg/hr】或者【15cos纬度,0&#xff0…

「STM32入门」USART串口通信

通信 通信的目的:将一个设备的数据传送到另一个设备,扩展硬件系统 通信协议:制定通信的规则,通信双方按照协议规则进行数据收发 STM32常见的通信协议 本文将介绍USART 概念解释 TX、RX分别是Transmit和Receive的缩写&#xff0c…

一文把 JavaScript 中的 this 聊得明明白白

文章目录 1.this 是什么?2.this的指向2.1 全局上下文的 this 指向2.2 函数(普通函数)上下文中的 this 指向2.3 事件处理程序中的 this 指向2.4 以对象的方式调用时 this 的指向2.5 构造函数中的 this 指向2.6 在 类上下文中 this 的指向。2.7…

开源企业资源规划ERPNext的安装

往常节假日,都是呆在家里看别人堵,这回老苏也出门凑了个热闹,28号早上 7 点半出的门 2 点半往回走的 一天啥也没干,就开了 7 个小时的车去舅舅家蹭了顿饭。还别说,那个田园鸡味道是真不错。 车很久没开了,…

(详解)vue中实现 ‘换肤 / 主题切换’ 功能的三种方式

目录 一、背景 二、实现思路 方法1:定义全局的CSS变量 方法2:切换已定义好的css文件 方法3:切换顶级CSS类名 (需使用css处理器,如sass、less等) 一、背景 在我们开发中我们会遇到像是需要切换程序风格、主题切换啦这种应用场景。 二、实现…

JavaScript通过函数异常处理来输入圆的半径,输出圆的面积的代码

以下为实现通过函数异常处理来输入圆的半径,输出圆的面积的代码和运行截图 目录 前言 一、通过函数异常处理来输入圆的半径,输出圆的面积 1.1 运行流程及思想 1.2 代码段 1.3 JavaScript语句代码 1.4 运行截图 前言 1.若有选择,您可以…

【RPA开发】pymongo 使用教程

实际开发时抓取到的诸多数据如何保存是一个关键问题,MongoDB 相比传统关系型数据库(比如mysql)来说灵活度更高,爬虫时字段格式及数量很可能会随着需求或实际数据的变动而改变,因此 MongoDB 作为数据库来说最合适不过了…

2023年华中杯选题人数公布

2023年华中杯选题人数公布 经过一晚上代码的编写,论文的写作,C题完整版论文已经发布, 注:蓝色字体为说明备注解释字体,不能出现在大家的论文里。黑色字体为论文部分,大家可以根据红色字体的注记进行摘抄。…

【STM32】知识补充 分频技术深度解析: 原理、应用与实现方法

【STM32】知识补充 分频技术深度解析: 原理、应用与实现方法 概述分频概念分频原理技术器分频器触发器分频器模数计数器分频器 分频应用微控制器时钟分频通信系统中的频率合成数字电路设计中的计时与同步 分频实现方法硬件分频器软件分频器 案例总结 概述 分频 (Frequency Div…

c#笔记-创建一个项目

创建一个项目 创建控制台程序 在你安装完成Visual Studio后打开它,你会的到一个启动窗口 点击创建新项目,选择右上角c#的没有Framework的控制台应用。 项目名称,位置自己随意。 目标框架选择NET7.0。 项目创建完成后应该你的界面应该类似…

nvdec与vaapi与vdpau的关系

nvdec/vaapi/vdpau的关系 NVDEC:nvidia video decoder。 英伟达官网中有关video codec SDK的介绍,其中有头文件、开发API文档等。 Nvidia Video SDK中提供了NVDEC、NVENC,其中NVDEC以前也叫做NVCUVID(不知道NVDEC的开发API中很…