电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
BC26从入门连云(二)STM32 驱动BC26
分 享
扫描二维码分享
BC26从入门连云(二)STM32 驱动BC26
物联网
Hello Pointer!!!
关注
发布时间: 2020-01-09
丨
阅读: 5471
一、模块开机 我们要使模块工作,第一步需要做的就是开机,这里我们看一下移远给的手册里面是如何实现模块开机的![](https://cf02.ickimg.com/bbsimages/202001/78b3e1c09276f01c9fd0415b04a8d0ca.png) ![](https://cf02.ickimg.com/bbsimages/202001/4d6843319b24ece5edb1cc30ddefb393.png) 由上图可以看到:我们给予模块的PWRKEY引脚 500ms 左右的低电平就可以开启模块。移远也给了一个参考电路,实现起来还是很方便的。(之后我会将整个模块的原理图添进附件) ```c #define LS_BC26_KEYH (GPIO_SetBits(GPIOB, GPIO_Pin_1))//开机引脚高电平 #define LS_BC26_KEYL (GPIO_ResetBits(GPIOB, GPIO_Pin_1))//开机引脚低电平 #define LS_7030_PWH (GPIO_SetBits(GPIOA, GPIO_Pin_1)) //供电控制引脚 uint8_t Turn_ON_A9500(void) { uint16_t i = 0; LS_7030_PWH; LS_7030_KEYL; Delay_ms(1500); LS_7030_KEYH; Delay_ms(1000); LS_7030_KEYL; return 1; } ``` 二、模块初始化 开完机之后,我们就要进行发数之前的准备工作。因为之前已经详细介绍了如何通过AT指令去连云,所以这里不再赘述,我们直接看代码是如何实现的吧。 1. 发送 AT ,验证模块是否已经开始工作 ```c for (i = 0; i < 10;i++ ) { BC26_CLEAR_RECEIVE; BC26_USART_SEND("AT\r\n",strlen("AT\r\n"));// BC26_DELAY_MS(500); if( strstr(BC26_UART2_RX_BUF,strBakValueOK)){ break; }else if (i>= 8) { return 0; } } ``` 逻辑: 发送AT,返回OK之后退出循环,如果连续 8次没有返回则结束初始化。 至于循环发送的次数,可以视情况而定。 2.发送ATI ,查看模块的固件版本,确定是否需要更换固件版本。 ```c for (i = 0; i < 10;i++ ) { BC26_CLEAR_RECEIVE; BC26_USART_SEND("ATI\r\n",strlen("ATI\r\n"));//查看软件版本 BC26_DELAY_MS(500); if( strstr(BC26_UART2_RX_BUF,strBakValueOK)){ break; } } ``` 3.发送ATE0,关闭回显。这里意思就是命令发送完成后,返回信息中是否需要包含命令。 ATE0关闭回显 ATE1开启回显 ```c for (i = 0; i < 10;i++ ) { BC26_CLEAR_RECEIVE; BC26_USART_SEND("ATE0\r\n",strlen("ATE0\r\n"));// BC26_DELAY_MS(500); if( strstr(BC26_UART2_RX_BUF,strBakValueOK)){ break; } } ``` 4.发送 AT+CFUN?开启SIM卡全功能,我们需要上发数据到平台的时候 AT+CFUN=1. ```c for (i = 0; i < 10;i++ ) { BC26_CLEAR_RECEIVE; BC26_USART_SEND("AT+CFUN?\r\n",strlen("AT+CFUN?\r\n"));// BC26_DELAY_MS(500); if( strstr(BC26_UART2_RX_BUF,strBakValueOK)){ if(strstr(BC26_UART2_RX_BUF,strBakValueFUN1)){ break; }else{ BC26_USART_SEND("AT+CFUN=1\r\n",strlen("AT+CFUN=1\r\n")); BC26_DELAY_MS(2000); } }else if (i>= 8) { goto BC26RESTART; } } ``` 5. 发送 AT+CGSN=1;获取 IMEI(设备的唯一标识符),这个相当于我们的身份证号,每一个模块有且只有一个,在连接云平台的时候也必须要用。 ```c //获取 IMEI for (i = 0; i < 5;i++ ) { char aH,aL; int i,test2 = 0; uint8_t j = 0; BC26_CLEAR_RECEIVE; BC26_USART_SEND("AT+CGSN=1\r\n",strlen("AT+CGSN=1\r\n")); BC26_DELAY_MS(500); if( strstr(BC26_UART2_RX_BUF,strBakValueOK)){ test2 = 0; for(i=0;i<15;i++) { BC26_COAP_IMEI[12+i] = BC26_UART2_RX_BUF[9+i]; } for(j=0;j<strlen(bc26_uart2_rx_buf);j++){ if(bc26_uart2_rx_buf[j]="">='0'&&BC26_UART2_RX_BUF[j]<='9'){ if(test2 == 0) { test2 = 1; USART0_TX_Buffer1[3] =0x00|(BC26_UART2_RX_BUF[j]&0x0f); USART0_TX_XT[3] = 0x00|(BC26_UART2_RX_BUF[j]&0x0f); USART0_BB_Buffer1[3] = 0x00|(BC26_UART2_RX_BUF[j]&0x0f); }else{ aH = BC26_UART2_RX_BUF[j]; aL = BC26_UART2_RX_BUF[++j]; USART0_TX_Buffer1[3+test2] = ((aH)&0x0f)<<4|((aL)&0x0f); USART0_TX_XT[3+test2] = ((aH)&0x0f)<<4|((aL)&0x0f); USART0_BB_Buffer1[3+test2] = ((aH)&0x0f)<<4|((aL)&0x0f); test2++; } } if(test2 == 8){break;} } break; } } ``` 大概逻辑: 将接收到的IMEI号,拷贝到其它几个数组当中,这个等到我们发送数据的时候是重要的一步。 6.发送 AT+CESQ ,查看信号强度,这个就是和我们平时所说的手机卡的信号强度是一个道理。只有信号好了我们发送的数据才能快速稳定的上传到品台。我们主要看返回的第一个参数,如果是 0或者99,说明信号没有或者是很差,这时候我们需要检查入网情况(这个在下一条会讲),一般信号在30-40 之间说明信号还是比较好的。 ```c // //测试信号强度 for (i = 0; i < 60;i++ ){ uint8_t test1 = 0; uint16_t j=0; char aH,aL; BC26_CLEAR_RECEIVE; BC26_USART_SEND("AT+CESQ\r\n",strlen("AT+CESQ\r\n")); BC26_DELAY_MS(1000); if( strstr(BC26_UART2_RX_BUF,strBakValueOK)){ for(j=0;j<strlen(bc26_uart2_rx_buf);j++){ if((bc26_uart2_rx_buf[j]="">='0')&&(BC26_UART2_RX_BUF[j]<='9')){ aH = BC26_UART2_RX_BUF[j]; aL = BC26_UART2_RX_BUF[j+1]; if(((aL == '9')&&(aH == '9'))||(aH == '0')){ test1 = 0; }else if(aL>='0'&&aL<='9'){ //USART0_TX_Buffer1[24] = ((aH)&0x0f)<<4|((aL)&0x0f); // 写入 信号强度 test1 = 1; }else{ // USART0_TX_Buffer1[24] = (((aH)&0x0f)|0x00); test1 = 1; } break; } } } if(test1 == 1){ test1 = 0; break; } if (i>= 59) { goto BC26RESTART; } } ``` 代码逻辑:与上面的,几乎一致,我们需要查看一下返回的信号强度,因为信号强度不是我们连云的必要参数,所以不用卡贝到数据协议当中去。 7.发送 AT+CGATT? 查看网络注册情况 返回1,表示已经附着上网络。 返回0,表示附着网络失败。这时候应该发送 AT+CESQ 看看是否是信号质量太差,那么需要看看硬件天线是否插好,或者靠窗。 ```c //查看入网状态 返回1入网成功 返回2入网失败 for (i = 0; i < 20;i++ ) { BC26_CLEAR_RECEIVE; BC26_USART_SEND("AT+CGATT?\r\n",strlen("AT+CGATT?\r\n"));// BC26_DELAY_MS(1000); if( strstr(BC26_UART2_RX_BUF,strBakCGATT1)){ break; }else if (i>= 19) { goto BC26RESTART; } } ``` 代码逻辑,这个一直是我们查询网络状态的一种方式,而不是我们上云的必要手段。 8.发送 AT+NSOCR=STREAM,6,65000,1 //设置成TCP模式,并选用通道1,这个具体要看平台的要求(我这里用的是onenet) ```c //设置成TCP模式,并选用通道1 for (i = 0; i < 20;i++ ) { BC26_CLEAR_RECEIVE; BC26_USART_SEND("AT+NSOCR=STREAM,6,65000,1\r\n",strlen("AT+NSOCR=STREAM,6,65000,1\r\n"));// BC26_DELAY_MS(1000); if( strstr(BC26_UART2_RX_BUF,strBakNSOCK)){ break; }else if (i>= 19) { goto BC26RESTART; } } ``` 9. 到这里我们就可以开始最关键的一步了,连云: 这里我们需要提前准备 ONENET平台的IP和端口,183.230.40.39,6002 ```c //连接 onenet MQTT服务器 for (i = 0; i < 20;i++ ) { BC26_CLEAR_RECEIVE; BC26_USART_SEND("AT+NSOCO=1,183.230.40.39,6002\r\n",strlen("AT+NSOCO=1,183.230.40.39,6002\r\n"));// BC26_DELAY_MS(1000); if( strstr(BC26_UART2_RX_BUF,strBakNSOCO)){ break; }else if (i>= 19) { goto BC26RESTART; } } ``` 如果我们接连没有问题的话,这个时候设备就应该已经上线了。 设备状态应该变为在线(我这里没有设备所以没法演示) ![](https://cf02.ickimg.com/bbsimages/202001/c36888af26da8e6c61a072b1f5469197.png) 10.接下来我们就可以愉快的发送我们想要的数据了,但是,这里要注意一下:我们需要将要发送的数据转换成 16进制的形式再发送。(具体转化过程我已经在上一篇文章当中说过过了,大家有问题的可以看一下上一篇文章)。 ![](https://cf02.ickimg.com/bbsimages/202001/78874707e53b4e787232136f9d77c5e6.png) 上图是我之前发上去的数据,大家可以作为参考看一下。那么,到此我们就实现了 STM32驱动BC26 上传数据到云平台的整个过程。大家有什么建议或者问题的话请在下方留言交流,如果觉得文章还可以,可以稍微打赏一点,谢谢观看。
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
0
)
Hello Pointer!!!
关注
评论
(1)
登录后可评论,请
登录
或
注册
Hello Pointer!!!
110
天前...
如果对文章有任何问题或者建议可以 QQ 1812669090联系
0
回复
发布
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交