极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 19563|回复: 13

蓝牙模块与pc通讯的怪问题

[复制链接]
发表于 2012-8-8 13:14:21 | 显示全部楼层 |阅读模式
昨天终于搞好了hc05的at指令设置,今天测试模块的收发。
写了个简单的在pc端通过串口助手发送on或off来开关13号口的led。如果输入匹配则led会亮或者灭,无输入或输入不匹配则串口输出“no command”。
用串口线测试程序一切正常,一旦换蓝牙,问题就来了。无论我输入什么,总是现实“no comand”,感觉就像模块只能发送不能接收。
向各位请教这是何因?会不会是蓝牙模块hc05的硬件问题?
谢谢!
回复

使用道具 举报

发表于 2012-8-8 13:29:15 | 显示全部楼层
请问AT指令怎么发送设置的》??
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-8 14:25:04 | 显示全部楼层
本帖最后由 windasher 于 2012-8-8 14:27 编辑
pww999 发表于 2012-8-8 13:29 请问AT指令怎么发送设置的》??
先让hc05进入at模式(具体可参见其手册)。在程序的setup()里用println()函数写相应指令就可以了。
或者在电脑端用usb转ttl模块连接蓝牙模块,配合串口调试助手也可以实现指令的设置。
回复 支持 反对

使用道具 举报

发表于 2012-8-8 16:47:15 | 显示全部楼层
本帖最后由 pww999 于 2012-8-8 17:54 编辑

是不是 字符类型或字付串 发不对?之前我试了一下,简单发送只能够发一个字付,一串字符会续个接收的,有个帖子专门讲如何发送及读取字付串的
http://www.geek-workshop.com/thread-158-1-5.html

但想了想好象不对,因为不能接收字符串,又怎么接收at指令改模式?可能写到单片机上,与蓝呀内部处理不一样?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-8 19:35:15 | 显示全部楼层
at指令是单片机通过ttl端口发送给蓝牙模块的,并不是用无线连接。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-8 19:36:43 | 显示全部楼层
pww999 发表于 2012-8-8 16:47
是不是 字符类型或字付串 发不对?之前我试了一下,简单发送只能够发一个字付,一串字符会续个接收的,有个 ...

你推荐的帖子看了很受益,谢谢!
晚上再研究下。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-9 08:12:07 | 显示全部楼层
昨天用serial.available()来检测模块是否收到数据,并根据收到的字符数来控制灯的开关,收到一个字符灯亮,收到两个字符灯灭。
测试结果是串口并不能每次都接收到数据,即使接收到pc端的字符(串),也未必能完全接收。比如发送两个字符,单片机端只能收到一个,发三个只能接收两个……
稍后上代码,请各位帮看看是哪儿出了问题。
回复 支持 反对

使用道具 举报

发表于 2012-8-9 11:24:33 | 显示全部楼层
本帖最后由 pww999 于 2012-8-9 11:30 编辑

按上面给的帖子 将接收后显示到lcd1602,开始接收显示时 字符(串)后面多了个乱码,接收多几次后就正常了,也不知什么原因,
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-9 12:13:05 | 显示全部楼层
  1. int led = 13;
  2. int c;
  3. String sr;
  4. void setup()
  5. {
  6.   pinMode(led,OUTPUT);
  7.   Serial.begin(9600);

  8. }
  9. void loop()
  10. {

  11.   while(Serial.available()>0)
  12.   {
  13.     sr += char(Serial.read());
  14.     delay(2);
  15.   }
  16.   
  17.   if(sr.length() == 1)//接收到的字符串长度为1
  18.   {
  19.     digitalWrite(led,HIGH);
  20.     Serial.println(sr);
  21.     sr = "";
  22.   }
  23.   else if(sr.length() == 2)//接收到的字符串长度为2
  24.   {
  25.     digitalWrite(led,LOW);
  26.     Serial.println(sr);
  27.     sr = "";
  28.   }
  29.   else if(sr.length() > 2)//接收到的字符串长度大于2
  30.   {
  31.     Serial.print(sr);
  32.     Serial.println("receive > 0");
  33.     sr = "";
  34.   }
  35.   else//如果缓冲区无字符
  36.   {
  37.     Serial.print(Serial.available());
  38.     Serial.println("no data");
  39.   }
  40.   }
复制代码
这是我的代码,请各位看看,谢谢!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-9 12:28:20 | 显示全部楼层
pww999 发表于 2012-8-9 11:24
按上面给的帖子 将接收后显示到lcd1602,开始接收显示时 字符(串)后面多了个乱码,接收多几次后就正常了, ...

两个乱码是不是回车换行?
能否把你的代码发上来让我学习下?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-9 12:40:57 | 显示全部楼层
请问pww999兄,你用的是哪里生产的模块?我用的是lcsoft生产的模块(核心是hc05),我怀疑是不是硬件的问题。
回复 支持 反对

使用道具 举报

发表于 2012-8-9 12:44:06 | 显示全部楼层
本帖最后由 pww999 于 2012-8-9 13:09 编辑

http://www.geek-workshop.com/thread-1453-1-3.html

我是用检测字符(串)匹配,而不是字符(串) 长度 匹配{:soso_e140:} ~~~
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-9 14:11:26 | 显示全部楼层
pww999 发表于 2012-8-9 12:44
http://www.geek-workshop.com/thread-1453-1-3.html

我是用检测字符(串)匹配,而不是字符(串) 长度 匹配 ...

这种方法我用串口线实验成功,但换蓝牙就不行了只能接收蓝牙信息,对蓝牙模块发送数据就会出错,不解……
回复 支持 反对

使用道具 举报

发表于 2012-8-9 16:05:52 | 显示全部楼层
本帖最后由 pww999 于 2012-8-9 16:09 编辑

2个串口的端口号? 是不是你之前设置at 指令设错了?  
我只买了一只,也是主从一体,直接默认从机使用的,at指令没设置过的
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-5-7 11:02 , Processed in 0.044427 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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