【STM32CubeMX】F103串口通信

news/2024/6/3 19:30:13 标签: stm32, 单片机, 嵌入式硬件, mcu

前言

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

目录

  • 串口通信

串口通信

  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);                     //清除空闲中断标志(否则会一直不断进入中断)
      }
      

      在这里插入图片描述

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

扩展

  在发送数据前,通常可以使用格式化函数将各种数据转换为字符形式后再发送。在C语言中,可以使用sprintf函数实现,例如:

sprintf(数组,"Data1:%d\r\n",整型数据);

http://www.niftyadmin.cn/n/286866.html

相关文章

分享:集群吞吐量以1抵5,车企MySQL八大痛点的解决方案

本文来自社区分享,仅限交流探讨。原文作者:李婵玲,某智能车企DBA。欢迎访问 OceanBase 官网获取更多信息:https://www.oceanbase.com/ 最近一年,我们完成了从MySQL到OceanBase的替代过程,既降低了架构复杂度…

神经网络模型压缩技术—剪枝

目录 1.模型压缩定义 2.模型压缩必要性及可行性 3.模型压缩分类 3.1 主流分类 3.2 前端和后端 4.剪枝 4.1 剪枝定义 4.2 剪枝分类 4.2.1 基于粒度 4.2.2 基于是否结构化 4.2.3 基于目标 5. 结构化剪枝和非结构化剪枝 5.1 非结构化剪枝(移除单个权重或神…

大数据Doris(十一):Aggregate 数据模型

文章目录 Aggregate 数据模型 一、导入数据聚合 二、保留明细数据

HTTP协议:大文件传输

有时候从服务器下载的文件会很大,HTTP 协议本身支持一些头部字段能够让你在下载这类文件时进行一些控制。 数据压缩 首先想到的肯定是数据压缩。这个功能在请求方需要用 Accept-Encoding 字段来表明客户端支持什么样的压缩类型,在服务端,是通…

极速进化,光速转录,C++版本人工智能实时语音转文字(字幕/语音识别)Whisper.cpp实践

业界良心OpenAI开源的Whisper模型是开源语音转文字领域的执牛耳者,白璧微瑕之处在于无法通过苹果M芯片优化转录效率,Whisper.cpp 则是 Whisper 模型的 C/C 移植版本,它具有无依赖项、内存使用量低等特点,重要的是增加了 Core ML 支…

【软考高级】2019年系统分析师论文真题

1、论系统需求分析方法 系统需求分析是开发人员经过调研和分析,准确开解用户和项8的功能,性能、可靠性等要求,将用户非形式的诉求表述转化为完整的需求定义,从而确定系统必须做什么的过程。系统需求分析具体可分为功能性秀水、非功…

一文全览各种 ES 查询在 Java 中的实现

ElasticSearch 进阶:一文全览各种 ES 查询在 Java 中的实现 以下为摘录自用,非本人撰写 本文基于elasticsearch 7.13.2版本,es从7.0以后,发生了很大的更新。7.3以后,已经不推荐使用TransportClient这个client&#xf…

数字图像处理--matlab图像反转、对数变换、伽马变换、对比度拉伸详解和代码实现

灰度变换在图像的单个像素上操作,主要以对比度和阈值处理为目的 空间滤波涉及改善性能的操作(邻域操作),如通过图像中每一个像素的邻域处理来锐化图像 这两种方法均属于图像增强。 灰度变换 邻域基本增强变换定义数学表达三种基本…