BC28のNBIOT列およびAlibabaCloudへのSTM32F103MCUシリアル通信接続

シリーズ記事ディレクトリ

Chuangsi CommunicationBC28コアボード+ STM32Fシリーズマイクロコントローラー開発記録ブログ
1.BC28モジュールのテスト2.シリアルアシスタントMQTTはAlibabaCloudIoT
プラットフォームに接続してデータを送受信します


序文

シリアルデバッグアシスタントを使用してAlibabaCloudに接続するBC28のプロセスを記録しました。コードが本当に頭痛の種であるため、最も厄介なのは、MCUを使用してAlibabaCloudに接続することです。幸いなことに、常にソースコードを探し、コードをテストし、コードを変更した後、ついに完了しました。あなたと共有させてください!

テキスト

1.シリアルポートの初期化

BC28モジュールとマイクロコントローラーはシリアルポートを介してATコマンドを送信します!したがって、シリアルポートを初期化する必要があります!私は山火事ガイドのボードを使用しています。ここでは、シリアルポートの印刷にシリアルポート1を使用し、MCUとBC28間の通信にシリアルポート3を使用しています。
ここでは、主にシリアルポート3の2つのピンであるB10とB11について説明します。B10はマイクロコントローラーの受信側としてBC28の送信機(Tx)に接続され、B11はの受信側(Rx)に接続されます。マイクロコントローラの送信機としてのBC28。以下は、私のシリアルポート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モジュールを開きます
ATコマンドをBC28に送信します。応答がない場合は、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を介して初期化ATコマンドをBC28に送信するワンチップコンピュータでもあります。
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. Alibaba CloudIoTプラットフォームに接続します

(1)まず、AlibabaCloudプラットフォームのトリプレット情報をマクロで定義する必要があります。

#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)Alibaba CloudIoTプラットフォームに接続します

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)AlibabaCloudにデータを送信する

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