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");//返回OK
    printf("AT\r\n"); 
    delay_ms(300);
    strx=strstr((const char*)RxBuffer,(const char*)"OK");//返回OK
   if(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");//返回OK
     if(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");//返回OK
    Clear_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");//激活网络,PDP
        delay_ms(300);
        strx=strstr((const char*)RxBuffer,(const char*)"OK");//返OK
        Clear_Buffer();	
        printf("AT+CGATT?\r\n");//查询激活状态
        delay_ms(300);
        strx=strstr((const char*)RxBuffer,(const char*)"+CGATT:1");//返1
		    Uart1_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");//返回CSQ
		if(strx)
			{
				BC26_Status.CSQ=(strx[7]-0x30)*10+(strx[8]-0x30);//获取CSQ
				if((BC26_Status.CSQ==99)||((strx[7]-0x30)==0))//说明扫网失败
				{
					while(1)
					{
                        BC26_Status.netstatus=0;
						Uart1_SendStr("信号搜索失败,请查看原因!\r\n");
                        RESET=1;//拉低
                        delay_ms(300);
                        delay_ms(300);	
                        RESET=0;//复位模块
						delay_ms(300);//没有信号就复位
					}
				}
             else
             {
                 BC26_Status.netstatus=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;
}

猜你喜欢

转载自blog.csdn.net/JIANGYINGH/article/details/112580210