cubemx串口的发送与接收_USART串口通信,中断方式,一分钟从菜鸟到大师(完整版)...

2023-11-12

嵌入式系统中应用最广泛的一种通讯设备,只要三根线(TX,RX,GND),合适低速长距离通讯。发送和接收的控制流程如下:

1.初始化串口

包括使能串口时钟,使能发送和接收,定义引脚,波特率,数据位长度,奇偶校验方式,停止位位数。

使能串口模块接收中断,此时不能使能发送中断[炸弹]。

使能全局串口中断并设置优先级。

定义一个接收超时定时器,设置好超时值,并使能超时中断,这此定时器是关闭状态。

2. 发送

定义控制结构,

typedef struct txCtrl{ u8 buf[TX_SIZE],//根据最长发送帧定义大小 u8 idx; u8 len;//实际数据长度}txCtrl_t;txCtrl_t txCtrl;

2.1 数据准备

将发发送的数据装到txCtrl.buf,txCtrl.len=数据长度,txCtrl.idx=0。

2.2 启动发送

uartSend(){ //马上触发中断 使能发送缓冲器空中断;}

3. 接收

接收数据时会遇到一个问题,就是接到数据字节数是多少?一个帧数据接接收到什么时候才算结束?

解决这个问题,我们要使用到定时器。其原理是,接收到数据时,使能定时器,并设置超时时间为串口传输一个或几个字节的时间,注意,这个时间是随波特率变化的。如果定时器超时了,意味差这个帧结束了。

比如9600的波特率,起始位1,停止位1位,数据位8位,奇偶校验位0位,传输一个字节共10位的时间大约 10/9600=1ms.

定义控制结构,

typedef struct rxCtrl{ u8 buf[RX_SIZE],//根据最长接收帧定义大小 u8 len;//接收到的数据长度}rxCtrl_t;rxCtrl_t rxCtrl;

4. 中断服务

有两个中断服务要处理,一个是串口中断,一个是接收定时器超时中断。

串口中断void usartISR(void){ if( 发送结束中断标志==1 ) { 清除此标志 关闭发送结束中断功能 } if( txCtrl.len>0 )  { //把数据装入串口数据寄存器 DR = txCtrl.buf[txCtrl.idx++]; txCtrl.len--; //最后一个字节 if( txCtrl.len == 0 ) {  关闭发送缓冲器空中断,  使能发送结束中断功能 } }  //收到数据 if(接收数据缓冲器非空中断标志==1 ) { 使能并装填定时器的超时值 rxCtrl.buf[rxCtrl.len++] = RD; }  }接收定时器超时中断void timerOutISR(void){ Recevied = TRUE;//通知主程序处理}主程序if(Recevied){ 处理长度为rxCtrl.len的接收数据 //处理完要设置len为0 rxCtrl.len=0; Recevied=FALSE;}

注意⚠️,启动发送是使能发送缓冲器空中断,在发送最后一字节时关闭并使能发送完成中断,这样效率最高。也可以不用发送缓冲器空中断,都改用发送完成中断,但这样效率降低很多。

后面还会讲DMA方式,有什么不明白的,欢迎请留言。

码字很辛苦,谢谢转发与点赞。

02bd0f86afcc307043cc3c95aff1b1b1.gif

9DB针引脚定义

5bd0c698429e1f62a5f19dbd593a3513.png

串口数据帧示意

4665094dd46a0fd8038fb4371f9c7f2f.png

USB转接串口

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

cubemx串口的发送与接收_USART串口通信,中断方式,一分钟从菜鸟到大师(完整版)... 的相关文章

  • 微信小程序静态初步

    社团微信小程序 1 由于兴趣驱动 一直在学习微信小程序 由于之前一直学习Java 但是大三第一学期即将结尾 所以为了能让下学期的学习减少工作量所以就打算利用闲散时间开发小程序 于是就拿社团为例子 自己一步步摸索 现在只是初步学习 所以这些天
  • mysql-Innodb事务隔离级别-repeatable read详解(转)

    mysql Innodb事务隔离级别 repeatable read详解 转 一 事务隔离级别 ANSI ISO SQL标准定义了4中事务隔离级别 未提交读 read uncommitted 提交读 read committed 重复读 r
  • vim配置经典

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 在终端 输入以下命令来编辑vimrc配置文件 sudo vim etc vim vimrc 或者 sudo gedit etc vim vimrc 将其复制粘贴进去 Des
  • GeoDa:入门基础

    前言 GeoDa是一个免费的开源软件工具 用于空间数据分析 它旨在通过探索和建模空间模式来促进数据分析的新见解 GeoDa是由Luc Anselin博士和他的团队开发的 该项目为探索性空间数据分析 ESDA 方法提供了用户友好的图形界面 例
  • mysql中join源码分析,MySQL中Join算法实现原理分析[图]

    在MySQL 中 只有一种 Join 算法 就是大名鼎鼎的 Nested Loop Join 他没有其他很多数据库所提供的 Hash Join 也没有 Sort Merge Join 顾名思义 Nested Loop Join 实际上就是通
  • 把二叉树转换成树(代码实现)

    前言 相信大家都知道二叉树如何转化成树 但是让你用代码实现 却发现自己无从下手 下面我将用代码实现 思想 树用二叉树来存储的话 那么类型是 左儿子 右兄弟 即二叉树某节点和它的左儿子在树中的关系也是父子关系 而与右儿子在树中的关系是兄弟关系
  • 机器视觉中非常好的github仓库

    AwesomeComputerVision Multi Object Tracking Paper List https github com SpyderXu multi object tracking paper list awesom
  • Oracle VM VirtualBox 不显示64位系统 linux 64 redhat 64

    打开BIOS里的虚拟化技术 修改bios中的virtualization 设为ENABLED
  • Elasticsearch 基本使用(三)条件查询

    条件查询 简单查询 term terms range match debug 查看分词结果 match phrase match phrase prefix match bool prefix multi match 复合查询 bool 查
  • 【c++之于c的优化 - 下】

    前言 一 inline 概念 以inline修饰的函数叫做内联函数 编译时C 编译器会在调用内联函数的地方展开 没有函数调用建立栈帧的开销 内联函数提升程序运行的效率 如果在上述函数前增加inline关键字将其改成内联函数 在编译期间编译器
  • 获取outputstream大小_关于inputStream.available()方法获取下载文件的总大小

    如果用inputStream对象的available 方法获取流中可读取的数据大小 通常我们调用这个函数是在下载文件或者对文件进行其他处理时获取文件的总大小 以前在我们初学File和inputStream和outputStream时 有需要
  • C++标准库之中文输出详细介绍【转】

    iostream printf wprintf和中文输出 本文引用出处 http www enjoysoft cn blog post 62 html使用C 标准库的iostream 可以方便地将控制台 文件 字符串以及其它可扩充的外部表示
  • Vue使用v-for遍历map

    功能 遍历数据库中按钮的图片和名字 当页面打开时 触发查询事件 以下图形式显示出来 前端代码 遍历存在数据库中的按钮名称和图片名称 其中按钮的click事件名称和按钮图片名称相同
  • Linux命令 理解

    RPM常用命令参数列表 1 安装一个包 rpm ivh 2 升级一个包 rpm Uvh 注意U一定要大写 i 安装 U 升线安装 h 以 显示安装进度 v 显示附加信息 3 移走一个包 rpm e 4 安装参数 force 即使覆盖属于其它
  • 变透明的黑匣子:UCLA 开发可解释神经网络 SNN 预测山体滑坡

    内容一览 由于涉及到多种时空变化因素 山体滑坡预测一直以来都非常困难 深度神经网络 DNN 可以提高预测准确性 但其本身并不具备可解释性 本文中 UCLA 研究人员引入了 SNN SNN 具有完全可解释性 高准确性 高泛化能力和低模型复杂度
  • 基本的信号——矩阵脉冲信号(门函数)

    门函数的数学表达式为 example1 矩形脉冲信号的matlab代码如下 矩形脉冲信号 clc clear close all t 0 0 001 4 T 1 ft rectpuls t 2 T 2 T plot t ft 运行结果如下
  • Normalize 和 normalized

    首先说明下 normalized的是vector的属性 而Normalize 是vector的方法 normalized和Normalize 都是可读的 读到的值是单位向量的值 只是nomalized不会更改当前vector本身的值 只是返
  • [转载]PropertyChanged 事件

    在 NET平台上 数据绑定是一项令人十分愉快的技术 利用数据绑定能减少代码 简化控制逻辑 通常 可以将某个对象的一个属性绑定到一个可视化的控件上 当属性值改变时 控件上的显示数据也随之发生变化 要实现这一功能 只需要为自定义对象实现 INo
  • Pandas 笔记 (一)

    Pandas 笔记 Pandas 提供高性能 易于使用的数据结构和数据分析工具 Pandas 可以从 CSV JSON SQL MICROSOFTEXCEL 导入数据 Pandas 可以对各种数据进行运算操作 比如归并 再形成 选择 还有数

随机推荐