STM32串口通讯(接收完成一整个数据帧再将数据发送出去)

2023-05-16

STM32串口通信可以分为查询,中断,DMA三种方式进行通讯,本文主要就中断的方式进行讲解。采用中断的方式进行通讯时,可以使能接受非空中断(RXNE),当接收到一个数据时就产生一个中断,将接收到的数据通过移位寄存器移位到RDR中,此时我们可以直接将接收到的数据发送出去,则完成了一个字符的通讯,以后每次接收到一个数据就发送一个数据出去,如此便实现了接收到什么数据便发送什么数据的功能。而本文将要讨论先将其他设备发送来的数据全部接收完成,再将一整帧的数据发送出去的通讯方法。(串口通讯原理图如下)

方法一:采用定时器的方法判断一组数据帧是否接收完成。在接收到第一个字符时打开定时器,在持续接收到数据时不断更新定时器的值,当没有接收到数据时,定时器的值不再更新,会产生超时溢出,触发溢出中断,从而判断一组数据帧接收完成(注:定时器的值要设置合理,不能大于两组数据帧发送之间的间隔,如采用modbus协议时3.5个字符的时长;也不能小于两个发送字符之间的时长)。具体操作如下:首先根据波特率计算定时器设置的一个具体时间,在串口中断中接收到第一个字符开启定时器,并在每一次接收到数据进入串口中断时将定时器的计数清零,若定时器达到我们设置的时间便认为一个数据帧接收完成。

方法二:通过对数据帧的帧尾进行判断来识别一组数据帧是否接收完成;因为在电脑上按下回车键或发送新行,帧尾会出现0x0A,0X0D这两个,我们只要判断是否连续出现0A,0D便可判断一组数据帧是否传输完成。

方法三:采用STM32自带的空闲中断(IDLE)来判断一组数据帧是否接收完成;首先,在串口初始化中使能空闲中断(IDLE),再在中断服务函数中判断中断标志位(USART_FLAG_IDLE)(这里只能用中断标志位来判断而不是中断,具体原因还未查清,实操是不行),当标志位置位时,将接收到的一帧数据发送出去。另外,空闲标志位只有在RXNE再次置1时才能使能(注意,USART_FLAG_IDLE的判断在中断服务函数中,但是需要在清除RXNE标志位之后判断)。空闲标志位必须采用先读状态寄存器,再读数据寄存器才可以清除,不能采用普通的调用清除函数来清除。具体操作代码如下:

 RXNE中断和IDLE中断的区别: 
当接收到1个字节,就会产生RXNE中断,当接收到一帧数据,就会产生IDLE中断。比如给STM32一次性发送了10个字节,就会产生10次RXNE中断,1次IDLE中断。

总的来说,这三种方式都可以实现接收不定长的数据帧,接收完成,再发送的功能,但是相对来说第三种方式比较推荐,操作起来简单,且不需要占用定时器资源,另外,对于第二种方法,对从传感器接收来的数据就不太适用,可能你没办法获得其具体的数据帧格式,如此通过帧尾来判断的方法就不太适用了。相对比来说,方法三,采用空闲中断(IDLE)的方式适用性较好。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32串口通讯(接收完成一整个数据帧再将数据发送出去) 的相关文章

  • c项目makefile多重定义错误

    这个问题是一个对应于创建的repexthis问题 在我的嵌入式 C 项目中 我有两个独立的板 我想为每个板创建两个 c 文件 master c 和 Slave c 其中包含自己的特定main 功能 我使用 stm32cumbemx 生成带有
  • 优化 ARM Cortex M3 代码

    我有一个 C 函数 它尝试将帧缓冲区复制到 FSMC RAM 这些函数将游戏循环的帧速率降低至 10FPS 我想知道如何分析反汇编的函数 我应该计算每个指令周期吗 我想知道CPU把时间花在哪里 在哪个部分 我确信该算法也是一个问题 因为它的
  • 139-基于stm32单片机老人居家监护报警系统Proteus仿真+源程序

    资料编号 139 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 MQ4传感器 电位器模拟 MQ2传感器 电位器模拟 蜂鸣器 电机 制作一个基于stm32单片机老人居家监护报警系统Proteus仿真 2 通过MQ2传
  • 135-基于stm32单片机超声波非接触式感应水龙头控制系统Proteus仿真+源程序

    资料编号 135 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 电机 超声波传感器 制作一个基于stm32单片机超声波非接触式感应水龙头控制系统Proteus仿真 2 通过DHT11传感器检测当前
  • HAL库学习

    CMSIS简介 CMSIS Cortex Microcontroller Software Interface Standard 微控制器软件接口标准 由ARM和其合作的芯片厂商 ST NXP 软件工具厂商 KEIL IAR 共同制定的标准
  • STM32F103概要

    The STM32F103x4 STM32F103x6 STM32F103xC STM32F103xD and STM32F103xE are a drop in replacement for STM32F103x8 B medium d
  • [屏驱相关]【SWM166-SPI-Y1.28C1测评】+ 有点惊艳的开箱

    耳闻华芯微特许久了 看到论坛得评测活动赶紧上了末班车 毕竟对有屏幕得板子也是很喜欢得 京东快递小哥客客气气 微笑着把快递给了我 好评 直接拆了包 在此之前没看过视频号 所以这个圆盘盘得模具还是有点惊喜的 正面照如下 开机有灯光秀 还有动画
  • 在 Atollic TrueStudio、STM32CubeMX 中导入 C 库

    我目前正在开发 STM32F767ZI Nucleo 板和一个小安全芯片 microchip atecc508a 通过 i2c 连接进行连接 该芯片有一个可用的库加密验证库 https github com MicrochipTech cr
  • 串口通讯第一次发送数据多了一字节

    先初始化IO再初始化串口 导致第一次发送时 多出一个字节数据 优化方案 先初始化串口再初始化IO 即可正常通讯
  • 串口通讯第一次发送数据多了一字节

    先初始化IO再初始化串口 导致第一次发送时 多出一个字节数据 优化方案 先初始化串口再初始化IO 即可正常通讯
  • 1.69寸SPI接口240*280TFT液晶显示模块使用中碰到的问题

    1 69寸SPI接口240 280TFT液晶显示模块使用中碰到的问题说明并记录一下 在网上买了1 69寸液晶显示模块 使用spi接口 分辨率240 280 给的参考程序是GPIO模拟的SPI接口 打算先移植到FreeRtos测试 再慢慢使用
  • STM32H5 Nucleo-144 board开箱

    文章目录 开发板资料下载 目标 点亮LD1 绿 LD2 黄 和LD3 红 三个LED灯 开箱过程 博主使用的是STM32CubeMX配置生成代码 具体操作如下 打开STM32CubeMX File gt New project 选择开发板型
  • 特殊寄存器

    特殊寄存器 文章目录 前言 一 背景 二 2 1 2 2 总结 前言 前期疑问 STM32特殊寄存器到底是什么 特殊寄存器怎么查看和调试代码 本文目标 记录和理解特殊寄存器 一 背景 最近在看ucosIII文章是 里面提到特殊寄存器 这就进
  • Cortex-M3与M4权威指南

    处理器类型 所有的ARM Cortex M 处理器是32位的精简指令集处理器 它们有 32位寄存器 32位内部数据路径 32位总线接口 除了32位数据 Cortex M处理器也可以有效地处理器8位和16位数据以及支持许多涉及64位数据的操作
  • 从没有中断引脚并且在测量准备好之前需要一些时间的传感器读取数据的最佳方法

    我正在尝试将压力传感器 MS5803 14BA 与我的板 NUCLEO STM32L073RZ 连接 根据 第 3 页 压力传感器需要几毫秒才能准备好读取测量值 对于我的项目 我对需要大约 10 毫秒来转换原始数据的最高分辨率感兴趣 不幸的
  • STM32 上的位置无关代码 - 指针

    我已成功在 STM32 上构建并运行位置无关的代码 向量表和 GOT 已修补 一切正常 但我对这样的代码有问题 double myAdd double x return x 0 1 double ptrmyAdd double myAdd
  • STM32内部时钟

    我对 STM32F7 设备 意法半导体的 Cortex M7 微控制器 上的时钟系统感到困惑 参考手册没有充分阐明这些时钟之间的差异 SYSCLK HCLK FCLK 参考手册中阅读章节 gt RCC 为 Cortex 系统定时器 SysT
  • PWM DMA 到整个 GPIO

    我有一个 STM32F4 我想对一个已与掩码进行 或 运算的 GPIO 端口进行 PWM 处理 所以 也许我们想要 PWM0b00100010一段时间为 200khz 但随后 10khz 后 我们现在想要 PWM0b00010001 然后
  • STM32F0、ST-link v2、OpenOCD 0.9.0:打开失败

    我在用着发射台 http www ti com ww en launchpad about htmlgcc arm none eabi 4 9 2015q2 为 STM32F0 进行编译 现在我想使用该集合中的 arm none eabi
  • 当端点和 PMA 地址均更改时,CubeMX 生成的 USB HID 设备发送错误数据

    我正在调试我正在创建的复合设备的问题 并在新生成的仅 CubeMX 代码中重新创建了该问题 以使其更容易解决 我添加了少量代码main 让我发送 USB HID 鼠标点击 并在按下蓝色按钮时使 LED 闪烁 uint8 t click re

随机推荐

  • windows下面安装git

    注意在安装过程中选择override这个选项
  • QT中Map的使用

    Qt中的QMap介绍与使用 xff0c 在坛子里逛了一圈 xff0c 发现在使用QMap中 xff0c 出现过很多的问题 xff0c Map是一个很有用的数据结构 它以 键 值 的形式保存数据 在使用的时候 xff0c 通过提供字符标示 x
  • ubuntu 更新内核切换内核启动

    1 查看需要更新的内核命令 xff1a apt cache search linux 该命令将会显示所有可以获取的内核 2 安装内核 xff0c 假设你要安装的内核为2 6 39 0 xff0c 则使用下面的命令 sudo apt get
  • 多线程实现对同一个或多个文件的读写操作

    程序用途 xff1a 实现多个线程对同一文件的读写操作 程序代码 xff1a test c 该程序在Ubuntu下测试通过 include lt stdio h gt include lt pthread h gt include lt s
  • linux下设置共享目录

    Linux系统的文件或目录的共享功能是非常强大 xff0c 而且是非常灵活的 xff0c 其对权限的控制可以做到非常的细致 xff0c 当然如果你是通过命令行方式进行设置的 话 xff0c 那么对于刚接触linux系统的用户来说将是一件十分
  • shell 数组赋值

    shell编程 xff0c 给数组赋值及两个数组初始化与比较 bin sh output files 61 cat outfiles for i 61 0 i lt output files 64 43 43 i do echo 34 ar
  • vnc的两种配置方法及解决vnc连不上的情况

    1 vnc连不上的现象 xff1a Timed out waiting for a response from the computer 解决方法 xff1a sudo sbin iptables I INPUT 1 p TCP dport
  • linux制作本地镜像

    1 前提条件 xff1a 有安装linux系统的iso 2 添加yum文件 xff1a touch etc yum repos d iso repo iso name 61 CentOS releasever Media baseurl 6
  • 使用parted创建分区

    今天在网上查找分区方法 xff0c 发现都是用的fdisk xff0c 但自己使用总是出错 xff0c 后来请求大神帮忙 xff0c 发现了一个好用的工具 xff0c 这里把具体的使用过程记录下来 root 64 pc160 parted
  • “结构体名”和“结构体名是个指针”的区别

    经常看见下面这样的定义 xff1a typedef struct int a double b emp i pemp i typedef 了两个新的数据类型 xff08 结构体 xff09 xff0c 其中一个是指针方式的名字 int ma
  • 简答实用的宏的写法

    本篇文章主要实现打印参数的传递 xff0c 这里定义了一个宏 define debug printf format printf 34 s d 34 format 34 34 func LINE VA ARGS
  • RK1126从入门到放弃:(二)Buildroot说明

    一 目录介绍 buildroot arch 存放CPU架构相关的配置脚本 xff0c 如arm mips x86 xff0c 这些CPU相关的配置 xff0c 在制作工具链时 xff0c 编译uboot和kernel时很关键 board x
  • 二进制基础及位运算

    一 什么是二进制 二进制是计算机运算时所采用的数制 xff0c 基数是2 xff0c 也就是说它只有两个数字符号 xff0c 即0和1 如果在给定的数中 xff0c 除0和1外还有其他数 xff08 例如1061 xff09 xff0c 那
  • Django学习笔记2 HTTP协议

    HTTP协议 web前端系统和后端系统之间是通过HTTP协议进行通信的HTTP 协议全称是超文本传输协议 xff0c 英文是 Hypertext Transfer ProtocolHTTP 协议最大的特点是通讯双方分为客户端和服务端 由于目
  • VINS-Mono视觉初始化代码详解

    摘要 视觉初始化的过程是至关重要的 xff0c 如果在刚开始不能给出很好的位姿态估计 xff0c 那么也就不能对IMU的参数进行精确的标定 这里就体现了多传感器融合的思想 xff0c 当一个传感器的数据具有不确定性的时候 xff0c 我们需
  • 5G DTU 数据上传 无线通信

    5G数据采集上传DTU xff0c 和各种使用串口通信的用户设备进行连接 xff0c 通过无线网络进行数据云端上传实现远程实时在线监测 采用心跳包保持永久在线 xff0c 支持断线自动重连 自动重拨号等特点 5G DTU组网迅速灵活 xff
  • 5G DTU地下水水位监测

    地下水监管不当会造成地面沉降 地裂缝 岩溶塌陷 海水入侵 水质污染等危害 xff0c 掌握了解地下水水位 分布等状态 xff0c 响应可持续发展的号召 xff0c 提高地下水资源科学保护和合理利用 计讯物联地下水水位监测系统平台采用5GDT
  • 5g DTU 无线数传终端应用

    DTU无线数传终端TD210全网通2G 3G 4G网络 xff0c 实现串口数据与IP数据的转换 xff0c DTU作为串口数据的无线终端设备 xff0c 可广泛应用于各行各业 DTU无线数传终端TD210应用 第一 xff0c 农业领域
  • 使用L298N电机驱动器和Arduino控制步进电机

    在本文中 xff0c 您将学习如何使用L298N电动机驱动器控制步进电动机 该驱动板通常用于控制直流电动机 xff0c 但它还是控制步进电动机的廉价替代品 xff01 它可以控制大多数步进电机 xff08 例如NEMA 17 xff09 的
  • STM32串口通讯(接收完成一整个数据帧再将数据发送出去)

    STM32串口通信可以分为查询 xff0c 中断 xff0c DMA三种方式进行通讯 xff0c 本文主要就中断的方式进行讲解 采用中断的方式进行通讯时 xff0c 可以使能接受非空中断 xff08 RXNE xff09 xff0c 当接收