[关闭]
@SiberiaBear 2015-10-22T10:38:59.000000Z 字数 3176 阅读 1973

Edison控制BLE模块的学习与测试笔记

Edison
固定链接:https://www.zybuluo.com/SiberiaBear/note/198035


在最近的2个星期中,我与另外一位小伙伴一起学习了用Edison模块来控制ble蓝牙模块的实验,当然是自己探索,最后基本实现了通信的功能,但是仍然有一些问题有待改进,当然也值得我们更加深入的学习Edison。现在把这段时间的学习进度和心得整理如下。

一、基本硬件介绍


  1. Edison模块,懒得多说,我使用的是Edison的breakout板子,小伙伴使用的是Edison的Arduino板子,刷入最新固件,更新mraa库。
  2. BLE模块,选用CC2540芯片的BLE蓝牙模块,两块模块已经预先写入程序,要问我程序是什么,我也不知道,总之只知道对蓝牙的操作命令,这个模块是HC-06,可以上网上查。具体是这样的:

    HC-06是采用CC2540F256芯片的一种单模式低功耗蓝牙解决方案,采用8051型MCU,128k或256k内建快闪记忆体,8kSRAM,完整整合了无线射频低功耗蓝牙模块。


此处需要注意
TXD-1RXD-2RST-11VCC-12GND-13KEY-26LED-24GND-22

其中后边接的数字是引脚号,如果我写错了不要怪我哦,自己查手册最有保障。供电最好3.3V,手册推荐的,我也试过用5V,反正能用没烧。
其中LED我认为挺方便的,在后边的调试时帮我解决了一个很大的问题,所以推荐接上,LED的指令是这样的:

  1. 主机未记录从机地址时:每秒100ms
  2. 主机记录从机地址时:每秒900ms
  3. 从机:每2s亮1s
  4. 通信连接后:常亮

最后注意:蓝牙模块在未连接时可以通过AT类指令操作蓝牙,连接后进入串口透传模式。这也是挺坑爹的地方,为什么?因为每次想配置蓝牙时,都要招呼小伙伴把他们的蓝牙关掉,因为会自动连接上。

二、基本命令

该蓝牙的使用特别简单,当周围环境中该型号的蓝牙只有一个时可以上电并对其进行配置,留出来的接口命令有:

  1. AT //检查模块是否正常,正常返回OK
  2. AT+RX //查看模块基本参数,返回基本参数
  3. AT+VERSION //获取当前版本、日期
  4. AT+ROLE=X //X可取M或S,分别代表设置主机或从机,正常返回OK
  5. AT+NAME=XXX //修改蓝牙名称,XXX可取任何字符串,代表蓝牙名称

等等等等,我就不列举了,可以上网查资料。

三、调试过程

首先,将蓝牙与Edison通过UART接口相连,不管是breakout板子还是arduino板子,都可以有UART接口引出。其次,通过在Edison上调用mraa库的uart函数来与蓝牙模块通信。最后,实现用Edison板子发送配置命令到蓝牙模块来配置蓝牙状态,同时可以通过该蓝牙与另一个板子上的蓝牙通信。
插一句,Edison本身就有BLE低功耗蓝牙,所以这次实验仅仅是为了学习,没有太多实际的用途,通过该实验可以学习Edison的uart操作(mraa库对uart的操作),以及ble的基本通信方式,当然还有调试成功时满满的成就感。

四、至今未解决的问题

有一个一直没有解决的问题,将整个系统建立完成后,Edison1为breakout板子扩展的uart,Edison2为arduino板子扩展的uart,问题是:通过Edsion2控制的ble可以发送任意不带字符结束符的字符串给Edison1,可以正常接到;但是通过Edison1发送的不带字符结束符的字符串给Edison2,Edison2无法接到,而唯独携带字符结束符才可以被Edison2接收。但,Edison1对ble1的配置命令需要不带字符结束符(当然,如上所说的所有不带字符结束符都是指在程序里不显式的添加字符结束符),所以Edison1的ble1无法正常使用。
另外,经测试,Edison2其实接收到了Edison1不带字符结束符的字符串,但是Edison2却接收到了该字符串,只是无法被mraa_uart_read()函数读取,准确的说是mraa_uart_available()函数并没有认为当前满足了读取buf的条件,直到字符结束符接到时才满足了条件。BUT!,同样的程序写入到两个板子里,为什么breakout板子没有问题,但是arduino板子有问题?会是硬件的问题吗?

10月22日:这个问题的解决办法是:我没有深刻的理解字符串结束符中的'\0'与'\n',我在发送一个字符串(比如AT)时,默认给这个字符串加了一个'\n'结束符,并认为这个是字符串的结束符,由于程序是通过getchar()函数一个个的接收字符,所以最终组成的字符数组并没有由系统自动添加字符串结束标志'\0',而是由我添加了一个'\n',当然我不是故意添加的,getchar()函数会捕获键盘输入的一个字符串的最后一个字符,也就是'\n'。所以,最后解决办法是,判断当前最后一个字符串的值是不是'\n',如果是就转换成'\0',这样就可以正常发送。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注