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了