单片机串口中断以及消息收发处理——对接受信息进行判断实现控制

2023-11-17

目录

本次自己捣鼓的问题:(自己摸索的一个实验)

实现效果:

初步基础:

实现步骤

实验结果:

主要代码


本次自己捣鼓的问题:(自己摸索的一个实验)

以51的单片机来说,用定时器2作为串口1来进行串口实验,检验以下的数据(任意数据)

"hello"--1

"yzh666"--2

"aqawaer"--3

实现效果:

单片机收到这些消息字段后进行判断并在数码管的第一位显示是几号消息,顺便看看串口的实时性如何。

初步基础:

        串口的波特率有很多种,单位是多少位每秒,以9600bps为例,我认为9600位每s,若是无校验8位数据位,一位起始位和一位停止位而构成一个数据帧(共10位),

起始位:1
数据位:8
停止位:1
校验位:0

那么每s能接受960个数据包,每八位为一个字节,那就是没s能接受960个字节(也就是一个char 或者是unsigned char型的数据),那么相当于每1.041ms接受一个字符.

串口中断:每次发送或者接受数据后TI或RI置为1则触发中断(硬件置位),故触发中断后需要软件复位(置为0),优先级低于定时器中断。串口中断一般用于接受数据。

实现步骤

        用一个数组缓存来接受数据,设一个是否有数据来的标记rf ,两次数据传输之前的时间间隔 rt ,设置一个1ms产生一次中断的定时器1,每次定时器1进入中断判断RI:RI为1则rt为0(说明还有数据正在被接受),RI为0(则rt开始计时,计时期间只要RI为1又重新从0开始计数,因为串口每次接受一个数据帧都会被软件置0),当rt>40时,说明(RI为0且40ms内未接受到任何数据判定本次数据接受完毕,发送接受的数据已经清除标记rf ,rt)这里是40ms只是我自己设的。

接受完数据后,用C的库函数strcmp(char *src, char *dst),添加库的头文件"string.h"

strcmp(Rbuf,"awaqaer\r\n")==0来判断是否是接受到对应的数据

实验结果:

我设置为1000ms的间隔自动发送"hello","yzh666","awaqaer"达到了较为满意的效果:

首先是串口:

板子上的效果:

判断这三条数据分别对应的序号:

主要代码

定时器1和串口的代码

void TIME1() interrupt 3{
	
	smg_play(DT[s],s++);
	if(s>7)s=0;
	smgtime++;
	time++;
	if(rf){
		if(!RI){
				if(rt++==40){
				//认为一次数据传输完毕
				 
				Rbuf[i]='\r';
				Rbuf[i+1]='\n';
				Rbuf[i+2]='\0';
					 
					if(strcmp(Rbuf,"yzh666\r\n")==0)DT[0]=1;
					else if(strcmp(Rbuf,"hello\r\n")==0)DT[0]=2;
					else if(strcmp(Rbuf,"awaqaer\r\n")==0)DT[0]=3;
					else DT[0]=0;
					SendString(Rbuf);
						i=0;
						rf=0;
						
				}
		}
		else {
			rt=0;
		}
		
	}
}

void Uart1() interrupt 4{
	
	if(RI){
		RI=0;
		if(!rf){
			rf=1;
			Rbuf[i++]=SBUF;
			}
		else {
			
			Rbuf[i++]=SBUF;
			
		}
	}
	
	
}

还存在的缺陷

        当发送数据的间隔在300ms以上数据的判断没什么问题,但小于300ms,我测的是200ms消息就存在两个消息被当做是同一个消息被接受了,我设置RI==0间隔为10(代码里写的是40)的判断是否是同一个消息的间隔也是这样。以我的理解,9600的bps,传输速率是1个数据帧/1.041ms,等待40个字节的时间也就差不多40ms,程序运行的时间可以不考虑,串口与定时器抢占cpu而导致的误差也不大,因为1ms对cpu而言算很长的时间了。

6月18日更

解决上面存在的缺陷:采用喂狗的方式,还是代码问题,思路都是一样的


void Uart_Handle(){
  	if(RI){
			RI=0;
			rf=1;
			Rbuf[i++]=SBUF;
			rt=5;
		}
}

void uart_work(){
	if(rf && rt == 0 && i > 0){

				Rbuf[i]='\r';
				Rbuf[i+1]='\n';
				Rbuf[i+2]='\0';
					 
					if(strcmp(Rbuf,"yzh666\r\n")==0)DT[0]=1;
					else if(strcmp(Rbuf,"hello\r\n")==0)DT[0]=2;
					else if(strcmp(Rbuf,"awaqaer\r\n")==0)DT[0]=3;
					else DT[0]=0;
					
					SendString(Rbuf);
          i=0;
					rf=0;
		
	}
}

void Uartbuff_Receive(){
	  if(rt && rf) rt--;
	
}

uart_work放while里,在中断里对变量进行自减。以比较好的效果解决上面多条200ms以下命令被识别成一条命令的问题。

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

单片机串口中断以及消息收发处理——对接受信息进行判断实现控制 的相关文章

  • 基于单光子探测的多脉冲周期符合远距离测距

    激光测距技术通过发射主动激光信号对目标进行探测 接收由目标漫反射回来的回波信号并进行统计 处理及换算 从而得到目标的距离 速度信息 实现对目标距离信息的探测 凭借其系统简单 操作灵活 高精度等特点 被广泛运用于民用 科研及军事等各类场合 基
  • Lambda表达式使用详细讲解

    目录 1 新思想 1 1函数式编程思想 1 2 函数式接口 2 通往lambda之路 2 1 什么是lambda表示式 2 2 lambda表示式有哪些特点 2 3 lambda表示式使用场景 2 4 lambda表示式语法 2 5 Lam

随机推荐

  • [Unity] Input.mousetion 屏幕坐标转世界坐标。

    代码如下 Vector3 screenPos Input mousePosition screenPos z 5 0f Vector3 p1 Camera main ScreenToWorldPoint screenPos Vector3
  • 释放数据价值这道难题,Smartbi V11有解

    未来简史 预言 数据将成为人们未来的信仰 未来已来 将至已至 如今 数据所扮演的角色与作用超乎想象 从政府将数据要素列入生产要素之中 到数据驱动型业务场景涌现 企业与组织对于数据及其价值的认可度明显提升 如何充分释放数据价值已成为所有企业与
  • Dijkstra与Bellman-Ford算法对比

    文章目录 TOC Dijkstra Dijkstra 伪代码 Dijkstra 为什么不能有负权重 Dijkstra算法复杂度 Bellman Ford算法 Bellman Ford算法伪代码 Bellman Ford判断是否有负权 Bel
  • 大文件上传如何做断点续传?

    是什么 不管怎样简单的需求 在量级达到一定层次时 都会变得异常复杂 文件上传简单 文件变大就复杂 上传大文件时 以下几个变量会影响我们的用户体验 服务器处理数据的能力 请求超时 网络波动 上传时间会变长 高频次文件上传失败 失败后又需要重新
  • 2020大厂前端面试之vue专题(三)

    21 v model中的实现原理及如何自定义v model v model 可以看成是 value input方法 的语法糖 input v model checkbox v model select v model 组件的v model
  • PS替换证件照背景颜色

    PS换背景颜色 1 选择 中的 色彩范围 快速抠图换底 2 点击下 原背景 即可选中 调整 颜色容差 预览中 白色为选中的部分 3 调整好背景选区后 按delete 键 增加一个 新背景颜色的图层 放置到刚删除背景的图层下边 4 此时可能
  • 在排序数组中查找元素的第一个和最后—个位置

    include
  • vscode c++ 的环境配置 (完美版)

    怎么下载MinGW64 https blog csdn net skh2015java article details 85075032 vscode c 的环境配置 https blog csdn net qq 43041976 arti
  • ElasticSearch--Field的使用

    目录 一 Field的介绍 二 Field的属性介绍 三 常用的Field类型 一 text文本字段 二 keyword关键字字段 三 date日期类型 四 Numeric类型 四 Field属性的设置标准 一 Field的介绍 上周的一篇
  • 顺丰科技 Hudi on Flink 实时数仓实践

    关注 Flink 中文社区 获取更多技术干货 摘要 本文作者刘杰 介绍了顺丰科技数仓的架构 趟过的一些问题 使用 Hudi 来优化整个 job 状态的实践细节 以及未来的一些规划 主要内容为 数仓架构 Hudi 代码躺过的坑 状态优化 未来
  • 【MindSpore易点通】深度学习系列-那些介于模糊与清楚之间的一些概念

    之前小编就给大家提过正则化 超链接 其实还有很多定义大家是有点模糊又有点清楚的 今天好好带大家一起捋一遍 1训练集 验证集 测试集 正确地配置训练 验证和测试数据集 会很大程度上帮助大家创建高效的神经网络 即使是深度学习专家也不太可能一开始
  • Ubuntu18.4开机时进入命令行界面或进入bios设置

    开机时进入命令行界面 开机时按ctrl alt Fx Fx是从F1到F6选择一个 ctrl alt F7切换到图形界面 开机时进入bios设置 开机时按F2
  • c++实现合并两个有序链表

    leetcode题目 力扣 执行结果 代码实现 Definition for singly linked list struct ListNode int val ListNode next ListNode val 0 next null
  • 输入引脚时钟约束_时钟树例外(exclude pin、stop pin、non_stop pin、float pin)

    时钟树例外 exclude pin stop pin non stop pin float pin 回复 以下关键词 查看更多IC设计教程 目前支持的关键词有 Innovus ICC or IC Compiler DC or Design
  • 等保2.0测评综合得分计算

    文章目录 概述 公式及说明 分类计算实例 单一对象 多个对象 结果 未经本人许可 不能转载 转发 2021 6 20更新 2021新版的等保测评报告6 17出炉 6 18启用 新版综合得分计算可以看这里 这里 新版测评综合得分计算实例看 这
  • spring中的单元测试的策略

    本文主要介绍使用spring提供的对junit的扩展机制来进行单元测试 没有设计mock方面的测试 一 Spring提供的JUnit框架扩展 AbstractSpringContextTests spring中使用spring上下文测试的J
  • js高级 7.原型链继承

    原型链继承 套路 定义父类型构造函数 给父类型的原型添加方法 定义子类型的构造函数 创建父类型的对象赋值给子类型的原型 将子类型原型的构造属性设置为子类型 给子类型原型添加方法 创建子类型的对象 可以调用父类型的方法 关键 子类型的原型为父
  • AI人工智能Mojo语言:AI的新编程语言

    推荐 使用 NSDT场景编辑器 快速搭建3D应用场景 Mojo的主要功能包括 类似Python的语法和动态类型使Python开发人员易于学习Mojo 因为Python是现代AI ML开发背后的主要编程语言 使用Mojo 您可以导入和使用任何
  • RPC(远程过程调用)详解

    转自 https blog csdn net daaikuaichuan article details 88595202 仅用于自己学习使用 如有侵权删 一 RPC是什么 RPC是指远程过程调用 也就是说两台服务器A B 一个应用部署在A
  • 单片机串口中断以及消息收发处理——对接受信息进行判断实现控制

    目录 本次自己捣鼓的问题 自己摸索的一个实验 实现效果 初步基础 实现步骤 实验结果 主要代码 本次自己捣鼓的问题 自己摸索的一个实验 以51的单片机来说 用定时器2作为串口1来进行串口实验 检验以下的数据 任意数据 hello 1 yzh