嵌入式mcu与4G模块通过串口来实现连接,并通信。第一步在mcu中先将串口配置好。配置串口相关代码:
uart_gpio_t g4_uart_gpio={.gpio_uart_clock = RCC_AHB1Periph_GPIOC,.gpio_group = GPIOC,.gpio_tx = GPIO_Pin_6,.gpio_rx=GPIO_Pin_7,.gpio_pin_source_tx=GPIO_PinSource6,.gpio_pin_source_rx=GPIO_PinSource7,.gpio_af_uart=GPIO_AF_USART6};uart_nvic_t g4_uart_nvic={.uart_irq_channel = USART6_IRQn,.uart_irq_pp=0,.uart_irq_subp=1};uart_config_t g4_uart_config= {.uart= USART6, .uart_clock =RCC_APB2Periph_USART6,.baudrate = 115200,.uart_word_length=USART_WordLength_8b, .uart_stop_bits = USART_StopBits_1, .uart_parity = USART_Parity_No};uart_t g4_uart={.rx_irq_enable =1,.uart_config = &g4_uart_config,.uart_nivc = &g4_uart_nvic,.uart_gpio=&g4_uart_gpio};
二、AT指令
AT指令集是mcu串口与模块之间通信的数据协议。AT指令大多数,以AT+命令开始,以<CR>作为结束。AT指令集的数据回复,都是<CR><LF>结束的。这样就非常方便进行程序开发。各模块厂商所设置的at指令集有些不同,但大多数都是通用的。

初始化发送的AT指令集:
at_command_t at_command[]={{"AT+IPR=460800\r\n",0,0,NULL,NULL,set_ipr,0},{"AT&W\r\n",0,0,NULL,NULL,save_option,0},{"AT+IPR?\r\n",1,0,"+IPR:",NULL,query_ipr,0},{"ATE0\r\n",1,0,"OK",NULL,ate1,0},{"AT+CGMI\r\n",1,0,"OK",NULL,query_cgmi,0},//{"AT+CGMM\r\n",1,0,"OK",NULL,query_cgmm,0},{"AT+CGMR\r\n",1,0,"OK",NULL,query_cgmr,0},{"AT+CPIN?\r\n",1,0,"+CPIN","+CME",query_cpin,0}, {"AT+CREG?\r\n",1,0,"+CREG",NULL,query_creg,0},{"AT+CGDCONT=1,\"IP\",\"CMNET\"\r\n",1,0,"OK",NULL,query_cgdcont,0},{"AT+MIPCALL=1\r\n",1,0,"+MIPCALL","ERROR",query_call_pdp,0},{"AT+MIPCALL?\r\n",1,0,"+MIPCALL","OK",query_pdp,0},{"AT+MIPHEX=1\r\n",1,0,"OK",NULL,save_miphex,0},{NULL,0,0,NULL,NULL,0}};
上述代码是一个结构体数组。对于每一个AT指令,都对应于一个处理函数。每次发送一个at指令,然后等待处理完此at指令后,才可以进行下一次的发送。这样就不会出现混乱的现象(发送的at指令与接收到的数据不一致现象)
用at指令进行远程服务器连接
AT+MIPOPEN=<Socket_ID>,<Source_Port>,<Remote_IP>,<Remote_Port>,<Protocol>
其中socket_id为模块支持的socket编号,1-10
source_port可以为0,
remote_ip远端服务器地址,为IP或域名
remote_port远端服务器的端口号
protocol 协议类型 0 为tcp
用此命令连接远端服务器后,就可以实现数据的发送与接收。
数据发送指令为:
AT+MIPSEND=1\" +数据
AT+MIPPUSH=1
AT+MIPSEND即将数据发送至连接到的远端服务器上,但此时数据并没有立即发送至远端,而是缓存在模块内部中
AT+MIPPUSH=1 这个指令的意思是立即将数据发出
上述2个指令,需要联合使用,发送这2个指令前后需要一定时间的延迟,不然会出现发送失败的情况。
附一张发送数据并接收数找的图
+MTPRTCP由4G模块发向mcu端,此为从远端服务器接收到的数据内容。