单片机串口数据处理(1)——串口中断发送数据

2023-10-31

实时性在嵌入式开发中的非常重要,优化MCU串口传输处理方式可以提高嵌入式系统的实时性。在互联网上学习并亲自实验(基于STM32单片机)后,我将分两次介绍优化MCU串口收发数据的方法,参考资料将在第二篇博客中列出。第一次先介绍串口发送数据的优化。

发送方式一:

方式一采用“死等”的方式发送数据,即在while循环中等待字发送完成标志位置位。

void usartsend(void)
{
    while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); //等待上一字节发送完成 
    USART1->DR=txbuf[cnt]; //要发送的字节存入串口数据寄存器 
}

void sendcmd(void)
{
    for(cnt=0;cnt<100;cnt++)//发送100个字节
    {
        usartsend();//调用字节发送函数
    }
}

这种方式在while循环中消耗了大量时间,而且sendcmd函数中一遍遍地调用usartsend函数也比较费时。实验中我采用的波特率为115200,理论上发送完100字节数据耗时约8.68ms,而在硬件仿真时的耗时约9.45ms。在这9.54ms内,MCU除了发送字节和while等待外没有处理其他任务,严重影响系统实时性。

发送方式二:

方式二采用中断的方式发送数据。要发送数据时,使能串口的发送缓冲区空中断,在ISR中判断是否有数据要发送,如果有,则将要发送的字节存入串口数据寄存器。当所有数据发送完毕后禁止串口的发送缓冲区空中断。

void usartsend(void)
{
    USART_ITConfig(USART1,USART_IT_TXE,ENABLE);//使能串口的发送缓冲区空中断
}

void USART1_IRQHandler(void) //串口1的ISR              
{
    if(USART_GetITStatus(USART1,USART_IT_TXE)==SET)
    {
        USART1->DR=txbuf[cnt];
        cnt++;
        if(cnt>=100)
        {
            USART_ITConfig(USART1, USART_IT_TXE, DISABLE);//数据发送完毕,禁止串口的发送缓冲区空中断
        }
    }
} 

这种方式主要是ISR占用时间。采用115200的波特率实验时,发送100字节数据用时约8.51ms。用时小于理论时间(8.68ms)的原因可能是最后一个字节没发送完程序就到了我设的断点。

第二种方法的用时比第一种方法少。更值得注意的是第二种方法花费的8.51ms是分片的,程序不会死等8.51ms,在此期间MCU可以处理其他任务,系统的实时性高。而第一种方法程序死等9.54ms,MCU在此期间无法处理其他任务,实时性收到严重影响。

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

单片机串口数据处理(1)——串口中断发送数据 的相关文章

随机推荐

  • 腾讯云数据库TDSQL:分布式数据库,你真的了解吗?

    分布式数据库进入人们的视野已经很久了 相对于传统的集中式数据库 分布式数据库在高性能 高可用 平滑拓展 高可靠 低成本等许多方面具有优势 但时至今日 关于分布式数据库 似乎一直缺少足够权威和客观的解读 现在 国家白皮书来了 为了明确分布式数
  • Vue SSR(vue服务端渲染)

    SSR的应用场景 1 SEO需求 SEO Search Engine Optimization 搜索引擎优化 是一种利用搜索引擎规则 提高网站在搜索引擎内自然排名的技术 通常这需要页面内容在页面加载完成时便已经存在 前后端分离的纯前端项目
  • ECCV 2022

    ECCV 2022 Learning Implicit Feature Alignment Function for Semantic Segmentation概述与代码分析 论文 https arxiv org abs 2206 0865
  • SPEED 飞车扩容改造:敢于对过去说不

    欢迎大家前往腾讯云社区 获取更多腾讯海量技术实践干货哦 作者 wincent 导语 敢于对过去的脚本说不 前言 QQ飞车作为一款竞速游戏 从08年至今十年光阴 依然坚挺 能运维一款这样的产品 非常的荣幸 压力和动力都是有的 有压力才有动力
  • 一段程序:SAP使用ODI方法为WORD填充数据

    未做测试 仅记备查 原文地址 http blog sina com cn s blog 3eefd36c01008cmz html 原理 通过 CALL METHOD DOCUMENT gt GET MAIL MERGE INTERFACE
  • Linux学习系列一:Linux的简单介绍以及命令行的基本操作

    这个系列的Linux教程主要参考刘遄老师的 Linux就该这么学 用的系统是RHEL8 如果遇见一些命令出现问题 请首先检查自己的系统是否一致 如果不一致 可网上查一下系统间某些命令之间的差异 目前设计的这个Linux学习系列的目录如下 会
  • 促进内容营销策略的 12 个 ChatGPT 技巧

    作为营销大亨 您可能并不陌生于创建脱颖而出并让您的读者着迷的内容的重要性 然而 集思广益 制作和编辑内容以及推广它可能是耗时 压倒性的 让我们面对现实吧 你宁愿外包它 或者至少得到一些帮助 你可能听说过它 实际上 谁没有听说过 但让我重新认
  • 2021年Linux技术总结(三):根文件系统(rootfs)

    一 根文件系统简介 Linux系统三大块 U boot kernel以及最后这个rootfs 跟文件系统 在kernel中 启动流程的最后会调用 prepare namespace 函数 挂载根文件系统 这里就是挂载的本篇要说的 根文件系统
  • You have mail in /var/spool/mail/root

    转载http www fedora hk linux yumwei show 17 html 安装完LINUX后经常使用终端远程登录 登录后经常出现You have new mail in var spool mail root的提示 很是
  • 如何在不卸载Revit插件的情况下禁用插件?

    如何在不卸载Revit插件的情况下禁用某个插件 这个问题对于Revit开发的朋友 不是问题 但对于Revit的终端用户 可能就无从下手 解决此问题的答案就是禁用插件的 addin文件 Revit的插件注册方式之一就是通过 addin文件 我
  • 图书系统相关代码

    import java util Objects import java util Scanner Author Ben Date 2020 10 29 13 32 public class Test3 图书馆接口 Library 成员方法
  • python修改voc格式数据集的xml文件的name标签(class_label)

    import os path import xml dom minidom import xml etree ElementTree as ET path D yolov4 tiny pytorch master yolov4 tiny p
  • SurfaceView和普通view的区别及简单使用

    1 SurfaceView介绍 SurfaceView第一印象它是一个view 因为它继承了View 有两个直接子类GLSurfaceView VideoView 但根据SDK文档SurfaceView和普通的view又有较大区别 最显著的
  • redis持久化-归纳

    部分参考地址 较详细 https baijiahao baidu com s id 1654694618189745916 简明扼要 https blog csdn net qq 39291929 article details 10343
  • 数据库相关及SQL语句(MySQL和SqlServer)基础

    以下是我自己开发的总结 欢迎指正 0 概括 sql语句的大小写问题 要根据数据库的大小写敏感配置而决定 以下随意 数据库建模软件PowerDesigner要熟练使用 了解物理模型生成建表sql和对数据库进行逆向工程建模 会操作即可 sqls
  • Vue2 与Vue3的区别?面试题

    Vue 2和Vue 3是Vue js框架的不同版本 在面试中经常涉及到它们之间的区别 以下是Vue 2和Vue 3的主要区别 性能提升 Vue 3在性能方面进行了优化 Vue 3引入了更高效的Diff算法 提高了渲染性能 此外 Vue 3还
  • sqlserver新增主键自增_SQLSERVER自增主键

    SQLSERVER自增主键 SQLServer 中含自增主键的表 通常不能直接指定ID值插入 可以采用以下方法插入 1 SQLServer 自增主键创建语法 identity seed increment 其中 seed 起始值 incre
  • 连续正弦信号使用FFT做频谱分析

    一个偶对称的连续波 如何用FFT做频谱分析 用正弦信号做了个例子 不论任何连续信号 都可以仿照这个例子进行频谱分析 Name sinfft m Desc 使用FFT求y sin 2 pi 10 t 的频谱 抽样频率为40hz 大于信号最高频
  • java8 list统计(求和、最大、最小、平均)

    list stream mapToDouble User getHeight sum 和 list stream mapToDouble User getHeight max 最大 list stream mapToDouble User
  • 单片机串口数据处理(1)——串口中断发送数据

    实时性在嵌入式开发中的非常重要 优化MCU串口传输处理方式可以提高嵌入式系统的实时性 在互联网上学习并亲自实验 基于STM32单片机 后 我将分两次介绍优化MCU串口收发数据的方法 参考资料将在第二篇博客中列出 第一次先介绍串口发送数据的优