关于Arduino连接蓝牙模块读取不到数据的问题
本帖最后由 kenlittle 于 2013-10-18 11:20 编辑本人用Arduino连接了个蓝牙4.0HM-10,新入手的,测试一下蓝牙接收后点亮LED灯,但与手机能正常收发,但为什么一给Arduino写了个程序就收不到了呢,求助~~
程序如下:
void setup()
{
Serial.begin(9600);
pinMode(9, OUTPUT);
}
void loop()
{
while(Serial.available())
{
char c=Serial.read();
if(c=='T')
{
digitalWrite(9,HIGH);
delay(2000);
digitalWrite(9,LOW);
}
}
}
在没有给Arduino写程序之前,与蓝牙模块通信是正常的
波特率就是用的默认9600,没有更改过
我买的蓝牙模块是带串口底板的,底板口有:VCC,GND,TX,RX,RS,AT;直接可以接到Arduino上,我用手机安装个lightblue,电脑上打开串口工具,连接蓝牙后,我试了下收发,都正常,但一给Arduino写程序就不行了,RX和TX交叉不交叉我都试了
情况和这个贴吧描述的情况一样:http://tieba.baidu.com/p/2294720544
我也在群里请教过大家了,最后也查了些资料,说可能是因为两个串口冲突的问题,但我把电脑连接的拔掉后,还是存在不能接收的问题
我就无奈了,,,特此来请教大家~~~ 本帖最后由 TTTTTTT33 于 2013-10-17 21:44 编辑
您的手機藍牙版本是多少??
有可能是手機的藍牙版本較低,所以無法通訊。 本帖最后由 TTTTTTT33 于 2013-10-17 21:59 编辑
還有,您的程式裡寫 if(c=='T')應該要改成 if(c=="T")因為如果您寫單引號的話實際上程式會判斷c==84才執行,雙引號的話才是真正判別T。
單引號裡面的是字符,雙引號裡的是字符串,簡單來說雙引號裡的字不代表任何意義,而單引號的字是表達裡面的意義,像您是使用T,如果雙引號"T"就真的是判別T,而單引號'T'表達裡面的意義,字符要用ASCII碼,而T的ASCII碼是84。
當然也要看您傳送端是發送哪種格式的資料,也有可能您那樣寫沒錯,不過我看到了有可能的問題,提醒一下。 TTTTTTT33 发表于 2013-10-17 21:55 static/image/common/back.gif
還有,您的程式裡寫應該要改成因為如果您寫單引號的話實際上程式會判斷c==84才執行,雙引號的話才是真正判別 ...
{:3_44:}我用的是iPad mini,蓝牙是4.0的,模块也是4.0 HM-10的,在Arduino没有写程序之前,通讯是没有问题的,我也试了收发操作,蓝牙模块可以收到mini发的数据,收也没问题;
但只要Arduino一写入程序就不行了,蓝牙模块就收不到数据了,通过电脑上的串口工具是可以接收到的,有人说是串口冲突,我也试过把连接电脑USB给拔掉,但也不行,所以我就纳闷了~~~
但像你说的这个问题我到是没有注意到,看网上都是这么写的,因为变量定义的也是char,双引号没有问题吗? kenlittle 发表于 2013-10-18 11:17 static/image/common/back.gif
我用的是iPad mini,蓝牙是4.0的,模块也是4.0 HM-10的,在Arduino没有写程序之前,通讯是没有问 ...
您發送端是直接傳大寫T嗎?? TTTTTTT33 发表于 2013-10-18 13:40 static/image/common/back.gif
您發送端是直接傳大寫T嗎??
嗯,是的,是大写的T 本帖最后由 TTTTTTT33 于 2013-10-18 16:54 编辑
kenlittle 发表于 2013-10-18 11:17 static/image/common/back.gif
我用的是iPad mini,蓝牙是4.0的,模块也是4.0 HM-10的,在Arduino没有写程序之前,通讯是没有问 ...
您說ARDUINO沒寫程式時可以通訊,請問您是如何通訊?是傳何種資料給ARDUINO??藍芽如何跟ARDUINO連接??
還有,您說的lightblue是要先在IPAD的"設定"裡連上藍牙,再開APP才讀的到藍芽裝置,還是用APP本身去連接藍芽??
lightblue傳送資料時有沒有讓您勾選以何種格式傳送資料?譬如以16進制、ASCII或別種格式傳送??因為有的串口軟體會有類似選項,沒勾對接收端會無法辨識。
如果沒有的話,可能要去查一下lightblue是用哪種格式發出封包。 TTTTTTT33 发表于 2013-10-18 16:52 static/image/common/back.gif
您說ARDUINO沒寫程式時可以通訊,請問您是如何通訊?是傳何種資料給ARDUINO??藍芽如何跟ARDUINO連接??
...
我的蓝牙模块是带底板的,直接用杜邦线可以接到Arduino上
Arduino没写程序前,我用lightblue APP连接上蓝牙模块的(前提肯定是把IPAD的蓝牙打开),利用电脑上的串口工具发送数据,IPAD上可以接收,同样我用IPAD发数据,串口工具也可以接收到。lightblue中发送的是ASCII格式,发送的数据就是几个字母
但为了测试蓝牙控制功能,所以写了个程序,当接收到字母时就点亮LED
但Arduino写了程序就收不到了,感觉挺简单的问题。。。怎么就复杂了呢{:3_44:} kenlittle 发表于 2013-10-18 22:32 static/image/common/back.gif
我的蓝牙模块是带底板的,直接用杜邦线可以接到Arduino上
Arduino没写程序前,我用lightblue APP连接上蓝 ...
您還是試試改成雙引號吧~~
您是用lightblue 連上藍牙模組還是先從ipad"設定"裡連上藍芽模組,再開lightblue ?? TTTTTTT33 发表于 2013-10-18 23:29 static/image/common/back.gif
您還是試試改成雙引號吧~~
您是用lightblue 連上藍牙模組還是先從ipad"設定"裡連上藍芽模組,再開lightb ...
双引号我试了,不行,可能是不支持String val = Serial.read();
if(val == "T")
{lightblue是先打开IPAD的蓝牙,再开lightblue的,这先后还有什么差别吗? 本帖最后由 kenlittle 于 2013-10-19 00:30 编辑
终于搞定了,NND,看了些官方的代码资料,其实还是串口的问题,官方定义了软口
代码如下:
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // RX, TX
void setup()
{
// Open serial communications and wait for port to open:
Serial.begin(9600);
pinMode(9, OUTPUT);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
// set the data rate for the SoftwareSerial port
mySerial.begin(9600);
}
void loop() // run over and over
{
if (mySerial.available()){//Resp the data
int val = mySerial.read();
if(val == 'T')
{
mySerial.write('R');
digitalWrite(9,HIGH);
delay(2000);
digitalWrite(9,LOW);
}
}
if (Serial.available()){//Send the data
mySerial.write(Serial.read());
}
}
这个破问题折腾我好几天了。。。终于搞定了,希望此贴能给同样问题的人一个提示
不行,睡觉先了{:soso_e125:} kenlittle 发表于 2013-10-19 00:29 static/image/common/back.gif
终于搞定了,NND,看了些官方的代码资料,其实还是串口的问题,官方定义了软口
代码如下:
#include
为什么板子原来的Rx 跟Tx不可以直接拿来用呢?需要另外虚拟一个Rx和Tx啊~~为什么啊
基本款的Arduino只有一個串口,所以連電腦跟連藍芽的都是用同一個,兩個同時一起上就容易出問題 非常感谢,我也遇到了相同问题。用这个方法搞定了。 请问这段代码里面 哪里是定义新的虚拟串口的
页:
[1]
2