国产stm32(ng32031)连接4G模块(EG800K)实现云端通信
该硬件原理非常简单,主要是32芯片通过串口通信,发送AT指令来控制EG800K芯片进行云端通信。
·
一、硬件设计
该硬件原理非常简单,主要是32芯片通过串口通信,发送AT指令来控制EG800K芯片进行云端通信。想必大家很清楚
二、软件设计
1.串口初始化(配置USART1)
void UART1_Init(void)
{ //1.定义结构体
USART_InitType USART_InitStructure;
GPIO_InitType GPIO_InitStructure;
NVIC_InitType NVIC_InitStructure;
RCC_ClocksType RCC_ClocksStatus;
// 2.使能GPIO时钟,使能USART时钟
RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOA, ENABLE);// 使能GPIOA的时钟,以便可以使用与USART1相关的引脚
RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_USART1, ENABLE); // 使能USART1的时钟,以便可以进行数据传输
// 3.初始化GPIO与串口结构体
//GPIO_InitStruct(&GPIO_InitStructure); //复位gpio
USART_Init(USART1, &USART_InitStructure); //复位串口1
// 4.配置USART1 Tx引脚为复用推挽输出
GPIO_InitStructure.Pin = GPIO_PIN_9;
GPIO_InitStructure.GPIO_Mode = GPIO_MODE_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_HIGH;
GPIO_InitStructure.GPIO_Alternate = GPIO_AF4_USART1; // 设置GPIO引脚的复用功能为USART1
GPIO_InitPeripheral(GPIOA, &GPIO_InitStructure);
// 5.配置USART1 Rx引脚为复用推挽输入
GPIO_InitStructure.Pin = GPIO_PIN_10;
GPIO_InitStructure.GPIO_Alternate = GPIO_AF4_USART1; // 设置GPIO引脚的复用功能为USART1
GPIO_InitPeripheral(GPIOA, &GPIO_InitStructure); // 初始化GPIO引脚
// 6.获取时钟频率值
RCC_GetClocksFreqValue(&RCC_ClocksStatus);
// 7.配置UART参数
USART_InitStructure.BaudRate = 115200;
USART_InitStructure.WordLength = USART_WL_8B;
USART_InitStructure.StopBits = USART_STPB_1;
USART_InitStructure.Parity = USART_PE_NO;
USART_InitStructure.HardwareFlowControl = USART_HFCTRL_NONE;
USART_InitStructure.Mode = USART_MODE_RX | USART_MODE_TX;
USART_Init(USART1, &USART_InitStructure);
// 8.使能UART
USART_Enable(USART1, ENABLE);
/* 配置中断 */
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/* Enable USARTz Receive and Transmit interrupts */
USART_ConfigInt(USART1, USART_INT_RXDNE, ENABLE); // 配置USART1接收数据非空中断使能
USART_ConfigInt(USART1, USART_INT_IDLEF, ENABLE); // 配置USART1空闲中断使能
}
2.串口AT指令编写,根据 EG800K手册进行书写,例如下面的初始化代码
/*****************************************************
该函数用来检测32与4G模块是否串口连接成功
*****************************************************/
void CSTX_4G_Init(void)
{
//发送一条命令ATE1
Uart2_SendStr("AT\r\n");
delay_ms(100);
strx=strstr((const char*)buf_uart2.buf,(const char*)"OK");//检测OK,buf_uart2.buf:UART2的接收缓冲区,存放4G模块返回的数据,在buf中寻找“ok”/
Clear_Buffer();
errcount = 0;
while(strx==NULL)
{
Uart2_SendStr("初始化4G模块失败,正在重新初始化4G模块......\r\n");
Clear_Buffer();
Uart2_SendStr("AT\r\n");
delay_ms(300);
strx=strstr((const char*)buf_uart2.buf,(const char*)"OK");//检测OK
errcount++;
if(errcount>20) //超时退出死循环 表示服务器连接失败
{
Uart2_SendStr("初始化4G模块连续失败,请检查连接......\r\n");
errcount = 0;
break;
}
}
Clear_Buffer();
}
3.主函数编写,主要调用用到的函数
int main(void)
{
UART1_Init();
UART2_Init();
Uart1_SendStr("UART1 Init Successful\r\n");
CSTX_4G_Init(); //初始化4G设备
CSTX_4G_ConTCP(); //关闭之前的连接
CSTX_4G_CreateTCPSokcet(); //创建新的TCP套接字
CONTRACT_4G(); //发送接收函数协议
}
4.需要完整代码的私聊加v flingwithcling ,欢迎大家学习交流! 不懂留言,看到回复。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)