最近的android蓝牙开发项目也逐渐接近尾声,基本的功能都已经完成,只剩下界面的设计。现在真的是舒了一口气!

作为编程学习经验只有1年的菜鸟,这是我独自完成的商业性产品,而且还是涉及到与单片机蓝牙模块的底层通信,难度自然不小。最大的难度不是知识点不懂,而是调试,因为干扰因素实在是太多,很难找出是软件的问题还是硬件的问题,所以,在代码中一定要设置好调试点,以方便查询问题的症结点。

线程也是一个考虑的因素。凡是涉及到I/O的编程,都是一个不小的难题,因为它里面会涉及到线程问题。java的线程库的确非常方便好用,但要想正确的使用还是一个值得研究的话题,最坏的情况就是我们胡乱的使用线程技巧结果导致无谓的线程开销。

当然,这里的线程还是非常简单,关于同步,锁机制这些高级的话题根本没有用到,基本的线程知识就已经够用了。

与蓝牙模块通信最重要的地方就是数据的发送和接收,因为是底层的操作,所以更多是发送16进制数据。

进制转换是我们程序员的必修课,属于基本素质。这里需要的是将字节数组转化为16进制字符串,方法都是通用的:

 public static String bytesToHexString(byte[] bytes) {String result = "";for (int i = 0; i < bytes.length; i++) {String hexString = Integer.toHexString(bytes[i] & 0xFF);if (hexString.length() == 1) {hexString = '0' + hexString;}result += hexString.toUpperCase();}return result;}

接下来就是发送数据。

发送数据非常简单,之前有关于蓝牙编程的博文已经讲到了,http://www.cnblogs.com/wenjiang/p/3200138.html,这里只讲重要的一点:大容量字节数组的发送。

我们需要发送64个字节的数组,如果一次性发送过去,单片机那里可能无法及时处理以致没有任何回应,因为单片机那里是设置了数据接收的延时时间。要想畅通的与蓝牙模块通信,考虑这个时间差非常重要。调整字节的发送速率,就成为非常关键的一步。值得注意的是,数据的发送是非常快的,就是因为这样才会导致单片机那里无法及时处理,所以,每次发送后的延时是非常重要的。我们单片机那里的延时是10毫秒,所以我们选择发送完每个字节后就延时10毫秒再发下个字节。

 for (byte b : bytes) {out.write(b);Thread.sleep(10);}

具体的延时时间和字节发送速率得看单片机那里程序的设置。
     在使用InputStream的时候,必须注意,InputStream的读取是阻塞的。这点在一般的情况下是不会影响到我们的程序,但是记住这个情况对于代码的设计是非常重要的,尤其是在考虑用户体验的时候。

无参数的read()是每次只从流中读取一个字节,这种做法效率非常低,但是简单,像是读取整数值这种情况,使用read()就非常好,但如果是16进制字符串呢?使用InputStream.read(byte[] b)或者InputStream.read(byte[] b,int off,int len)方法,这样一次就能读取多个字节。

如果是读取多个字节,我们常常使用InputStream.available()方法来获取数据流中可读字节的个数。读取本地数据的时候,该方法发挥得非常好,但如果是读取非本地数据,就可能出现字节遗漏的问题,像是要读取100个字节,可能就是90个,甚至是0个。

出现0个的情况就是单片机那边没有响应或者字节还没发送过来,这时我们就需要一个循环来保证我们能够拿到数据:

  int count = 0;while (count == 0) {count = in.available();}byte[] bytes = new byte[count];in.read(bytes);

但像是上面的90个字节的情况就是字节遗漏。对于这种情况,解决方法也很简单:

  byte[] bytes = new byte[count];int readCount = 0; // 已经成功读取的字节的个数while (readCount < count) {readCount += in.read(bytes, readCount, count - readCount);}

最好是这么写,因为Java的API已经明确的告诉我们,read()方法并不能保证读取到我们想要的字节数。
      这样我们就能解决16进制数据的发送和读取了。

转载于:https://www.cnblogs.com/wenjiang/p/3222078.html

android 蓝牙编程重点---如何发送和接收16进制数据相关推荐

  1. Arduino串口发送与接收16进制数据(HEX)(数据乱码)-JDY-10M组网

    最近使用JDY-10M蓝牙组网,需要Arduino收发数据,将遇到的一些问题与最终解决方法分享给大家,如果内容有问题,还请大家指点. 1.JDY-10M组网 关于如何JDY-10M如何组网网上介绍,这 ...

  2. php接收16进制数据,PHP_PHP 通过Socket收发十六进制数据的实现代码,最近在php下做关于Socket通讯的 - phpStudy...

    $sendStr = '30 32 30 34 03 30 33';  // 16进制数据 $sendStrArray = str_split(str_replace(' ', '', $sendSt ...

  3. 51单片机串口发送多个16进制数据

    串口发收数据 发送主要逻辑 接收主要逻辑 计算波特率 完整代码 避坑指南 发送主要逻辑 一:声明一个你要发送的字符串列表 unsigned char code table[]={0x7E,0x03,0 ...

  4. java socket发送16进制_JavaSocket短连接实现分别接收字符串和16进制数据

    做个笔记,在接收16进制数据的时候乱码了.原因是Socket在接收数据的时候需要根据不同的数据定义不同的接收方式,也就是约定好传输协议(具体体现在后面服务端接收16进制那里). 字符串的发送接收 字符 ...

  5. 微信小程序蓝牙BLE开发——写入一串16进制数据,低字节在前(五)

    微信小程序BLE发送一串16进制数据,低字节在前 文章目录 微信小程序BLE发送一串16进制数据,低字节在前 场景 获取UTC时间 写入数据 向设备发送16进制数据 字节转换 验证发送UTC时间 场景 ...

  6. python3.6串口编程实例_Python3 串口接收与发送16进制数据包的实例

    Python3 串口接收与发送16进制数据包的实例 如下所示: import serial import string import binascii s=serial.Serial('com4',9 ...

  7. python socket发送16进制数据_Python UDP Socket 16进制数据发送

    注:此篇文章首次发表于我的一篇CSDN博客里边,现转载于此. 今天琢磨了一下Python UDP Socket 16进制数据发送. 原以为UDP发送和接受的都是字符,怎么能够发送16进制?但细想,其实 ...

  8. java串口发送16进制数据_MFC串口通信发送16进制数据的方法

    本文实例为大家分享了MFC串口通信发送16进制数据的具体代码,供大家参考,具体内容如下 MFC串口通信会使用m_mscomm控件. 发送数据一般是在edit control 里输入自己想发送的内容,然 ...

  9. python socket发送16进制数据_python socket以16进制的数据进行传递与解析

    参考:http://m.blog.csdn.net/blog/JasonQue/8256424 具体的struct模块的解释可以参照上面的链接. struct.pack也就是将数据按照二进制的格式进行 ...

  10. 串口调试助手 发送16进制与现实16进制数据

    话不多说,直接干货. 使用串口助手发送16进制数据: 如图所示:第一步,选中16进制发送. 第二步:输入你要发送的数据(所有的16进制数据去掉0x符号) 第三步:点击16进制显示 第四步:查看返回值 ...

最新文章

  1. 邁向IT專家成功之路的三十則鐵律 鐵律十四:IT人言談之道-守中
  2. docker安装nginx实例
  3. 计算机虚拟建造创新实践英语,《信息技术促进初中英语学科教学的实践研究》结题报告...
  4. 自动平衡男女比例的随机分组软件B2G使用教程,献给组织
  5. 计算机专业报专转本可以志愿,2019年专转本志愿怎么填?专家透露报考窍门
  6. Android之 Fragment
  7. AUTOSAR从入门到精通100讲(二十)-特斯拉、高通、华为AI处理器深度分析
  8. 申威 linux内核,一种申威防火墙快速移植高版本linux内核的方法与流程
  9. word转PDF图片很糊or word自带公式编辑器公式自动编号转PDF括号没了
  10. linux 新建文件夹命令
  11. win10专业版没有触摸板选项_win10没有显示触摸板
  12. 50个认知偏误:Elon Musk thinks everyone should know about
  13. 毕业一年后,我为什么选择去香港做IT?
  14. 文本数据挖掘----初识数据挖掘
  15. Codeforces 106 Buns【多重背包】
  16. 未来教育二级mysql怎么做题_计算机二级买了未来教育,但是不知道该怎么学习,就是单纯的刷题吗?感觉没有书有点不习惯,怎么办?...
  17. 基于ASRT的开源实时语音转文本
  18. Oracle公司中文翻译为“甲骨文”的来源是什么?
  19. 24种设计模式的定义和使用场合
  20. oneshot一次性服务

热门文章

  1. 送书!60 本签名书!
  2. AndroidDeveloper Weekly No.1
  3. Nginx configure
  4. C/C++ Bug记录
  5. 用Arduino+OSC建立一个iPad铁路王国巡视机
  6. 使用jQuery快速高效制作网页交互特效(1)
  7. CentOS 7安装Teamviewer 12
  8. 转贴:win2008改造成准VISTA
  9. Xcode Missing Private key
  10. HTML5+CSS把footer固定在底部