单片机多字节串口接收(转)

2023-10-26

转自:http://bbs.ednchina.com/BLOG_ARTICLE_3007162.HTM

  工作了一年多,写了不少单片机串口程序。感觉串口多字节接收部分的逻辑相对于配置寄存器跟串口回复来说,是有点难度的——寄存器配置基本上都是死的,串口回复多字节跟回复一字节只是多了一个循环。

 

        串口接收程序是基于串口中断的,单片机的串口每次接收到一字节数据产生一次中断,然后再读取某个寄存器就可以得到串口接收的数据了。然而在实际应用当中,基本上不会有单字节接收的情况。一般都是基于一定串口通信协议的多字节通信。在422或者485通信中,还可能是一个主机(一般是计算机)带多个从机(相应的有单片机的板卡)。这就要求我们的单片机能够在连续接收到的串口数据序列中识别出符合自己板卡对应的通信协议,来进行控制操作,不符合则不进行任何操作。简而言之就是,单片机要在一串数据中找到符合一定规律的几个字节的数据。

 

        先来说下怎样定串口协议吧。这个协议指的不是串口底层的协议,而是前面提到的数据帧协议。一般都是有帧头(2~3个字节吧),数据(长度根据需要),结束位(1位,有时候设计成校验字节,最简单的校验也就是前面所有数据求和)。

        比如0xaa 0x55 +(数据部分省略)+校验和(除了aa 55 之外数据的和),如果要是多板卡的话有时候还要在帧头后面加一个板选字节(相当于3字节帧头了)。

 

       第一次写串口接收程序的时候,我首先想到的就是定义一个全局变量(实际上最好是定义局部静态变量),初始值设置为0,然后每进一次中断+1,然后加到串口通信协议的长度的时候再清零。然后判断帧头、校验。写完了之后我自己都觉得不对,一旦数据错开了一位,后面就永远都接收不到数了。无奈看了一下前辈们的代码,跟我的思路差不多,只不过那个计数值跟接收到的数据时同时判断的,而且每次中断都要判断,一旦不对计数的那个变量就清零。

 

       废话少说,直接上一段代码让大家看看就明白了。(通信协议姑且按照简单的aa 55 一个字节数据 一个字节校验,代码是基于51单片机的)。接收成功则在中断程序中把串口接收成功标志位置1。

 

下面是全局变量定义

unsigned char receive[4]={0,0,0,0};//接收缓存

bit uart_flag;//串口接收成功标志

 

然后串口中断部分

void ser()interrupt 4

{

static unsigned char count;//串口接收计数的变量

  RI=0;//手动清某个寄存器,大家都懂的

  receive[count]=SBUF;

  if(count==0&&receive[count]==0xaa)//同时判断count跟收到的数据

  {

       count=1;

  }

  else if(count==1&&receive[count]==0x55)

  {

     count=2;

  }

  else if(count==2)

  {

       count++;

  }

  else if(count==3&&receive[count]== receive [2])//判断校验和&#

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

单片机多字节串口接收(转) 的相关文章

随机推荐

  • jdk8新特性-方法引用

    1 作用 什么是方法引用 方法引用是jdk8推出的一个新特性 在一定的条件下可以替换lambda表达式 可以理解为方法引用实际上还是一个lambda表达式 lambda表达式用法可参见 https blog csdn net xiao yu
  • Centos7 使用yum命令安装软件失败,报错"Couldn't open file /media/cdrom/repodata/repomd.xml"

    今天使用CentOS7安装docker的时候 安装失败 报错 yum install docker 已加载插件 fastestmirror langpacks file media cdrom repodata repomd xml Err
  • java记录操作日志(对象修改细节)

    背景 由于业务涉及收入敏感信息 需记录数据变更前的内容和变更后的内容 但是不能为完成任务而硬编码 要适用于不同bean 针对这种情况 本文使用泛型 反射和基于AOP的自定义注解技术来完成 对对象属性的描述通过自定义注解来完成 读取里面的属性
  • 使用Cytoscape画PPI网络图

    打开Cytoscape软件 根据菜单导入string interactions tsv文件 File gt Import gt Network from File 会弹出下图对话框 在对话框中设置如下 选中string interactio
  • Spring Cloud 2020.0.0 正式发布,对开发者来说意味着什么?

    作者 YourBatman 在线教育领域资深架构师 Spring Framework 开源贡献者 冷冷 云集架构师 开源项目 pig 负责人 Spring Cloud Alibaba Committer 来源 阿里巴巴云原生公众号 北京时间
  • 生成模型的2022年——人工智能AIGC顶级论文回顾

    2022年是生成模型奇幻发展的一年 Stable Diffusion 创造了超现实主义的艺术 ChatGPT 回答了生命意义的问题 Make a Video 从文本生成了栩栩如生的马儿 DreamFusion 生成了不可思议的三维模型 多个
  • java不是纯面向对象的语言,太原java培训班:Java到底是不是一种纯面向对象语言?(二)...

    参考译文 Java官方描述 参考翻译 以上都说明 在JVM内部 其实原始类型就是对象 当你打开 Javadoc 对 Class 类的定义中 通过 CTRL F 查找关键字 primitive 将会发现证据在表面 在JVM里 它把基本类型当作
  • RMAN备份数据库_使用RMAN备份数据库文件

    1 使用RMAN备份整个数据库 可以在数据库挂载或打开时执行整个数据库备份 使用BACKUP DATABASE命令从RMAN提示符中执行整个数据库的备份 你可能想从整个数据库备份中排除特定的表空间 可以通过执行CONFIGURE EXCLU
  • Python url转换成a标签

    tornado中自带的工具可以实现 from tornado escape import linkify linkify https www google com Out 8 a href https www google com http
  • vscode的配置文件setting.json的UI界面或者json形式

    快速打开 使用快捷键 Ctrl Shift P 然后搜索setting 首选项 打开设置 json 这个打开的是settings json文件 首选项 打开默认设置 json 这个打开的是defaultSettings json文件 首选项
  • 解放双手!用 Python 控制你的鼠标和键盘

    在工作中难免遇到需要在电脑上做一些重复的点击或者提交表单等操作 如果能通过 Python 预先写好相关的操作指令 让它帮你操作 然后你自己去刷网页打游戏 岂不是很爽 很多人学习python 不知道从何学起 很多人学习python 掌握了基本
  • Java 数字补零

    一共六位数字 不足数字前补零 int num 123 String lkm String format 0 6 d num
  • centos7 安装VNC Server

    linux系统给给开发者带来性能的便利 但是失去了window系统的界面化管理的便利 下面介绍怎么通过在linux系统上实现界面化操作 CENTOS为例 本文详细讲解在centos下安装VNC 服务并用 VNC viewer 连接 VNC
  • ChatGPT变笨了,好在还有自知之明

    大家好 我是老章 好久没有写文章了 顺便向大家汇报一下最近在忙的事情 多数无疾而终 1 开发了一个IMG2Latex工具 截图一个公式 自动把latex代码塞进剪贴板 2 开发了一个播客转文字稿 文字稿摘要工具 3 为ExcaliDraw添
  • 利用ENVI对LANDSAT系列数据进行预处理步骤

    数据来源 地理空间数据云 首先 利用envi打开 File gt Open 下载好的Landsat数据中的MTL txt文件 进行辐射定标 在工具栏Toolbox中搜索 Radiometric Correction gt Radiometr
  • linux发行版之间的联系和区别

    什么是Linux发行版 Linux的发行版说简单点就是不同的厂商根据个自不同的理念 针对不同使用方向 个人桌面 服务器等 将Linux内核进行不同侧重点的优化与图形界面的设计 并对常用的应用软件做一个打包 进行发行的系统 称之为发行版 大部
  • CRM 2013 安装前系统和数据库的基础配置

    Win Serer 2012 域控安装参考 http smallc blog 51cto com 926344 1034868 其中最重要的几步 创建域控 ActiveDirectory域服务 加域 创建IIS Web服务器 IIS SQL
  • RSA算法计算

    RSA算法简单计算 5个公式 n p q n p 1 q 1 求 n e d mod n 1 求e d其中之一 c m e mod n 加密 m c d mod n 解密 字符说明 p q为两个素数 n为p q乘积 为欧拉函数 n 为小于或
  • Awt+Swing+Mysql实现超市商品交易管理系统(含全部代码)

    目录 成果展示 数据库表格准备 绘制窗体以及组件 主窗体 登录面板 上架商品面板 下架商品面板 操作商品面板 数据面板 展示表格 关键技术与思路 与数据库建立连接 对数据库数据进行增删改 查询数据 验证状态 切换面板与点击触发事件 全部代码
  • 单片机多字节串口接收(转)

    转自 http bbs ednchina com BLOG ARTICLE 3007162 HTM 工作了一年多 写了不少单片机串口程序 感觉串口多字节接收部分的逻辑相对于配置寄存器跟串口回复来说 是有点难度的 寄存器配置基本上都是死的 串