单片机不能通过蓝牙模块与单片机连接向手机发送数据

51单片机和HC05蓝牙模块对接成功,但是数据收发时候发现数据很多时候对不上问题解决
最近用89c51单片机和HC05蓝牙模块进行了匹配和数据对接。
总体上匹配成功,数据也可以发送接收成功,但是发现一个奇怪的问题,有时候发送一个一字节的数据,低四位正常接收,高四位接受异常。
比如发送0x10 接受为0x30;
后来发现是晶振的问题,之前一直用卖方指定的12M晶振,后来发现用11.0592M晶振可以正常接受。
---》波特率的问题,51单片机12M晶振9600的波特率误差高达%7传送结果很不准确,11.0592晶振刚刚好没误差
没有更多推荐了,本版文章用户
后使用快捷导航没有帐号?
手机&智能终端
元器件/物料库
当前位置:
查看: 19261|回复: 6
一步步教你如何使用蓝牙模块与手机通信,实现自主开发
上一篇介绍了模块与PC电脑的通信,接下来介绍蓝牙模块与的通信:1、通信前必须具备东西:(1)&&蓝牙串口模块;(2)&&安卓系统并带有蓝牙的手机;(3)&&串口调试软件;(4)&&蓝牙测试软件;
配置蓝牙串口模块:
这里把蓝牙串口模块配置成从机模式,具体设置过程如下:(1)&&让蓝牙串口模块进入命令设置状态,具体操作是:按着模块上唯一的按键不放,用USB接口给模块上电,这时正确的情景是模块上的LED灯是长亮几秒后熄灭再循环的。如果出现灯快速闪烁的情况,证明模块并未进入命令设置状态,断电重复上述操作即可。(2)&&将模块通过串口线与电脑连接;成功连接的标志是:打开电脑的设备管理器可以看到“端口”下有USB-SERIAL 端口,如下图:
(3)&&打开“蓝牙测试软件”,点击“搜索端口”,波特率选择“38400”,这时应该出现:“端口:2已打开”;(4)&&在“蓝牙测试软件”的右边输入你要配置的信息,主要的常用信息便是:①&&设备名称:就是你想给蓝牙串口模块上的蓝牙命名,支持中英文;这里设置为“Bluebooth”;②&&主从角色:就是模块的角色,这里选“从角色”;③&&设备类:就是蓝牙设备类型,这里设置为COD:④&&连接密码:就是指与其他蓝牙设备连接时需要对方输入匹配的密码,这里设置为“1234”,可支持至少8位的长度,字母与数字混合;⑤&&查询访问码:设置成通用查询访问码9e8b33;⑥&&连接模式:主从和回环模式选择,这里选“从角色”;⑦&&查询访问模式:选0或1,0是标准模式,1是RSSI加强模式,可以连接多个设备,这里选1;⑧&&通信波特率:在常用的波特率里选择,由于手机通信波特率是9600,所以建议这里选择9600;最后点击“更新模块信息”
图1 设置界面看到左边出现OK的蓝色字样,配置成功,关闭软件。(5)&&把蓝牙串口模块的串口与电脑断开连接,断电,再重新给模块上电,注意这时候不需要按着模块上的按键,直接上电即可,然后与电脑串口连接;可以看到的正确现象是模块上的LED灯是比较快地闪烁的。
在手机上安装串口助手软件(ANDROI系统P串口助手),将HC-PDA-.apk文件放在手机上安装即可;安装后即有BTClient程序图标。点击运行即可。& &手机与模块蓝牙连接:
(1)因为之前设置了蓝牙串口模块的蓝牙为从机,所以这里手机上的蓝牙作为主机发起连接。直接点击手机上BTClient软件上的“连接”,“查找设备”,选择我们的蓝牙串口模块“Bluebooth”,提示“连接成功”;& &(2)打开串口调试软件,选择串口号2 和波特率9600,数据位8位,停止位1位,校验位和数据流控制都是none;
& &(3)在串口调试软件发送数据到手机上,或者手机发送数据到到电脑上,支持字母和数字,不支持中文。以下是样例通信结果:
图2 蓝牙串口模块收到的数据
图3 手机上的蓝牙接收和发送的数据至此,我们就已经顺利的完成了蓝牙模块与手机的通信了。
技术词条:
怎么用单片机控制蓝牙模块 与 手机通讯呢
好!不错,不知道蓝牙用的是什么版本的
看看!!!!!!!!!!!!!!!!!!!!!!!!
有没有带蓝牙的单片机 ?
对我很有用
楼主&&我照着你的步骤来了好几遍&&但是 就是不返回OK&&;楼主能帮我一下吗& &纠结很长时间了
射频驱动硬件技术Q群
展开版块导航
获取手机验证码豆丁微信公众号
君,已阅读到文档的结尾了呢~~
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
手机通过蓝牙模块与单片机通信
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='http://www.docin.com/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口14:42 提问
蓝牙4.0透传模式能否实现从单片机经蓝牙模块向手机发送数据?
如题,蓝牙模块BT05,支持BLE透传。
现在想实现数据从单片机经过蓝牙模块向手机APP的信息传输。发个信号高低电平也可以。
写代码的话是应该往APP里写还是蓝牙模块里写还是在单片机里写?
因为蓝牙支持透传模式,所以想通过透传实现蓝牙和手机的连接以及数据收发,看了很多资料应该是可以的,但是也不确实以及应该如何做下去。拜托懂的各位了。谢谢。
会不会和其中的主从模块设置有关?
按赞数排序
先用AT指令对蓝牙模块进行设置,具体怎么设置可以百度或者查看你的模块资料。把蓝牙配置成从机模式,然后手机下载蓝牙调试助手,在这个APP里直接连接蓝牙模块就行。然后手机端发送数据,蓝牙模块的串口输出端就可以传输出数据。
可以的,可以将一个数据在蓝牙接口传输到手机,手机 的蓝牙软件可以直接看的
肯定是可以的,现在的蓝牙透传都是做这个使用的
肯定是可以的,需要在单片机里要写,app里也要做适当的修改
这个很简单
1.设置透传模式
2.单片机编程uart发数据
3.手机蓝牙和bt05配对
4.写android app,实现蓝牙socket连接,用inputStream和outputStream接受数据和发送数据即可
这个很简单
1.设置透传模式
2.单片机编程uart发数据
3.手机蓝牙和bt05配对
4.写android app,实现蓝牙socket连接,用inputStream和outputStream接受数据和发送数据即可
推荐一个 新的蓝牙蓝牙模块
汇承科技的HC-05
这个模块很好用
串口发送 。我就是用的这个写的程序
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐&nbsp>&nbsp
&nbsp>&nbsp
&nbsp>&nbsp
android开发之手机与单片机蓝牙模块通信
摘要:之前两篇都是在说与手机的连接,连接方法,和主动配对连接,都是手机与手机的操作,做起来还是没问题的,但是最终的目的是与单片机的蓝牙模块的通信。下面是到目前为止尝试的与单片机的通信方法,没有成功,但是从思路上来说没有问题,最大的问题是与单片机配对的时候,单片机的蓝牙模块的PIN配对码是写死的,固定为1234,而手机这边连接配对都是自动生成的PIN配对码,这种方式在手机与手机配对的时候是极为方便的,但是在这里与单片机连接却成了最大的问题,因为手机自动生成而且每次都不一样,所以没法与
之前两篇都是在说与手机的连接,连接方法,和主动配对连接,都是手机与手机的操作,做起来还是没问题的,但是最终的目的是与单片机的蓝牙模块的通信。
下面是到目前为止尝试的与单片机的通信方法,没有成功,但是从思路上来说没有问题,最大的问题是与单片机配对的时候,单片机的蓝牙模块的PIN配对码是写死的,固定为1234,
而手机这边连接配对都是自动生成的PIN配对码,这种方式在手机与手机配对的时候是极为方便的,但是在这里与单片机连接却成了最大的问题,因为手机自动生成而且每次都不一样,所以没法与单片机蓝牙模块的1234相同也就没法陪对了。下面只是介绍的到目前为止我们的大题思路,具体代码很多,而且涉及到项目也就没有贴。
如果关于上面的问题哪位同学有思路或者做过类似的项目还请指点。
首先,如何开启蓝牙设备和设置可见时间:
private void search() {
BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
if (!adapter.isEnabled()) {
adapter.enable();
Intent enable = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
enable.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 3600); //3600为蓝牙设备可见时间
startActivity(enable);
Intent searchIntent = new Intent(this, ComminuteActivity.class);
startActivity(searchIntent);
正式开始与蓝牙模块进行通信
public class ComminuteActivity extends Activity {
private BluetoothR
private BluetoothAdapter bluetoothA
private List
private List
private final String lockName = &YESYOU&;
private String message = &000001&;
private ListView listV
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.search_layout);
listView = (ListView) this.findViewById(R.id.list);
deviceList = new ArrayList
devices = new ArrayList
bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
bluetoothAdapter.startDiscovery();
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
receiver = new BluetoothReceiver();
registerReceiver(receiver, filter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView
parent, View view, int position, long id) {
setContentView(R.layout.connect_layout);
BluetoothDevice device = deviceList.get(position);
client = new Bluetooth(device, handler);
client.connect(message);
} catch (Exception e) {
Log.e(&TAG&, e.toString());
protected void onDestroy() {
unregisterReceiver(receiver);
super.onDestroy();
private final Handler handler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case Bluetooth.CONNECT_FAILED:
Toast.makeText(ComminuteActivity.this, &连接失败&, Toast.LENGTH_LONG).show();
client.connect(message);
} catch (Exception e) {
Log.e(&TAG&, e.toString());
case Bluetooth.CONNECT_SUCCESS:
Toast.makeText(ComminuteActivity.this, &连接成功&, Toast.LENGTH_LONG).show();
case Bluetooth.READ_FAILED:
Toast.makeText(ComminuteActivity.this, &读取失败&, Toast.LENGTH_LONG).show();
case Bluetooth.WRITE_FAILED:
Toast.makeText(ComminuteActivity.this, &写入失败&, Toast.LENGTH_LONG).show();
case Bluetooth.DATA:
Toast.makeText(ComminuteActivity.this, msg.arg1 + &&, Toast.LENGTH_LONG).show();
private class BluetoothReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (BluetoothDevice.ACTION_FOUND.equals(action)) {
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
if (isLock(device)) {
devices.add(device.getName());
deviceList.add(device);
showDevices();
private boolean isLock(BluetoothDevice device) {
boolean isLockName = (device.getName()).equals(lockName);
boolean isSingleDevice = devices.indexOf(device.getName()) == -1;
return isLockName &;&; isSingleD
private void showDevices() {
ArrayAdapter
adapter = new ArrayAdapter
(this, android.R.layout.simple_list_item_1,
listView.setAdapter(adapter);
这里需要提一下的是,startDiscovery()这个方法和它的返回值,它是一个异步方法,会对其他蓝牙设备进行搜索,持续时间为12秒。
搜索过程其实是在System Service中进行,我们可以通过cancelDiscovery()方法来停止这个搜索。在系统搜索蓝牙设备的过程中,系统可能会发送以下三个广播:ACTION_DISCOVERY_START(开始搜索),
ACTION_DISCOVERY_FINISHED(搜索结束)
和ACTION_FOUND(找到设备)。
ACTION_FOUND这个才是我们想要的,这个Intent中包含两个extra fields: EXTRA_DEVICE和EXTRA_CLASS,
包含的分别是BluetoothDevice和BluetoothClass,
EXTRA_DEVICE中的BluetoothDevice就是我们搜索到的设备对象,从中获得设备的名称和地址。
而EXTRA_CLASS中的BluetoothClass是搜索到的设备的类型,比如搜索到的是手机还是耳机或者其他,之后我会写一篇关于它的介绍。
在这个上面我现在在想,是否通过判断搜索到的设备类型来识别单片机蓝牙模块与手机蓝牙的不同,采取不一样的配对方式,从而不自动生成配对码。不知是否可行,一会尝试。
搜索到该设备后,我们就要对该设备进行连接和通信。
public void connect(final String message) {
Thread thread = new Thread(new Runnable() {
public void run() {
BluetoothSocket tmp =
method = device.getClass().getMethod(&createRfcommSocket&, new Class[]{int.class});
tmp = (BluetoothSocket) method.invoke(device, 1);
} catch (Exception e) {
setState(CONNECT_FAILED);
Log.e(&TAG&, e.toString());
socket.connect();
isConnect =
} catch (Exception e) {
setState(CONNECT_FAILED);
Log.e(&TAG&, e.toString());
if (isConnect) {
OutputStream outStream = socket.getOutputStream();
outStream.write(getHexBytes(message));
} catch (IOException e) {
setState(WRITE_FAILED);
Log.e(&TAG&, e.toString());
InputStream inputStream = socket.getInputStream();
while (true) {
data = inputStream.read();
Message msg = handler.obtainMessage();
msg.what = DATA;
msg.arg1 =
handler.sendMessage(msg);
} catch (IOException e) {
setState(READ_FAILED);
Log.e(&TAG&, e.toString());
} catch (IOException e) {
setState(WRITE_FAILED);
Log.e(&TAG&, e.toString());
if (socket != null) {
socket.close();
} catch (IOException e) {
Log.e(&TAG&, e.toString());
这里包括写入和读取,用法和基本的Socket是一样的,但是写入的时候,需要将字符串转化为16进制:
private byte[] getHexBytes(String message) {
int len = message.length() / 2;
char[] chars = message.toCharArray();
String[] hexStr = new String[len];
byte[] bytes = new byte[len];
for (int i = 0, j = 0; j & i += 2, j++) {
hexStr[j] = && + chars[i] + chars[i + 1];
bytes[j] = (byte) Integer.parseInt(hexStr[j], 16);
连接设备之前需要UUID,所谓的UUID,就是用来进行配对的,全称是Universally Unique Identifier,是一个128位的字符串ID,用于进行唯一标识。网上的例子,包括谷歌的例子提供的uuid,通用的&0-805F9B34FB&也试过了,在配对的时候都是自动生成了配对码,也无法正常与单片机的蓝牙模块连接,所以,我就利用反射的原理,让设备自己提供UUID尝试。到这里其实我有点怀疑自己对于UUID的理解是否正确了。
在谷歌提供的例子中,我们可以看到谷歌的程序员的程序水平很高,一些好的编码习惯我们可以学习一下,像是在try..catch中才定义的变量,我们应该在try...catch之前声明一个临时变量,然后再在try...catch后赋值给我们真正要使用的变量。这种做法的好处就是:如果我们直接就是使用真正的变量,当出现异常的时候,该变量的使用就会出现问题,而且很难进行排查,如果是临时变量,我么可以通过检查变量的值来确定是否是赋值时出错。
以上是的内容,更多
的内容,请您使用右上方搜索功能获取相关信息。
若你要投稿、删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内给你回复。
云服务器 ECS
可弹性伸缩、安全稳定、简单易用
&40.8元/月起
预测未发生的攻击
&24元/月起
邮箱低至5折
推荐购买再奖现金,最高25%
&200元/3月起
你可能还喜欢
你可能感兴趣
阿里云教程中心为您免费提供
android开发之手机与单片机蓝牙模块通信相关信息,包括
的信息,所有android开发之手机与单片机蓝牙模块通信相关内容均不代表阿里云的意见!投稿删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内答复
售前咨询热线
支持与服务
资源和社区
关注阿里云
International}

我要回帖

更多关于 单片机蓝牙模块程序 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信