#include "net4g.h" extern UART_HandleTypeDef huart3; extern UART_HandleTypeDef huart4; extern UART_HandleTypeDef huart5; extern UART_HandleTypeDef huart1; uint8_t step_4G = 0; bool resetML307A =false; uint32_t g_ML307ACnt =0; // 接收计数 uint8_t g_ML307A_8buf[200] ={0} ; uint8_t g_ML307A_8buf_Down[200]={0}; uint8_t u4RecvFlag = 0; // 串口4接收标志串口接收完成标志 //char g_ML307A_8buf_Down[100] = {0}; // 接收缓存 uint8_t ML307A_Init(void) { //startDTU=false; // int txLen = sprintf((char *)recvBuff, "ML307A_Init...\r\n"); // HAL_UART_Transmit(&huart1,recvBuff,txLen,(txLen-1)); // uint8_t result = 0; #ifdef debug4GInfo #if debug4GInfo == 1 printf("ML307A_Init...\r\n"); #endif #endif switch(step_4G) { case 0: if(sendCmd("AT\r\n","OK", 10, 5)) // 测试AT指令功能是否正常 { step_4G++; #ifdef debug4GInfo #if debug4GInfo == 1 printf("CMD:AT\t##Reply message matching\r\n"); #endif #endif //start4G=false; } else { #ifdef debug4GInfo #if debug4GInfo == 1 printf("Err:AT\r\n"); #endif #endif reset_4G(); break; } // case 1: // if(sendCmd("AT+CPIN?\r\n","+CPIN: READY\r\n\r\nOK", 20, 2)) // 查询SIM卡是否正常,返回ready则表示SIM卡正常 // { // step_4G++; // int txLen = sprintf((char *)recvBuff, "CPIN OK\r\n"); // HAL_UART_Transmit(&huart1,recvBuff,txLen,(txLen-1)); // } // else // { // printf("Err:AT+CPIN?\r\n"); // 20秒内,无法识别SIM状态,重启模块 // reset_4G(); // break; // } // case 2: // if(sendCmd("AT+CREG?\r\n","+CREG: 0,1", 90, 2)) // 查询模组是否注册上GSM网络 // { // step_4G++; // int txLen = sprintf((char *)recvBuff, "CREG OK\r\n"); // HAL_UART_Transmit(&huart1,recvBuff,txLen,(txLen-1)); // } // else // { // printf("Err:AT+CREG?\r\n"); // 90秒内,没有注册上CS业务,重启模块 // reset_4G(); // break; // } // case 3: // if(sendCmd("AT+CGREG?\r\n","+CGREG: 0,1", 60, 2)) // 查询模组是否注册上GPRS网络 // { // step_4G++; // } // else // { // printf("Err:AT+CGREG?\r\n"); // 60秒内,没有注册上PS业务 // reset(); // break; // } // case 4: // if(sendCmd("AT+QICSGP=1,1,\"CMNET\",\"\",\"\",1\r\n", "OK", 40, 3)) // 查询模组是否注册上GPRS网络 // { // result = ML307A_NetConfig(); // } // else // { // printf("Err:AT+QICSGP=1,1\r\n"); // 如果3次都没停止成功或超过40秒没有回应,则重启模块 // reset(); // break; // } } //return result; return 1; } uint8_t ML307A_NetConfig(void) { //uint8_t result = 0; // if(sendCmd("AT+QIDEACT=1\r\n", "OK", 40, 1)) // 在激活GPRS场景之前先关闭GPRS场景,确保连接正确 // { // if(sendCmd("AT+QIACT=1\r\n", "OK", 150, 1)) // 激活移动场景 // { // ML307A_Connect(); // } // else // 等待150秒后,没有响应重启模块 // { // printf("Err:AT+QIACT=1\r\n"); // 重启模块 // reset(); // } return 1; // } // else // 等待40秒后,没有响应重启模块 // { // printf("Err:AT+QIDEACT=1\r\n"); // 重启模块 // reset(); // return 0; // } } /** @brief 连接TCP服务器 @param 无 @return 无 */ void ML307A_Connect(void) { if(sendCmd("AT+QIOPEN=1,0,\"TCP\",\"180.97.81.180\",53540,0,1\r\n", "+QIOPEN:", 150, 5)) { printf("Connect Success\r\n"); } else { printf("Err:AT+QIOPEN=1,0\r\n"); } } /** @brief 发送数据到TCP服务器 @param pString -[in] 发送数据 @return 无 */ void ML307A_Send(char *pString) { if(sendCmd("AT+QISEND=0\r\n", ">", 60, 1)) { if(sendCmd("AT+QISEND=0,0\r\n", "\r\nOK", 5, 24)) // 2分钟后(每5秒查询一次,共24次) { /* 发送数据成功,对方收到数据 */ } else { printf("Err:AT+QISEND=0\r\n"); if(sendCmd("AT+QICLOSE=0\r\n", "OK", 10, 1)) // TCP连接出现异常,关闭TCP连接 { printf("AT+QICLOSE\r\n"); ML307A_Connect(); } else { reset_4G(); // 等待10秒,没有响应重启模块 } } } else { reset_4G(); // 等待60秒,没有响应重启模块 } } /** @brief 从TCP服务器接收数据 @param pRecvDataBuf -[out] 接收数据 @return 接收数据长度 */ uint32_t ML307A_Receive(char *pRecvDataBuf) { uint32_t recvDataLen = 0; if(u4RecvFlag) // 如果串口接收完成 { if(strstr((const char *)g_ML307A_8buf_Down, "+QIURC: \"recv\",0,") != NULL) // 如果检索到关键词 { memcpy(pRecvDataBuf, g_ML307A_8buf_Down, g_ML307ACnt); recvDataLen = g_ML307ACnt; } clearBuffer(); } return recvDataLen; } void USART_SendString(UART_HandleTypeDef *huart, char *str) { HAL_UART_Transmit(huart, (uint8_t*)str, strlen(str), 0xFFFF); HAL_UART_Transmit(&huart1, (uint8_t*)str, strlen(str), 0xFFFF);//485 HAL_UART_Transmit(&huart3, (uint8_t*)str, strlen(str), 0xFFFF);//ttl } void USART_SendHexArray(UART_HandleTypeDef *huart, uint8_t *data, int length) { HAL_UART_Transmit(huart,data, length, 0xFFFF); HAL_UART_Transmit(&huart1,data, length, 0xFFFF);//485 HAL_UART_Transmit(&huart3, data, length, 0xFFFF);//ttl } /********************************************************************* * LOCAL FUNCTIONS */ /** @brief 发送AT命令 @param pCmd -[in] 命令字符串 @param pRes -[in] 需要检测的返回命令字符串 @param timeOut -[in] 等待时间 @param sendNum -[in] 命令发送次数 @return 1 - 成功;0 - 失败 */ uint8_t sendCmd(char *pCmd, char *pRes, uint32_t timeOut, uint8_t sendNum) { uint8_t i = 0; uint32_t time; clearBuffer(); // 清空缓存 for(i = 0; i < sendNum; i++) { time = timeOut * 10; USART_SendString(&huart4, pCmd); // int txLen = sprintf((char *)recvBuff, "Send AT >>%s",pCmd); // HAL_UART_Transmit(&huart1,recvBuff,txLen,(txLen-1)); #ifdef debug4GInfo #if debug4GInfo == 1 printf("Send AT >>%s",pCmd); #endif #endif while(time--) { if(u4RecvFlag) // 如果串口接收完成 { HAL_Delay(10); // int txLen = sprintf((char *)recvBuff, "R_AT >>%s<<",g_ML307A_8buf_Down); // HAL_UART_Transmit(&huart1,recvBuff,txLen,(txLen-1)); // HAL_UART_Transmit(&huart3,recvBuff,txLen,(txLen-1)); // HAL_UART_Transmit(&huart4, (uint8_t *)g_ML307A_8buf_Down, recvLength, HAL_MAX_DELAY); #ifdef debug4GInfo #if debug4GInfo == 1 printf("RE>>%s",g_ML307A_8buf_Down); #endif #endif if(strstr((const char *)g_ML307A_8buf_Down, pRes) != NULL) // 如果检索到关键词 { //printf("%s", g_ML307A_8buf_Down); return 1; } else{ u4RecvFlag = 0; //printf("null %s", g_ML307A_8buf_Down); } } HAL_Delay(100); // 等待100毫秒 } clearBuffer(); } return 0; } /** @brief 清空缓存 @param 无 @return 无 */ void clearBuffer(void) { recvLength = 0;//清除计数 recvDndFlag = 0;//清除接收结束标志位 memset(g_ML307A_8buf_Down, 0, 500); memset(g_ML307A_8buf_Down, 0, 500); u4RecvFlag = 0; printf("bufclear\r\n"); } /** @brief 重启模块 @param 无 @return 无 */ void reset_4G(void) { printf("reset_4g\n"); step_4G = 0; resetML307A = true; HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET); HAL_Delay(5000); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET); }