123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325 |
- #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);
- }
|