NBiot M5311模组+STM32F103调试

     M5311模组+STM32F103的调试,主要问题在串口,只要串口通信没问题,其它的都是AT指令搞定的。

首先搞定STM32F103的USART,我用的是USART1,初始化如下

 
void uart_init(u32 bound){

  GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
     
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);   
     //USART1_TX   PA.9
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   
    GPIO_Init(GPIOA, &GPIO_InitStructure);
 
    //USART1_RX      PA.10
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);  

 

    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;       
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            
    NVIC_Init(&NVIC_InitStructure);   
   

    USART_InitStructure.USART_BaudRate = bound;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;    

    USART_Init(USART1, &USART_InitStructure);
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
    USART_Cmd(USART1, ENABLE);                   

}

串口中断函数如下:

u16 USART_RX_FLAG=0;
void USART1_IRQHandler(void)                    //´®¿Ú1ÖжϷþÎñ³ÌÐò
{
    u8 Res;

    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) 
    {
        USART_ClearITPendingBit(USART1,USART_IT_RXNE);//
        Res =USART_ReceiveData(USART1);//(USART1->DR);    
        
        if((USART_RX_STA&0x8000)==0)
        {

            if(USART_RX_FLAG&0x4000)//注意这里只能用USART_RX_FLAG来标记,不要用官方给的用USART_RX_STA
            {
                if(Res!=0x0a)
                {
                    USART_RX_FLAG = 0;
                    USART_RX_STA=0;

                }
                else 
                {
                    USART_RX_STA|=0x8000;   
                }
            }
            else 
            {    
                if(Res==0x0d)
                {
                    USART_RX_FLAG|=0x4000;        
                }
                else
                {
                    USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
                    USART_RX_STA++;
                    if(USART_RX_STA>(USART_MAX_RECV_LEN-1))USART_RX_STA=0;
                }         
            }

        }            
  } 

注意标记在接收到0x0D的时候,这里只能用USART_RX_FLAG来标记,不要用官方给的用USART_RX_STA用USART_RX_STA标记会有点问题,就是打印的数据不完整,头几个字节的数据总是会丢掉,影响串口接收。

串口调试好了之后,下一步就是对接M5311调试了,主要看AT指令了,然后就是你要以那种网络通信协议(MQTT/COAP/HTTP/TCP/M2M等)与服务器连接,通信。我在这里选择TCP通信

首先对模组进行必要的设置

1、AT,同步波特率,这个是必要的,两块不同的STM32F103的板子,可能USART波特率设置一样,串口通信可能就不一样。

2、AT+SM=LOCK_FOREVER,不关机,不然你发一个AT指令后,一会在发的时候就发不了了。

3、AT+CSQ,获得信号量

4、AT+CGREG=1,注册网络

5、AT+ICCID,获得ICCID号,或用AT+CIMI获得EIMI号

6、AT+IPRCFG=1,0,1,配置自动接收,将接收的数据自动打印到串口,以hex的形式

7、AT+CPSMS=0,去掉省电模式,这个不设置成0,接收的网络数据不能打印到串口

8、AT_CGATT=1,附着网络

后面就是建立TCP及连接了

apn为cmnbiot, user_name和pwd可以不填,根据你的需要决定

AT+IPSTART=0,"TCP","域名/IP地址",端口号,建立连接就OK了

最后就是发数据了AT+IPSEND=0,4,"12345678"  //发4个字节的HEX字节给服务器

返回+IPSEND=0,4      OK,就发送完成了

这里最主要的就是与服务器端设定的对接数据协议,知道协议,按照数据格式发送就OK了

 

 

你可能感兴趣的:(NBIOT)