极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 48314|回复: 15

关于Arduino连接蓝牙模块读取不到数据的问题

[复制链接]
发表于 2013-10-17 12:08:08 | 显示全部楼层 |阅读模式
本帖最后由 kenlittle 于 2013-10-18 11:20 编辑

本人用Arduino连接了个蓝牙4.0HM-10,新入手的,测试一下蓝牙接收后点亮LED灯,但与手机能正常收发,但为什么一给Arduino写了个程序就收不到了呢,求助~~
程序如下:
  1. void setup()
  2. {
  3. Serial.begin(9600);
  4. pinMode(9, OUTPUT);
  5. }

  6. void loop()
  7. {
  8.   while(Serial.available())
  9.    {
  10.      char c=Serial.read();
  11.       if(c=='T')
  12.         {
  13.           digitalWrite(9,HIGH);
  14.           delay(2000);
  15.           digitalWrite(9,LOW);
  16.         }
  17.    }
  18. }
复制代码

在没有给Arduino写程序之前,与蓝牙模块通信是正常的
波特率就是用的默认9600,没有更改过
我买的蓝牙模块是带串口底板的,底板口有:VCC,GND,TX,RX,RS,AT;直接可以接到Arduino上,我用手机安装个lightblue,电脑上打开串口工具,连接蓝牙后,我试了下收发,都正常,但一给Arduino写程序就不行了,RX和TX交叉不交叉我都试了
情况和这个贴吧描述的情况一样:http://tieba.baidu.com/p/2294720544
我也在群里请教过大家了,最后也查了些资料,说可能是因为两个串口冲突的问题,但我把电脑连接的拔掉后,还是存在不能接收的问题
我就无奈了,,,特此来请教大家~~~
回复

使用道具 举报

发表于 2013-10-17 21:40:46 | 显示全部楼层
本帖最后由 TTTTTTT33 于 2013-10-17 21:44 编辑

您的手機藍牙版本是多少??
有可能是手機的藍牙版本較低,所以無法通訊。
回复 支持 反对

使用道具 举报

发表于 2013-10-17 21:55:13 | 显示全部楼层
本帖最后由 TTTTTTT33 于 2013-10-17 21:59 编辑

還有,您的程式裡寫
  1. if(c=='T')
复制代码
應該要改成
  1. if(c=="T")
复制代码
因為如果您寫單引號的話實際上程式會判斷c==84才執行,雙引號的話才是真正判別T。
單引號裡面的是字符,雙引號裡的是字符串,簡單來說雙引號裡的字不代表任何意義,而單引號的字是表達裡面的意義,像您是使用T,如果雙引號"T"就真的是判別T,而單引號'T'表達裡面的意義,字符要用ASCII碼,而T的ASCII碼是84。

當然也要看您傳送端是發送哪種格式的資料,也有可能您那樣寫沒錯,不過我看到了有可能的問題,提醒一下。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-10-18 11:17:11 | 显示全部楼层
TTTTTTT33 发表于 2013-10-17 21:55
還有,您的程式裡寫應該要改成因為如果您寫單引號的話實際上程式會判斷c==84才執行,雙引號的話才是真正判別 ...

{:3_44:}我用的是iPad mini,蓝牙是4.0的,模块也是4.0 HM-10的,在Arduino没有写程序之前,通讯是没有问题的,我也试了收发操作,蓝牙模块可以收到mini发的数据,收也没问题;
但只要Arduino一写入程序就不行了,蓝牙模块就收不到数据了,通过电脑上的串口工具是可以接收到的,有人说是串口冲突,我也试过把连接电脑USB给拔掉,但也不行,所以我就纳闷了~~~
但像你说的这个问题我到是没有注意到,看网上都是这么写的,因为变量定义的也是char,双引号没有问题吗?
回复 支持 反对

使用道具 举报

发表于 2013-10-18 13:40:44 | 显示全部楼层
kenlittle 发表于 2013-10-18 11:17
我用的是iPad mini,蓝牙是4.0的,模块也是4.0 HM-10的,在Arduino没有写程序之前,通讯是没有问 ...

您發送端是直接傳大寫T嗎??
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-10-18 14:50:36 | 显示全部楼层
TTTTTTT33 发表于 2013-10-18 13:40
您發送端是直接傳大寫T嗎??

嗯,是的,是大写的T
回复 支持 反对

使用道具 举报

发表于 2013-10-18 16:52:20 | 显示全部楼层
本帖最后由 TTTTTTT33 于 2013-10-18 16:54 编辑
kenlittle 发表于 2013-10-18 11:17
我用的是iPad mini,蓝牙是4.0的,模块也是4.0 HM-10的,在Arduino没有写程序之前,通讯是没有问 ...


您說ARDUINO沒寫程式時可以通訊,請問您是如何通訊?是傳何種資料給ARDUINO??藍芽如何跟ARDUINO連接??

還有,您說的lightblue是要先在IPAD的"設定"裡連上藍牙,再開APP才讀的到藍芽裝置,還是用APP本身去連接藍芽??

lightblue傳送資料時有沒有讓您勾選以何種格式傳送資料?譬如以16進制、ASCII或別種格式傳送??因為有的串口軟體會有類似選項,沒勾對接收端會無法辨識。

如果沒有的話,可能要去查一下lightblue是用哪種格式發出封包。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-10-18 22:32:40 | 显示全部楼层
TTTTTTT33 发表于 2013-10-18 16:52
您說ARDUINO沒寫程式時可以通訊,請問您是如何通訊?是傳何種資料給ARDUINO??藍芽如何跟ARDUINO連接??
...

我的蓝牙模块是带底板的,直接用杜邦线可以接到Arduino上
Arduino没写程序前,我用lightblue APP连接上蓝牙模块的(前提肯定是把IPAD的蓝牙打开),利用电脑上的串口工具发送数据,IPAD上可以接收,同样我用IPAD发数据,串口工具也可以接收到。lightblue中发送的是ASCII格式,发送的数据就是几个字母
但为了测试蓝牙控制功能,所以写了个程序,当接收到字母时就点亮LED
但Arduino写了程序就收不到了,感觉挺简单的问题。。。怎么就复杂了呢{:3_44:}
回复 支持 反对

使用道具 举报

发表于 2013-10-18 23:29:41 | 显示全部楼层
kenlittle 发表于 2013-10-18 22:32
我的蓝牙模块是带底板的,直接用杜邦线可以接到Arduino上
Arduino没写程序前,我用lightblue APP连接上蓝 ...

您還是試試改成雙引號吧~~
您是用lightblue 連上藍牙模組還是先從ipad"設定"裡連上藍芽模組,再開lightblue ??
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-10-18 23:44:35 | 显示全部楼层
TTTTTTT33 发表于 2013-10-18 23:29
您還是試試改成雙引號吧~~
您是用lightblue 連上藍牙模組還是先從ipad"設定"裡連上藍芽模組,再開lightb ...

双引号我试了,不行,可能是不支持
  1. String val = Serial.read();
  2.     if(val == "T")
  3.       {
复制代码
lightblue是先打开IPAD的蓝牙,再开lightblue的,这先后还有什么差别吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-10-19 00:29:47 | 显示全部楼层
本帖最后由 kenlittle 于 2013-10-19 00:30 编辑

终于搞定了,NND,看了些官方的代码资料,其实还是串口的问题,官方定义了软口
代码如下:
  1. #include <SoftwareSerial.h>

  2. SoftwareSerial mySerial(10, 11); // RX, TX
  3. void setup()  
  4. {
  5.   // Open serial communications and wait for port to open:
  6.   Serial.begin(9600);
  7.   pinMode(9, OUTPUT);
  8.   while (!Serial) {
  9.     ; // wait for serial port to connect. Needed for Leonardo only
  10.   }

  11.   // set the data rate for the SoftwareSerial port
  12.   mySerial.begin(9600);

  13. }

  14. void loop() // run over and over
  15. {
  16.   if (mySerial.available()){//Resp the data
  17.     int val = mySerial.read();
  18.     if(val == 'T')
  19.       {
  20.         mySerial.write('R');
  21.         digitalWrite(9,HIGH);
  22.         delay(2000);
  23.         digitalWrite(9,LOW);
  24.       }
  25.   }
  26.   if (Serial.available()){//Send the data
  27.     mySerial.write(Serial.read());
  28.   }
  29. }
复制代码

这个破问题折腾我好几天了。。。终于搞定了,希望此贴能给同样问题的人一个提示
不行,睡觉先了{:soso_e125:}
回复 支持 反对

使用道具 举报

发表于 2013-11-7 18:19:13 | 显示全部楼层
kenlittle 发表于 2013-10-19 00:29
终于搞定了,NND,看了些官方的代码资料,其实还是串口的问题,官方定义了软口
代码如下:
#include

为什么板子原来的Rx 跟Tx不可以直接拿来用呢?需要另外虚拟一个Rx和Tx啊~~为什么啊
回复 支持 反对

使用道具 举报

发表于 2014-1-17 09:27:50 | 显示全部楼层
基本款的Arduino只有一個串口,所以連電腦跟連藍芽的都是用同一個,兩個同時一起上就容易出問題
回复 支持 反对

使用道具 举报

发表于 2014-3-24 21:35:54 | 显示全部楼层
非常感谢,我也遇到了相同问题。用这个方法搞定了。
回复 支持 反对

使用道具 举报

发表于 2014-11-9 00:39:09 | 显示全部楼层
请问这段代码里面 哪里是定义新的虚拟串口的
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-10 10:17 , Processed in 0.041864 second(s), 24 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表