你好,请问怎么用C语言c 调用服务接收参数蓝牙模块接收到的数据?

【图片】【求教】你好 问一下大家 我用HC06蓝牙模块从机无法接收AT指令【arduino吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:51,408贴子:
【求教】你好 问一下大家 我用HC06蓝牙模块从机无法接收AT指令收藏
我用蓝牙模块接到arduino上再连接电脑的 然后打开串口调试助手 发送AT没有反应期间蓝牙模块LED灯快速闪烁
arduino樊伊电子提供多家业界顶尖制造商的CPLD复杂可编程逻辑器件等产品,包括Enterpoint,Sumida
看看蓝牙是不是自动连接了,需要断开连接。说明书里边有一段说明,如下:设置AT 指令必须在蓝牙模块未建立远程连接或断开链接时才可以(上电或配对后都可以,如果是连接状态,串口输入的数据将会直接发送到远端蓝牙设备串口输出管脚,此时需要断开蓝牙远程连接方可使用AT指令)。希望对你有帮助。
换一下波特率看看。
问下大家 像图片里这么连接有没有问题呢
如果我用USB转电源线插电脑的话有什么区别?就是如果通过这个接口连接电脑的话 是不是就可以了
回复 一念思量间 :这个是软串口的介绍。
RST高电平才能AT
设置AT指令时灯是慢闪的
我是进来顶帖的,顺便看看。
我和arduino的接法和这图一样的这是我蓝牙模块正反面
楼主的问题解决没有啊
执业药师证在手,从业挂靠全都行,简直人生赢家!
硬件不支持吧
首先arduino程序清空就是只有setup和loop空程序 ,rx接rx,tx接tx
大哥,你把串口的波特率换成115200试试,我的hc06是这样的。
楼主如果没解决看看这个
我的也没用
不如用usb转ttl转接板试试
我也遇到这问题了 用USB转ttl让电脑直接与蓝牙相连 也进不去AT模式。。。楼至你是怎么进的
同款炫龙笔记本 +.+
楼主怎么解决的啊,我的蓝牙和你一样,USB转TTL也不行
同样遇到了该问题,请问怎么解决的
我弄好了,就是首先一定要接线正确,然后,必须断开蓝牙的其他连接(无线的)【这个很重要】。然后就是可以用TTL或是开发板(但是开发版上的单片机一定要拔下来)
先考进去程序,然后接口要正确-反接即可。
需要勾选 发送新行 选项
快闪说明没有配对
楼主是解决了?我也你遇到了同样的问题,使用USB转TTL模块,正常连接后,可以与手机通讯,但是就是进不了AT模式,请问我的问题可能出现在哪里?
应该是 HC-05吧
串口号都没有?
对没错,就是要去掉发送新行
可以的进入AT模式的,就是在EN上面有两个焊盘,自己短接一下,(参考hc05),再EN接3.3v,再插上电脑,就可以了
登录百度帐号推荐应用BlueZ C语言 蓝牙模块
PB375A 蓝牙模块 远距离 工业 医疗 串口
地址:深圳南山高新园高新中四道龙泰利科技大厦304室
电话:(86)755-
|& &| &&&| &&| & | & | &
基于BlueZ的C语言蓝牙编程
hci_inquiry()
//查询周围蓝牙设备并获取其地址
sdp_connect()
//链接到蓝牙设备的sdp服务器
sdp_list_append()
//添加sdp查询列表项
sdp_service_search_attr_req() //带服务属性的服务查询请求,查询蓝牙设备,有那些服务及每个服务的属性
sdp_uuid16_create()
//为sdp查询创建通用唯一标识(UUID)
rfcomm_read_config()
//创建串口练级,链接好后,在/dev/bluetooth/rfcomm/目录下会出现以程序给定的本地信道号命名的串口设备名/dev/bluetooth/rfcomm/0
static int create_dev(int ctl, int dev, uint32_t flags, bdaddr_t *bdaddr, int argc, char **argv)
struct rfcomm_dev_
memset(&req, 0, sizeof(req));
req.dev_id =
req.flags =
bacpy(&req.src, bdaddr);
if (argc & 2) {
if ((err = rfcomm_read_config(rfcomm_config_file)) & 0) {
perror(&Can't open RFCOMM config file&);
bacpy(&req.dst, &rfcomm_opts[dev].bdaddr);
req.channel = rfcomm_opts[dev].
if (bacmp(&req.dst, BDADDR_ANY) == 0) {
fprintf(stderr, &Can't find a config entry for rfcomm%d\n&, dev);
return -EFAULT;
str2ba(argv[1], &req.dst);
if (argc & 2)
req.channel = atoi(argv[2]);
req.channel = 1;
if ((err = ioctl(ctl, RFCOMMCREATEDEV, &req)) & 0 )
perror(&Can't create device&);
//parser.c
line: 1705
int rfcomm_read_config(char *filename)
extern FILE *
char file[MAXPATHLEN + 1];
for (i = 0; i & RFCOMM_MAX_DEV; i++) {
rfcomm_opts[i].bind = 0;
bacpy(&rfcomm_opts[i].bdaddr, BDADDR_ANY);
rfcomm_opts[i].channel = 1;
if (filename) {
snprintf(file, MAXPATHLEN, &%s&, filename);
snprintf(file, MAXPATHLEN, &%s/.bluetooth/rfcomm.conf&, getenv(&HOME&));
if ((getuid() == 0) || (access(file, R_OK) & 0))
snprintf(file, MAXPATHLEN, &%s/rfcomm.conf&, CONFIGDIR);
if (!(yyin = fopen(file, &r&)))
return -1;
lineno = 1;
yyparse();
fclose(yyin);
###########################################################
原文出处:
第四章 基于BlueZ的C语言蓝牙编程
有很多理由促使我们选用C替代其他高级语言来例如Python来开发蓝牙应用程序。Python环境可能并不适合于嵌入式系统。因为嵌入式系统对程序的大
小,运行速度,和占用的存储空间有严格的限制,这些都使得像Python之类的解释性语言无法在嵌入式系统上应用。程序员需要对本地的蓝牙适配器进行更好
的控制,或者需要建立一套动态链接库以便于其他应用程序的链接以取代单一的应用程序。就像上述描述的这些,BlueZ是一款强大的蓝牙通信协议栈,它扩展
的API使得用户方便操纵大量的蓝牙资源。但是BlueZ没有官方的描述文档,甚至非官方的文档也寥寥无几。初学者在BlueZ的官方邮件列表上请求相关
的文档,通常的得到的回复是被告知请通过仔细阅读源代码来了解API的功能。阅读BlueZ的源代码对于初学者来说是一项相当费时的,在短期内取得的进展是相当有限的,很可能成为很多蓝牙编程初学者的拦路虎。
本章简要叙述了基于BlueZ的C语言蓝牙编程的方法。本章为C程序员进一步阐述了第二章中涉及的知识点。
4.1 选择一个通信的对象
Example 4-1是一个查找周边蓝牙设备的简单应用程序。程序首先获取系统的蓝牙设备号,扫描周边的蓝牙设备,然后查找每一个被搜索到的蓝牙设备的名称。后边有对数据结构和函数的详细描述。
Example 4-1. simplescan.c
#include &stdio.h&
#include &stdlib.h&
#include &unistd.h&
#include &sys/socket.h&
#include &bluetooth/bluetooth.h&
#include &bluetooth/hci.h&
#include &bluetooth/hci_lib.h&
int main(int argc, char **argv)
inquiry_info *ii = NULL;
int max_rsp, num_
int dev_id, sock, len,
char addr[19] = { 0 };
char name[248] = { 0 };
dev_id = hci_get_route(NULL);
sock = hci_open_dev( dev_id );
if (dev_id & 0 || sock & 0) {
perror(&opening socket&);
max_rsp = 255;
flags = IREQ_CACHE_FLUSH;
ii = (inquiry_info*)malloc(max_rsp * sizeof(inquiry_info));
num_rsp = hci_inquiry(dev_id, len, max_rsp, NULL, &ii, flags);
if( num_rsp & 0 ) perror(&hci_inquiry&);
for (i = 0; i & num_ i++) {
ba2str(&(ii+i)-&bdaddr, addr);
memset(name, 0, sizeof(name));
if (hci_read_remote_name(sock, &(ii+i)-&bdaddr, sizeof(name),
name, 0) & 0)
strcpy(name, &[unknown]&);
printf(&%s %s\n&, addr, name);
free( ii );
close( sock );
4.1.1 编译
编译需要使用gcc链接libbluetooth这个库。
gcc -o simplescan simplescan.c -lbluetooth
4.1.2. 解释
typedef struct {
uint8_t b[6];
} __attribute__((packed)) bdaddr_t;
蓝牙设备的地址采用结构体bdaddr_t来描述,BlueZ中队蓝牙地址的存储和操纵都使用bdaddr_t结构体,BlueZ提供两个函数来进行字符串到蓝牙地址的转换。
int str2ba( const char *str, bdaddr_t *ba );
int ba2str( const bdaddr_t *ba, char *str );
str2ba把形如XX:XX:XX:XX:XX:XX(XX标识48位蓝牙地址的16进制的一个字节)的字符串转化6字节的bdaddr_t结构, ba2str完成相反的功能。
本地蓝牙适配器被分配一个从0开始的识别号码。程序在分配系统资源时必须指定使用那一个蓝牙适配器,通常的话系统只有一个蓝牙适配器,把参数NULL传给hci_get_route可以获得第一个有效的蓝牙适配器识别号。
int hci_get_route( bdaddr_t *bdaddr );
int hci_open_dev( int dev_id );
[note]将适配器的设备号指定为0是不恰当的,因为它并不总代表第一个可用的蓝牙适配器。例如系统有两个蓝牙适配器,第一个被disable掉了,那么第一个有效的设备号就是2。
如果存在多个蓝牙适配器,选择&01:23:45:67:89:AB&作为蓝牙适配器的地址, 将指示这个地址的指针char *representation传给hci_devid函数,用这个函数替代hci_get_route。
多蓝牙操作都需要打开一个套接口,
hci_open_dev函数可以打开特定资源号的一个套接口,确切的说hci_open_dev打开的套接字建立了一条和本地蓝牙适配器控制器的连接,
而不是和远端蓝牙设备的连接。使用这个套接口发送命令到蓝牙控制器可以实现底层的蓝牙操作,这部分在4.5中有详细的讨论。
选择好本地蓝牙适配器并进行系统资源分配后,程序就可以开始扫描周边的蓝牙设备了,在这个例程中,hci_inquiry函数完成对蓝牙设备的搜寻,并将返回的设备信息数据记录在变量ii中。遇到错误时,它将返回-1并设置errno变量。
int hci_inquiry(int dev_id, int len, int max_rsp, const uint8_t *lap, inquiry_info **ii, long flags);
hci_inquiry
的参数需要使用设备资源号而非套接口,所以我们使用hci_get_route函数的返回值dev_id传递给它。查询时间最长持续1.28 *
len秒。max_rsp个设别返回的信息都被存储在变量ii中,这个变量必须有足够的空间来存储max_rsp返回的结果。我们推荐max_rsp取值
255来完成标准10.24秒的查询工作。
如果标志位flag设置为IREQ_CACHE_FLUSH,那么在进行查询操作时会把先前一次查询记录的cache刷新,否则flag设置为0的话,即便先前查询的设备已经不处于有效范围内,先前查询的记录也将被返回。
inquiry_info结构体定义如下
typedef struct {
uint8_t pscan_rep_
uint8_t pscan_period_
uint8_t pscan_
uint8_t dev_class[3];
uint16_t clock_
} __attribute__ ((packed)) inquiry_
大多数场合,我们仅用到成员bdaddr,它标识了设备的蓝牙地址。有些场合我们也会用到成员dev_class,
它标识了被检测到的蓝牙设备的一些信息(例如,识别这个设备是打印设备,电话,个人电脑等),详细地对应关系可以参见蓝牙设备分配号[3]。其余的成员在
用于底层通信,一般情况并不常用。感兴趣的读者可以阅读蓝牙内核规范[4]获取更多的信息。一旦周围的蓝牙设备和其蓝牙地址被检测到,程序可以将此设备的
名称提供给用户,hci_read_remote_name函数可以完成这个功能。
int hci_read_remote_name(int sock, const bdaddr_t *ba, int len,
char *name, int timeout)
hci_read_remote_name函数在规定的超时时间内使用套接口通过蓝牙地址ba去获取蓝牙设备的名称,成功返回0,并将获取的蓝牙设备名称存入name中;失败时返回-1并设置相应的errno。
for the curious, it makes a call to socket(AF_BLUETOOTH, SOCK_RAW,
BTPROTO_HCI), followed by a call to bind with the specified resource
###########################################################
今天用bluez的lib写了个小程序调试,运行通过.对linux下蓝牙编程有了点初步的认识.
功能就是检索周围是否有其它蓝牙设备,并得到他们的友好设备名.
#include &stdlib.h&
#include &unistd.h&
#include &sys/socket.h&
#include &bluetooth/bluetooth.h&
//蓝牙的3个头文件.
#include &bluetooth/hci.h&
#include &bluetooth/hci_lib.h&
int main ( int argc , char **argv )
inquiry_info *ii = NULL;
int max_rsp, num_
int dev_id, sock, len,
char addr [19] = { 0 };
char name [248] = { 0 };
dev_id = hci_get_route (NULL);
//得到本地第一个可用的蓝牙设备
sock = hci_open_dev(dev_id);
//用打开蓝牙设备.
if( dev_id&0 || sock & 0) {
perror(&opening socket error&) ;
max_rsp = 255 ;
flags = IREQ_CACHE_FLUSH;
ii = (inquiry_info*)malloc (max_rsp* sizeof ( inquiry_info)) ;
printf(&start search...\n&);
num_rsp = hci_inquiry(dev_id , len , max_rsp , NULL, &ii , flags) ;
//检索周围是否有设备
if ( num_rsp & 0 ) perror (&hci_inquiry error&) ;
for ( i = 0 ; i & num_ i++) {
ba2str (&(ii+i)-&bdaddr , addr ) ;
memset (name , 0 , sizeof (name)) ;
if( hci_read_remote_name ( sock , &( ii+i )-&bdaddr , sizeof (name) ,
name , 0) & 0)
//查询设备的友好设备名
strcpy (name , &[unknown]&) ;
printf (&%s %s \n&, addr , name ) ;
printf(&end search.\n&);
close(sock);
最后把这个程序交叉编译了一下,也通过了.但是还没有测试.明天再来传到板子上.
还没有正式在板子上运行过蓝牙,可能还有很多问题.
深圳蓝色飞舞科技针对Android、Bluez、wince推出:
敬请联系我们的业务及技术人员!技术支持QQ:
资料不断的更新中,希望能给各位开发的朋友带来帮助!
更多技术支持:
Copyright (C) 深圳蓝色飞舞科技有限责任公司 All Right Reservedandroid-手机蓝牙与单片机的通信如何实现?
作者:用户
浏览:1018 次
手机蓝牙与单片机的通信如何实现?20C手机是安卓系统的,蓝牙模块采用hc-06,单片机用msp430f149.具体要求是手机发数据能通过蓝牙模块传给单片机然后做出相应的反应(如控制LED的亮灭等)。安
手机蓝牙与单片机的通信如何实现?
手机是安卓系统的,蓝牙模块采用hc-06,单片机用msp430f149.具体要求是手机发数据能通过蓝牙模块传给单片机然后做出相应的反应(如控制LED的亮灭等)。
之手机与单片机蓝牙模块通信
解决方案二:
单片机和蓝牙从机HC06通过出串口,手机本身自带的蓝牙模块应该是蓝牙主机,蓝牙主机可以自动扫描从机。然后通过Android上位机操控蓝牙主机。
解决方案三:
大神们赶快来,我可以增加c币的
解决方案四:
蓝牙模块和单片机之间可以用串口通信,主要的难度在手机和蓝牙模块之间的通信,但是应该也有现成的协议吧
解决方案五:
可以从网上下个手机串口调试助手,将蓝牙模块与单片机串口相连,手机与蓝牙模块配对后就可以从手机往蓝牙模块传数据了,单片机编程实现相关操作。
解决方案六:
主要是安卓app的编写,我有相似的源码但是没法将手机端发送的数据转化为单片机可以识别的16进制。
解决方案七:
安卓上下载一个蓝牙调试助手
解决方案八:
我会了。。。。。。。。。。。。。。。。。。。
【云栖快讯】红轴机械键盘、无线鼠标等753个大奖,先到先得,云栖社区首届博主招募大赛9月21日-11月20日限时开启,为你再添一个高端技术交流场所&&
稳定可靠、可弹性伸缩的在线数据库服务,全球最受欢迎的开源数据库之一
6款热门基础云产品6个月免费体验;2款产品1年体验;1款产品2年体验
弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率
开发者常用软件,超百款实用软件一站式提供一直想写一份技术文档,但由于自感能力有限而无从下笔,最近做了个关于Android平台下实现与C语言的通讯来操作蓝牙模块的项目,中间碰到了许多问题,也在网上查了许多资料,在完成主要功能后,也有一些人在网上问我一些问题,这里写下这篇文档算是一个阶段性的总结。如果反响好,后续将会发上Android&Stub与新版Android&HAL的学习文档。
由于蓝牙模块是串口通讯机制,使用C语言来访问,而Android的应用层采用Java,无法直接操作硬件。故使用JNI的技术实现主要功能。Android的JNI应该属于Android&HAL的一部分,由于Android的HAL机制目前还没完全摸索透,所以这里的程序架构算是老版本的HAL机制。程序架构如下图。
一、&什么是JNI?
JNI是Java&Native&Interface的缩写,中文为JAVA本地调用。从Java1.1开始,Java&Native&Interface(JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了。(以上内容摘自百度百科)
二、&如何使用JNI?
1、在使用JNI之前,你要确保你的电脑中安装以下软件环境:
Android&SDK :版本与你硬件测试环境版本相同,在Google的Android官网下载
Android&NDK :用于编译C文件为.so的共享库,如果你是在Linux下进行开发而又具有Android的完全SDK,则不需要
Cygwin :用于编译C文件
Android&开发环境 :android开发环境的配置网上一大堆,这里不再赘述
2、程序中由于只用到Java调C,而不需要C调Java,所以在应用层调C的函数很简单,只需要在一个方法前加入native关键字(native的方法不能有方法体),然后将编译的共享库导入即可。
public&class&BluetoothJNI&{
System.loadLibrary(&jni&);
public&native&static&int&bluetoothOn(String&strAT);
public&native&static&void&bluetoothOff(String&strAT);
public&native&static&String&readSerial();
public&native&static&void&write(String&strAT);
3、Eclipse在保存工程后,会自动把Java文件编译为class文件,我们使用javah命令把class文件编译成C头文件。如下:
执行此命令后将会在工程的bin目录下生成一个.h的C头文件。头文件中会生成对应Java&native方法的函数声明。新建一个与头文件同名的C文件并实现所有函数。
4、由于Android的底层是基于Linux内核,所以一些Windows下的系统函数不可用,Linux下的串口通讯文章网上有很多,此处代码繁多,就不贴出来了。,我们在C文件中引入jni.h与刚生成的头文件以确保JNI能调用。注意:整个程序的核心部分便是在此处,C语言与蓝牙模块的串口通讯处,我在此处碰到的问题也是最多的。
三、编译C文件
1、在Android-ndk-r5b\samples\下新建目录Bluetooth\jni,将C文件与头文件复制过来,新建Makefile。如下:
LOCAL_PATH&:=&$(call&my-dir)
include&$(CLEAR_VARS)
LOCAL_C_INCLUDES&:=&$(JNI_H_INCLUDE)
LOCAL_LDLIBS&:=&-lm&-llog
LOCAL_MODULE&&&&:=&jni
LOCAL_SRC_FILES&:=&com_android_semisky_bluetooth_util_BluetoothJNI.c
include&$(BUILD_SHARED_LIBRARY)
2、打开Cygwin&bash&shell,进入Bluetooth目录,执行ndk-build进行编译。
3、将libs/armeabi下生成的libjni.so文件拷入到Android工程的libs/armeabi目录下。安装apk到开发板,执行程序。
四、可能出现的问题
1、串口读写权限的问题
网上的方法是在Java中获取su账号来改权限或者在init.rc中添加命令来修改权限最后编译成img烧录进开发板,而这两种方法我都没成功,最后没办法在dos下执行shell命令来修改
2、C文件的串口读写问题
我不知道是我的程序有问题还是蓝牙模块的问题,在蓝牙模块返回数据稍大的时候,会出现数据有时返回有时不返回的情况。
3、乱码问题
蓝牙返回的数据时而出现乱码,未解决。
4、串口号的问题
如果你open的时候返回的fd小于1,确保你的开发板串口号是否正确,协议是否正确,权限是否修改。
5、最大大大的问题
读取串口代码段的算法问题,优化问题,不然数据会返回不正常。
本文已收录于以下专栏:
相关文章推荐
转载至http://blog.csdn.net/cnbloger/article/details/?utm_source=tuicool&utm_medium=referral
在工作有一个这样的需求:在一个Android App上,通过串口对一个蓝牙进行操作,其中包括发送消息,接收消息,并进行处理。 
  
=========================项目心得和遇...
    在之前晓东已经和大家分析完成了蓝牙打开和蓝牙搜索的过程了,在搜索到设备的下一步我们要做的就是蓝牙的配对了。本文晓东将和大家一起来看看蓝牙配对究竟涉及到了哪些内容。
     ...
bluedroid的通用架构框图:
由上图可知,bluedroid包含如下的核心组件:
Bluetooth core stack libra...
整个串口模块功能已经完成了。但需求又来了现在外接一个MCU模块与MTK也是通串口相连,如果我们要把代码变得更容易复用,新模块在更少的代码量上接入,那该怎么做呢。在蓝牙功能模块里我们通过测试后发现一个问...
在前面的UI分析的文章中我们已经发现,其实不管是设置中的开关和fragment之后的开关最终都是关联到BluetoothEnabler中去的,所以,我们直接去看这个里面对于开关的处理,开关的处理当然就...
3.    
&JNIHelp.h&
&android_runtime/AndroidRuntime.h&
Android Bluetooth bluetooth ad-hoc 蓝牙的自组网 蓝牙一对多连接。
此例子基于 android demo
对于一般的软件开发人员来说,蓝牙是很少用到的,尤其是Android的蓝牙开发,国内的例子很少 
   Android对于蓝牙开发从2.0版本的sdk才开始...
他的最新文章
讲师:姜飞俊
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)}

我要回帖

更多关于 蓝牙模块原理图 的文章

更多推荐

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

点击添加站长微信