最近的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. 016_html段落
  2. c语言指针++_C ++此指针| 查找输出程序| 套装3
  3. android卡片 弹簧滑动,如何在滚动android时拉类似于弹性类型的布局?
  4. 为什么说堡垒机是企业IT运维的“安全终结者”?
  5. 一片关于Bootstarp4的文章
  6. OSPF区域间路由计算规则与实验
  7. Tp5.0 PHPMailer邮件发送
  8. 23考研线性代数复习笔记(自用)
  9. license.xml
  10. JavaWeb网上商城项目中用户注册,使用MailServer和FoxMail搭建本地邮件服务器
  11. 前端构建工具---parcel基础打包应用示例
  12. 如何删除tmp计算机桌面,教你Win10系统中tmp文件删除不了应该如何解决?
  13. ES6中...省略号的意思
  14. 浅谈MYSQL之级联复制(附带实验)
  15. 关于MFC模态对话框dlg.DoModal()返回-1的可能原因
  16. phpfetion.php,php 飞信2012最新可用api 接口免费分享phpfetion_PHP教程
  17. 由PVID引起的故障现象
  18. 一个c程序的执行是从哪里开始到哪里结束
  19. 儿知错父之过下一句_第034章 子不教,父之过
  20. 从Larbin看互联网爬虫设计(转载)

热门文章

  1. 如何看待苹果2016秋季发布会?
  2. CTF-Mayday
  3. P1052 过河 线性dp
  4. [IM002] [Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序...
  5. springboot03-unittest mockmvc单元测试
  6. 字符串数组排序的快速排序实现
  7. 一个有趣的.net程序死锁问题
  8. iOS Xcode 调试 Unable to fix code signing issue
  9. rowStyle设置Bootstrap Table行样式
  10. day 32 半链接、粘包问题、finally