迅维网
标题:
【NUCLEO-F412ZG试用体验】蓝牙串口(
[打印本页]
作者:
バ幸福De右岸
时间:
2016-12-26 10:10
标题:
【NUCLEO-F412ZG试用体验】蓝牙串口(
在玩STM32时用的最多的就是串口了,之前学了一段安卓应用开发,稍微玩了一下蓝牙SPP
通信
,只不过是SOCKET通信,也知道STM32可以外接蓝牙串口模块,碍于手上没有模块一直没有玩起来,在工作中也有接触蓝牙模块,只不过能力有限,蓝牙协议相关的东西太多了,没有深入了解。这次玩这个也就是通过串口进行数据传输,并没有深入蓝牙的相关协议。下面是关于STM32和蓝牙模块之前的通信模型。
登录/注册后看高清大图
蓝牙模块的应用主要是通过串口和STM32进行连接,通过PC同时连接蓝牙模块和STM32连接。PC和蓝牙模块之间是通过蓝牙无线连接,而STM32和PC之间是通过串口进行通信。目前只做了单方向通信。就是通过蓝牙向STM32发送数据,暂时没有通过STM32控制蓝牙模块,执行一些蓝牙模块的指令,这个也很容易做到,只需要在接收到PC发来的数据后进行重组,通过串口发送给蓝牙模块就可以。
登录/注册后看高清大图
效果图如上,上部的终端连接的是F412的串口,而下面的终端连接的是蓝牙串行通信链路,目前可以单方向的进行数据传输。关于蓝牙模块的使用的一点感想,就是蓝牙模块有两种状态,一种是命令状态,一种是数据传输状态。当在命令状态时,通过F412向蓝牙模块发数据,如果是AT命令,则蓝牙模块会做相应的处理,但是连接上蓝牙后,发送的就不再是命令了。所以实际开发的过程中应该区分这两种状态。但是如果蓝牙串口和电脑之间断开连接,STM32并不能区分这种状态,虽然可以通过字符串查询,但是不能保证应用的过程中也包括状态信息一样的字符串,能想到的也就是尽量避免使用AT命令状态返回的字符串。
同时这次修复了一处错误,就是对printf进行的
封装
,如下
int os_print(const char *fmt, ...)
{
int res = -1;
com_get_sem();
va_list args; //定义va_list类型变量,用来存储单个参数
va_start(args, fmt); //使用args指向可变参数的第一个参数
//注意,下面不是printf,如果是printf则无法打印格式化的字符串。
[color=rgb(51, 102, 153) !important]
复制代码
spp的源文件如下,
spp.c是核心部分,
spp_interface.c是作为接口供外部处理数据,这里仅仅是打印了蓝牙模块接收到的数据。
spp_transport.c应该是处理蓝牙模块的收发函数,这里没有做好,接收部分没有放到这个文件。
登录/注册后看高清大图
所要作的工作就是把spp的接收函数映射到STM32的串口,当遇到“\r\n”时处理这一帧数据。
待有时间再把双向收发这一部分做一下,同时也要对数据和命令两种模式进行区分。
NUCLEO_F412.zip
2016-12-26 10:10 上传
点击文件名下载附件
下载积分: 下载分 -2 分, 下载 1 次
2.84 MB, 下载次数: 1, 下载积分: 下载分 -2 分, 下载 1 次
欢迎光临 迅维网 (https://www.chinafix.com/)
Powered by Discuz! X3.4