糖尿病康复,内容丰富有趣,生活中的好帮手!
糖尿病康复 > NBIOT专栏之BC28与STM32F103单片机串口通信连接阿里云

NBIOT专栏之BC28与STM32F103单片机串口通信连接阿里云

时间:2020-08-25 15:11:07

相关推荐

NBIOT专栏之BC28与STM32F103单片机串口通信连接阿里云

系列文章目录

创思通信BC28核心板+STM32F系列单片机开发记录博客

1.测试BC28模块

2.串口助手MQTT连接阿里云物联网平台接发数据


前言

前面记录了BC28使用串口调试助手连接阿里云的过程,最头疼的还是使用单片机连接阿里云,因为代码是真的让人头疼!还好,经过不断的找源码,测试代码,修改代码,终于搞好了!下面跟大家分享一下!

正文

1.串口初始化

BC28模块和单片机是通过串口发送AT指令的!所以需要进行串口初始化!我使用野火指南者的板子,这里我使用的是串口1进行串口打印,串口3进行单片机与BC28的通信!

这里主要说一下我的串口3的两个引脚是B10和B11,B10作为单片机的接收端连接BC28的发送端(Tx),B11作为单片机的发送端连接BC28的接收端(Rx),下面是我的串口3接收BC28模块返回来的数据,存放在 RxBuffer[]数组中。

void USART3_IRQHandler(void) //串口3中断服务程序{char Res;//接收模块返回来的数据if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) { /接收模块返回来的数据Res=USART_ReceiveData(USART3);RxBuffer[RxCounter++] =USART_ReceiveData(USART3);} }

2.打开BC28模块

向BC28发送AT指令,如果没有响应再打开BC28。

void OPEN_BC28(void){char *strx;printf("AT\r\n"); delay_ms(300);strx=strstr((const char*)RxBuffer,(const char*)"OK");//返回OKprintf("AT\r\n"); delay_ms(300);strx=strstr((const char*)RxBuffer,(const char*)"OK");//返回OKif(strx==NULL){PWRKEY=1;//拉低delay_ms(300);delay_ms(300);delay_ms(300);delay_ms(300);PWRKEY=0;//拉高正常开机}printf("AT\r\n"); delay_ms(300);strx=strstr((const char*)RxBuffer,(const char*)"OK");//返回OKif(strx==NULL)//如果设备休眠了,就复位模块{RESET=1;//拉低delay_ms(300);delay_ms(300);RESET=0;//复位模块}printf("ATE0&W\r\n"); //关闭回显delay_ms(300); printf("AT+QMTDISC=0\r\n");//关闭连接delay_ms(300);printf("AT+QMTCLOSE=0\r\n");delay_ms(300); }

3.BC28初始化

BC28的初始化,也是单片机通过串口3向BC28发送初始化AT指令。

其中使用printf()函数发送指令,利用strstr函数将接收到的响应数据与正常应该返回的数据做比较,不一致返回null,程序就进入循环中发送命令,一直到和规定数据一致。

//RxBuffer[255]存放单片机接收BC28发来的数据,缓冲区extern unsigned char RxBuffer[255],RxCounter;//清空缓存区void Clear_Buffer(void)//清空缓存{u8 i;Uart1_SendStr(RxBuffer);for(i=0;i<100;i++)RxBuffer[i]=0;//缓存RxCounter=0;}void BC28_Init(void){printf("AT\r\n"); delay_ms(300);strx=strstr((const char*)RxBuffer,(const char*)"OK");//返回OKClear_Buffer();while(strx==NULL){Clear_Buffer();printf("AT\r\n"); delay_ms(300);strx=strstr((const char*)RxBuffer,(const char*)"OK");//返回OK}printf("AT+CFUN=1\r\n");//获取卡号,类似是否存在卡的意思,比较重要。delay_ms(300);printf("AT+CIMI\r\n");//获取卡号,类似是否存在卡的意思,比较重要。delay_ms(300);strx=strstr((const char*)RxBuffer,(const char*)"460");//返460,表明识别到卡了Clear_Buffer();while(strx==NULL){Clear_Buffer();printf("AT+CIMI\r\n");//获取卡号,类似是否存在卡的意思,比较重要。delay_ms(300);strx=strstr((const char*)RxBuffer,(const char*)"460");//返回OK,说明卡是存在的}printf("AT+CGATT=1\r\n");//激活网络,PDPdelay_ms(300);strx=strstr((const char*)RxBuffer,(const char*)"OK");//返OKClear_Buffer();printf("AT+CGATT?\r\n");//查询激活状态delay_ms(300);strx=strstr((const char*)RxBuffer,(const char*)"+CGATT:1");//返1Uart1_SendStr((char*)RxBuffer);Clear_Buffer();Uart1_SendStr("CGATT。。。。。。");while(strx==NULL){Clear_Buffer();printf("AT+CGATT?\r\n");//获取激活状态delay_ms(300);strx=strstr((const char*)RxBuffer,(const char*)"+CGATT:1");//返回1,表明注网成功}printf("AT+CESQ\r\n");//查看获取CSQ值delay_ms(300);strx=strstr((const char*)RxBuffer,(const char*)"+CESQ");//返回CSQif(strx){BC26_Status.CSQ=(strx[7]-0x30)*10+(strx[8]-0x30);//获取CSQif((BC26_Status.CSQ==99)||((strx[7]-0x30)==0))//说明扫网失败{while(1){status=0;Uart1_SendStr("信号搜索失败,请查看原因!\r\n");RESET=1;//拉低delay_ms(300);delay_ms(300);RESET=0;//复位模块delay_ms(300);//没有信号就复位}}else{status=1;} }Clear_Buffer();}

4.连接阿里云物联网平台

(1)首先要宏定义阿里云平台的三元组信息。

#define ProductKey"a1tW6nsMu2w" //²úÆ·KEY#define DeviceName"BC28"//#define DeviceSecret "9ef288679f79069558bbf3d82da90931" //#define PubTopic "/sys/a1tW6nsMu2w/BC28/thing/event/property/post"#define SubTopic "/sys/a1tW6nsMu2w/BC28/thing/service/property/set"

(2)连接阿里云物联网平台

void MQTT_Init(void){printf("AT+QMTCFG=\"aliauth\",0,\"%s\",\"%s\",\"%s\"\r\n",ProductKey,DeviceName,DeviceSecret);delay_ms(300);printf("AT+QMTOPEN=0,\"139.196.135.135\",1883\r\n");//通过TCP方式去连接MQTT阿里云服务器 delay_ms(300);strx=strstr((const char*)RxBuffer,(const char*)"+QMTOPEN: 0,0");//看下返回状态while(strx==NULL){strx=strstr((const char*)RxBuffer,(const char*)"+QMTOPEN: 0,0");//确认返回值正确}Clear_Buffer(); printf("AT+QMTCONN=0,\"client\"\r\n");//去登录MQTT服务器,名称随意delay_ms(300);strx=strstr((const char*)RxBuffer,(const char*)"+QMTCONN: 0,0,0");//看下返回状态while(strx==NULL){strx=strstr((const char*)RxBuffer,(const char*)"+QMTCONN: 0,0,0");//看下返回状态}Clear_Buffer(); }

(3)向阿里云发送数据

void aliyunMQTT_PUBdata(u8 temp,u8 humi){u8 t_payload[200],len;printf("AT+QMTPUB=0,0,0,0,\"%s\"\r\n",PubTopic);//发布主题delay_ms(300);len=Mqttaliyun_Savedata(t_payload);t_payload[len]=0;printf("%s",t_payload);while((USART3->SR&0X40)==0);//循环发送,直到发送完?USART3->DR = (u8) 0x1A; delay_ms(100);strx=strstr((const char*)RxBuffer,(const char*)"+QMTPUB: 0,0,0");//看下返回状态while(strx==NULL){strx=strstr((const char*)RxBuffer,(const char*)"+QMTPUB: 0,0,0");//看下返回状态}Clear_Buffer(); }//生成JSON格式数据u8 Mqttaliyun_Savedata(u8 *t_payload,){int err;uint16_t pkt_id = 1;char led1status1,led1status2; char json[]="{params:{RoomHumidity:5.8}}"; char t_json[200];int payload_len;unsigned short json_len;sprintf(t_json, json, temp, humi);payload_len = strlen(t_json)/sizeof(char);json_len = strlen(t_json)/sizeof(char);memcpy(t_payload, t_json, json_len);return json_len;}

整个工程的代码下载链接:[点击下载](/download/JIANGYINGH/85203136)

如果觉得《NBIOT专栏之BC28与STM32F103单片机串口通信连接阿里云》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。