延时程序的必要性

1 前言

安卓蓝牙开发属于软硬件交互过程,在通信过程中难免出现一些意想不到的bug,本篇文章将介绍由于延时问题引发的一些bug。

2 关闭搜索延时

通常情况下,在连接设备之前要关闭手机的蓝牙搜索功能,但是当调用cancleDiscovery()或者stopLeScan()方法停止搜索设备时,并不能瞬间完成停止搜索工作。因此,在发起连接之前最好等待一段时间,等待手机关闭搜索后在发起连接。

3 扫描服务延时

当onConnectionStateChange()方法回调时,其中参数newState == BluetoothGatt.STATE_CONNECTED时,此时表面设备已经连接上,此时,应调用discoverServices()方法扫描服务。
  但是在实际使用中发现:若设备蓝牙刚切换至广播状态,手机端搜索到设备发起连接。当连接成功时,马上去扫描设备服务,偶尔会出现服务获取失败的情形。因此,当设备连接上,需要加上几百毫秒延时之后在调用discoverServices()方法。

4 监听成功,发送命令延时

在进行Ble蓝牙开发时,需要在开启UUID监听之后才能回调onCharacteristicChanged()方法。在测试过程中偶尔出现notify成功后马上发送数据给设备,但是设备无响应。因此通常开发过程中,向设备发送指令前加上一段延时程序,保证设备处于可响应状态。

5 结语

在蓝牙开发中由于延时引发的问题很多,目前主要发现的延时bug有以上几种,欢迎大家留言讨论。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
电子时钟设计 简介 该设计主要由单片机AT89C51和液晶显示器组成,实现常用的实时电子钟功能。利用 可编程芯片AT89C51强大的功能,我们了实现日历功能、时钟功能。该时钟使用液晶显示 器作为显示模块,使用3个弹性小按键作为输入模块,调节年、月、日、星期、时、分、 秒。 一.方案比较与论证 根据设计要求,该时钟系统可分输入部分、处理部分和显示数据部分。其输入部分是 键盘输入数据调整要显示的内容,处理部分单片机接收并通过算法处理键盘输入的信息 变成显示模块所能接受的信息,显示部分是用来实时显示处理部分处理后的数据。 输入模块我们选用三个独立弹性小按键来实现,选用矩阵式键盘则太浪费资 处理模块我们选用了STC公司的STC89C52芯片来,与Atmel公司生产的AT89S52一样,也是 40脚双列直插式封装,这里芯片对刚学单片机的人来说容易入手,其功能也很强大,用 来实现一个电子钟完全足够了。 显示部分我们可有两种选择:数码管和1602液晶显示器。实现一个电子钟若用数码管则 需6个,所占空间相对大了些,而且我们还要实现日历的功能,需要更多的数码管,所点 空间翻倍,而且还会造成单片机I/O引脚滥用甚至不够用,用液晶显示器来实现则方便得 多,界面也相对友好,但液晶显示器有个缺点就是价格比较贵。因此我们最终选择了16 02液晶显示器。另处独立弹性小按键具有价格便宜、容易获得、容易控制等特点。 二.系统理论分析、计算与电路仿真 1、定时器与断原理 电子钟主要是利用单片机的定时器/计数器和断来实现。定时器实际是加1计数器,单 片机每运行一个机器周期定时器就自动加1,当计到所定的数N时,单片机就产生一次 断,停下所做的工作,转而去执行断服务程序。单片机每个机器周期等于外部晶振的 12个振荡周期,当外部晶振是12MHz时,则每个机器周期的时间是 Tcy = 12×1/12=1µm (2-1) 定数器设为N时,即每计到N时产生一次断,而一次断的时间为: t = N×Tcyµm (2-2) 当产生X(x根据N来设置,两者之积为1000000)次断后我就知道过了1s,再通过液晶 显示出来,这样就达到了让液晶每隔一秒跳一下的目的了。 2、proteus仿真结果 3、液晶部分 图4-3 液晶1、2端口分别是工作电源的负、正极,15、16是液晶背光灯电源正负极,R4起限流 作用,避免电流过大烧坏背光灯。第3端口还可接一电位器,调节液晶显示对比度。无标 号的8个端口是数据端,通过一上拉电阻接到单片机的 P0口。 三.系统的软件设计(如必要,含有流程图) 1、程序流程图 流程图的X表示液晶秒、分、时、星期、年、月、日的任一个。 图5-1 主程序流程图 图5-2 扫描键盘的子程序流程 四.系统测试及结果 测试结果总的来说很满意,比预计的还要好。但由于断函数代码较长,故存在 一定程度的误差,用秒表测试大约为每5分钟慢了一秒,这个问题是用单片机定时器来数 时所无法解决的,断函数必定会较长,处理这一函数会花费一定的时间这就无法做到 让时钟走得很精确。解决方法是用一时钟芯片来实现,由于时钟芯片不好买又比较贵( 新的20几块一片),暂时就不考虑了,有机会再尝试。 1. 源程序 //主函数放在最后面 #include <reg51.h> #define uchar unsigned char #define uint unsigned int sbit rs=P2^4;//定义液晶数据命令选择端 sbit lcden=P2^5;//液晶使能端 sbit s1=P2^0;//按键1 sbit s2=P2^1;//按键2 sbit s3=P2^2;//按键3 uchar count,s1num; char shi,fen,miao;//时、分、秒 char year,month,day,week;//年月日星期 void delay(uint x)//延时子程序 { uint j,k; for(j=x;j>0;j--) for(k=110;k>0;k--); } //----液晶写命令功能--- void write_com(uchar com) { rs=0; lcden=0; P0=com; delay(5); lcden=1; delay(5); lcden=0; } //---液晶写数据功能----- void write_date(uchar date) { rs=1; lcden=0; P0=date; delay(5); lcden=1; delay(5); lcden=0; } //----------写入时、分、秒--------? void write_sfm(uchar add,uchar date) { uchar shi,g
51单片机是一种常用的微控制器芯片,而PT100则是一种常用的温度传感器。升温程序是指控制PT100温度传感器的输出信号,实现温度上升的过程。 在使用51单片机编写PT100升温程序时,可以按照以下步骤进行实现: 1. 初始化:通过设置相应的引脚和寄存器,将51单片机与PT100温度传感器连接起来,并初始化串口通信、定时器等必要的功能。 2. 温度读取:通过信号转换电路将PT100传感器的模拟信号转换为数字信号输入到51单片机的相应引脚。使用ADC模块对该引脚进行读取,将模拟信号转换为数字信号,获取当前温度数值。 3. 比较温度:将读取到的当前温度与目标温度进行比较。如果当前温度低于目标温度,进入下一步;如果当前温度已经达到或超过目标温度,则结束升温程序。 4. 控制升温:通过控制输出引脚的高低电平,控制加热器等外部设备的工作状态。当当前温度低于目标温度时,输出高电平控制加热器加热;当当前温度达到目标温度时,输出低电平停止加热。 5. 延时等待:为了控制升温过程的稳定性,可以设置适当的延时时间,让51单片机在每次进行温度读取和比较后等待一段时间再继续下一次的温度检测。 6. 循环执行:以上步骤需要循环执行,直到当前温度达到或超过目标温度为止。可以通过while循环或定时器断等方式实现循环控制。 总结:以上是一种简单的51单片机PT100升温程序的实现思路,具体实现需要根据具体的硬件电路和编程环境进行调整和优化,以满足实际需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值