Pārlūkot izejas kodu

add ml307a bak-0223

zack 1 gadu atpakaļ
vecāks
revīzija
cf5afe1336

+ 20 - 1
Core/Inc/ConfigMacros.h

@@ -27,15 +27,29 @@
 #define PRINT_NUUID(message) 			printf("%s不符合\n",message)
 #define RXNE_UART(huart) 				__HAL_UART_ENABLE_IT(huart, UART_IT_RXNE)	
 
+/**
+  * @breaf BT模组测试重启 */
 #define RESET_BT_MODULE_demo() \
     if(resetBTmodule) { \
+		resetBTmodule = false; \
         MBA32A_Init_demo(); \
     }
 	
+/**
+  * @breaf BT模组重启 */
 #define RESET_BT_MODULE() \
     if(resetBTmodule) { \
+		resetBTmodule = false; \
         MBA32A_Init(); \
     }	
+	
+/**
+  * @breaf 4G模组重启 */
+#define RESET_4G_MODULE() \
+    if(reset4Gmodule) { \
+		reset4Gmodule = false; \
+        ML307A_Init(); \
+    }	
 
 /**
   * @breaf 简化函数多体
@@ -86,9 +100,14 @@ do { \
 	btframe.serialNum = 0x00000001; \
 	btframe.userId 	  = 0x64747531; \
 	btframe.Autoseal  = 0x01; \
-	printf("\t\tBTinit%d...\r\n", resetcount); \
+	printf("\t###01\tBT_init%d...\r\n", resetcount_bt); \
 } while (0)
 
+/* 4G参数初始化*/	
+#define INIT_4G_FRAME() \
+do { \
+	printf("\t###02\t4G_init%d...\r\n",resetcount_4g); \
+} while (0)
 
 /**
   * @breaf 结构体定义

+ 1 - 0
Core/Inc/main.h

@@ -36,6 +36,7 @@ extern "C" {
 #include "stdbool.h"
 
 #include "mba32a.h"
+#include "ml307a.h"
 #include "ConfigMacros.h"
 
 

+ 3 - 3
Core/Inc/mba32a.h

@@ -3,8 +3,8 @@
 #include "main.h"
 
 
-extern uint8_t g_MBA32A_8buf[1024];
-extern uint8_t g_MBA32A_8buf_Down[1024];
+extern uint8_t g_MBA32A_8buf[2048];
+extern uint8_t g_MBA32A_8buf_Down[2048];
 extern uint8_t dev1[12];
 extern bool BT_CONN;
 extern bool resetBTmodule;
@@ -18,11 +18,11 @@ void lock_searchInfo(void);
 void Scan_lock_status(void);
 void Seal_Unseal_Jumptips(void);
 
+void USART_SendString(UART_HandleTypeDef *huart, char *str);
 void Bt_MacScan(char *pCmd);
 void open_close_lock(void);
 
 
-void Bt_Connection(void);
 void tips(void);
 #endif /*__MBA32A_H*/
 

+ 26 - 0
Core/Inc/ml307a.h

@@ -0,0 +1,26 @@
+#ifndef __ML307A_H
+#define __ML307A_H
+#include "main.h"
+
+
+
+
+extern bool u4RecvFlag;
+extern bool reset4Gmodule;
+extern bool reset4Gmodule;
+extern bool module4G_init;
+extern uint8_t u4length;
+
+
+extern uint8_t g_ML307A_8buf[2048]; 
+extern uint8_t g_ML307A_8buf_Down[2048];
+
+
+
+void ML307A_Init(void);
+void Transfer4GBuff(void);
+
+
+
+#endif /*__ML307A_H*/
+

+ 0 - 27
Core/Inc/net4g.h

@@ -1,27 +0,0 @@
-#ifndef __NET4G_H
-#define __NET4G_H
-#include "main.h"
-
-
-extern uint32_t g_ML307ACnt;            // ½ÓÊÕ¼ÆÊý
-
-extern uint8_t g_ML307A_8buf[200] ;
-extern uint8_t g_ML307A_8buf_Down[200];
-
-void USART_SendString(UART_HandleTypeDef *huart, char *str);
-uint8_t ML307A_Init(void);
-void ML307A_GpioConfig(void);
-uint8_t ML307A_NetConfig(void);
-void ML307A_Connect(void);
-void ML307A_Send(char *pString);
-uint32_t ML307A_Receive(char *pRecvDataBuf);
-
-uint8_t sendCmd(char *pCmd, char *pRes, uint32_t timeOut, uint8_t sendNum);
-
-
-void clearBuffer(void);
-void reset_4G(void);
-
-void USART_SendHexArray(UART_HandleTypeDef *huart, uint8_t *data, int length);
-#endif /*__NET4G_H*/
-

+ 2 - 0
Core/Inc/usart.h

@@ -45,6 +45,8 @@ extern UART_HandleTypeDef huart3;
 
 /* USER CODE BEGIN Private defines */
 
+extern volatile uint8_t recvLength;  //½ÓÊÕÒ»Ö¡Êý¾ÝµÄ³¤¶È
+extern uint8_t recvBuff[2048];
 /* USER CODE END Private defines */
 
 void MX_UART4_Init(void);

+ 8 - 2
Core/Src/freertos.c

@@ -158,7 +158,9 @@ void StartScanKeyTask(void const * argument)
 #if Test_old ==1
 	RESET_BT_MODULE_demo();
 #else
-	RESET_BT_MODULE();
+	Transfer4GBuff();	//u4RecvFlag监测位
+	RESET_BT_MODULE();	//蓝牙重启标志位
+	RESET_4G_MODULE();	//4G重启标志位
 #endif
   }
   /* USER CODE END StartScanKeyTask */
@@ -212,7 +214,6 @@ void StartTestTask(void const * argument)
   for(;;)
   {
     osDelay(1);
-	  
   }
   /* USER CODE END StartTestTask */
 }
@@ -242,6 +243,11 @@ void StartloginfoTaskTask(void const * argument)
 	{
 		lock_searchInfo();
 	}
+	
+	ML307A_Init();		//4G初始化test Log 有启动时间,放置1000ms
+	
+	
+
 #endif
   }
   /* USER CODE END StartloginfoTaskTask */

+ 13 - 14
Core/Src/interface.c

@@ -175,34 +175,33 @@ void chooseBt(void)
 {
 	if(menu.current==3)
 	{
-		#if Test_old == 1
+//		#if Test_old == 1
 		uint8_t str[] = "MAC:1010...0003";
 		if(menu.enter==4)
 		{
 			OLED_ShowString(0,0,str,16,0);
-			L1bd=true;
 		}
 		else
 		{
 			OLED_ShowString(0,0,str,16,1);
 		}
-		#else
-		OLED_ShowString(0,0,M1,16,1);
-		OLED_ShowString(0,15,M2,16,1);
-		OLED_ShowString(0,30,M3,16,1);
-		OLED_ShowString(0,45,M4,16,1);
+//		#else
+//		OLED_ShowString(0,0,M1,16,1);
+//		OLED_ShowString(0,15,M2,16,1);
+//		OLED_ShowString(0,30,M3,16,1);
+//		OLED_ShowString(0,45,M4,16,1);
 
-		if(menu.enter==4)
-		{
-			OLED_ShowString(32,0,"conn",16,1);
-			Bt_Connection();
-		}
+//		if(menu.enter==4)
+//		{
+//			OLED_ShowString(32,0,"conn",16,1);
+//			Bt_Connection();
+//		}
 		//OLED_ShowString(32,0,dev1,16,1);
 //		OLED_ShowString(32,15,dev2,16,1);
 //		OLED_ShowString(32,30,dev3,16,1);
 //		OLED_ShowString(32,45,dev4,16,1);
-		#endif
-		
+//		#endif
+//		
 	}
 	else if(menu.current==4)
 	{

+ 9 - 7
Core/Src/main.c

@@ -52,7 +52,6 @@ extern bool refresh;
 /* Private variables ---------------------------------------------------------*/
 
 /* USER CODE BEGIN PV */
-uint8_t recvBuff[2048];
 /* USER CODE END PV */
 
 /* Private function prototypes -----------------------------------------------*/
@@ -108,15 +107,18 @@ int main(void)
   MX_CAN_Init();
   MX_RTC_Init();
   /* USER CODE BEGIN 2 */
-  TIM_Start(&htim2);	//wdi
-  TIM_Start(&htim3);	//led
-  OLED_DISPLAY(0,0);	//color>1 反色;display>1 翻转
-  RXNE_UART(&huart5);	//开启蓝牙串口中断
-  HELLO("\r\t\tDtuStart...");
+  TIM_Start(&htim2);		//wdi
+  TIM_Start(&htim3);		//led
+  OLED_DISPLAY(0,0);		//color>1 反色;display>1 翻转
+  IDLE_DMA_UART(&huart4);	//开启4G_DMA中断
+  RXNE_UART(&huart5);		//开启BT中断
+  HELLO("\r\t###00\tDtuStart...");
 #if Test_old ==1
 	MBA32A_Init_demo();
 #else
-	MBA32A_Init();
+	MBA32A_Init();		//蓝牙初始化
+	module4G_init=true;
+//	ML307A_Init();		//4G初始化
 #endif
   /* USER CODE END 2 */
 

+ 69 - 65
Core/Src/mba32a.c

@@ -21,11 +21,11 @@ bool resetBTmodule = false;
 
 uint8_t step_BT=0;
 uint8_t dev1[12]={0};
-uint8_t resetcount=0;
+uint8_t resetcount_bt=0;
 uint16_t u5length=0;
 uint16_t resetFlag16=0;
-uint8_t g_MBA32A_8buf[1024]={0};  			//蓝牙接收数组
-uint8_t g_MBA32A_8buf_Down[1024]={0} ;		//蓝牙搬移数组
+uint8_t g_MBA32A_8buf[2048]={0};  			//蓝牙接收数组
+uint8_t g_MBA32A_8buf_Down[2048]={0} ;		//蓝牙搬移数组
 uint16_t 	bt_dataLength=0;				//bt接收有效数据长度
 uint8_t 	bt_error_num=0;					//bt接收的错误事件
 uint32_t 	bt_serial_num=0;				//bt接收的流水号
@@ -42,7 +42,9 @@ uint16_t 	bt_sfver=0;						//bt
 uint8_t sendCmd_BT(char *pCmd, char *pRes, uint32_t timeOut, uint8_t sendNum);
 void MBA32AReset(void);
 void Start_Read_resetFlag16(void);
-void Bt_Connection(void);
+uint8_t BT_Connection(void);
+void CancelConnection(void);
+
 /**
   * @breaf 非本页方法
   */
@@ -122,21 +124,13 @@ void Start_Read_resetFlag16(void)
 		if(sendCmd_BT("AT+RESET=1\r\n","OK",1,1))
 		{
 			Write_Information(resetDevAddr);//写入0xAAAA
-			printf("#复位设备成功\r\n");
+			printf("###复位设备成功\r\n");
 			btstep = UUIDS;
 		}
-		if(!sendCmd_BT("AT+DISCONN=0\r\n","OK",1,1))
-		{
-			printf("#无设备连接\r\n");
-		}
-		else
-		{
-			printf("#已断开连接设备\r\n");
-		}
 	}
 	else if(resetFlag16==0xAAAA)//开机检测(大于1次启动)
 	{
-		printf("#非首次启动\r\n");
+		printf("###蓝牙模块非首次启动\r\n");
 		if (!sendCmd_BT("AT+UUIDS?\r\n","+UUIDS:0002",1,1))
 		{
 			PRINT_NUUID("UUIDS");//UUID项不符合
@@ -168,8 +162,8 @@ void MBA32A_Init_demo(void)
 	menu.home=0;
 	btframe.serialNum = 0x00000001;//流水号
 	btframe.userId 	  = 0x64747531;//dtu1
-	btframe.Autoseal  = 0x01;
-	printf("\r\t\tBTinit%d...",resetcount);
+	btframe.Autoseal  = 0x01;	
+	printf("\r\t\tBTinit%d...",resetcount_bt);
 	
 	resetFlag16 = read_flash_16(resetDevAddr);
 	if(resetFlag16==0xFFFF)//开机检测(首次启动)
@@ -332,12 +326,12 @@ void MBA32A_Init_demo(void)
   */		
 void MBA32AReset(void)
 {
+	resetcount_bt+=1;
 	printf("Bt reset\r\n");   
 	HAL_GPIO_WritePin(REST_BT_GPIO_Port,REST_BT_Pin,GPIO_PIN_RESET);
 	HAL_Delay(4000);
 	btstep = UUIDS;
 	resetBTmodule=true;//freertos监测模块重启位
-	resetcount+=1;
 }
 
 /**
@@ -390,7 +384,7 @@ void Echo_BT(uint8_t echosize)
 /**
   * @breaf 查询蓝牙锁信息帧
   */
-void lock_searchInfo(void)		//蓝牙查询信息帧
+void lock_searchInfo(void)				//蓝牙查询信息帧
 {
 	uint8_t header[2] 		= {0x66, 0x00};//Jl_lock帧头
 	uint8_t serchInfo_CMD[] = {0x01, 0x00};//查询信息命令帧
@@ -402,7 +396,7 @@ void lock_searchInfo(void)		//
 /**
   * @breaf 蓝牙开锁信息帧
   */
-void open_lock(BtFrame btframe)					//蓝牙开锁信息帧
+void open_lock(BtFrame btframe)			//蓝牙开锁信息帧
 {
 	uint8_t header[2] 	= {0x66, 0x00};//Jl_lock帧头
 	uint8_t open_CMD[] = {0x02, 0x0C, 	0x00,0x00,0x00,0x00,		0x00,0x00,0x00,0x00,	\
@@ -436,7 +430,7 @@ void open_lock(BtFrame btframe)					//
 /**
   * @breaf 蓝牙关锁信息帧
   */
-void close_lock(BtFrame btframe)					//蓝牙关锁信息帧
+void close_lock(BtFrame btframe)		//蓝牙关锁信息帧
 {
 	uint8_t header[2] 	= {0x66, 0x00};//Jl_lock帧头
 	uint8_t close_CMD[] = {0x03, 0x0B};//关锁命令帧
@@ -445,37 +439,6 @@ void close_lock(BtFrame btframe)					//
 	refresh=true;
 }
 
-/**
-  * @breaf 写死的蓝牙连接函数
-  */
-void Bt_Connection(void)
-{
-	if(sendCmd_BT("AT+CONN=101000000003\r\n","+CONNECTED:0,101000000003",3,3))
-	{           
-		if(sendCmd_BT("AT+AUTO_CFG=1\r\n","OK",1,1))
-		{
-			printf("自动重连打开\r\n");
-		}
-		printf("连接成功!");
-		menu.current=2;
-		refresh=true;
-		
-		/** 后期修改 **/
-		BT_CONN=true;
-		L1bd=true;
-	}
-	else if(sendCmd_BT("AT+CONN=101000000003\r\n","+CONNECT TIMEOUT",3,5))
-	{
-		printf("连接超时!");
-		MBA32AReset();		//后台复位
-	}
-	else 
-	{
-		printf("连接失败! %s",g_MBA32A_8buf_Down);
-		MBA32AReset();
-	}	
-}
-
 /**
   * @breaf 蓝牙扫描MAC切分函数
   */
@@ -564,18 +527,8 @@ void workinfo_W(void)
 //			bt_sfver |= g_MBA32A_8buf_Down[15]<<8; 			//软件版本号
 //			bt_sfver |= g_MBA32A_8buf_Down[16]; 
 			
-		}
-		else if((g_MBA32A_8buf_Down[2]==0x03) && (g_MBA32A_8buf_Down[3]==0x01))//施封(关锁完成)
-		{
-
-		}
-
-		else if((g_MBA32A_8buf_Down[2]==0x02) && (g_MBA32A_8buf_Down[3]==0x01))//解封(关锁完成)
-		{
-
 		}
 	}
-
 }
 /**
   * @breaf 00-施解封操作(Freertos 工作函数)
@@ -585,17 +538,24 @@ void open_close_lock(void)
 	if(menu.up == 1 && menu.current == 0x0C && tipsflag!=Abnormal_motor  && tipsflag == Default){
 
 		btframe.serialNum+=1;
-		// 施封操作
+		//施封操作
 		tipsflag = InProgress;//进行中
-		close_lock(btframe);
-
+		//关锁操作
+		if(BT_Connection())		//进行连接
+		{
+			close_lock(btframe);
+		}
+		CancelConnection();		//断开连接
 	}
 	else if(menu.up == 0 && menu.current == 0x0C &&  tipsflag!=Abnormal_motor && tipsflag == Default)
 	{
 		btframe.serialNum+=1;
-		// 解封操作
+		//解封操作
 		tipsflag = InProgress;//进行中
+		//开锁操作
+		BT_Connection();		//进行连接
 		open_lock(btframe);
+		CancelConnection();		//断开连接
 
 	}  
 }
@@ -700,3 +660,47 @@ void Scan_lock_status(void)
 	}
 
 }
+
+/**
+  * @breaf 蓝牙连接函数
+  */
+uint8_t BT_Connection(void)
+{
+	if(sendCmd_BT("AT+CONN=101000000003\r\n","+CONNECTED:0,101000000003",3,3))
+	{           
+		refresh=true;
+		/** 后期修改 **/
+		BT_CONN=true;
+		L1bd=true;
+		return 1;
+	}
+	else if(sendCmd_BT("AT+CONN=101000000003\r\n","+CONNECT TIMEOUT",3,5))
+	{
+		printf("连接超时!");
+		MBA32AReset();		//后台复位
+	}
+	else 
+	{
+		printf("连接失败! %s",g_MBA32A_8buf_Down);
+		MBA32AReset();
+	}	
+	
+	return 0;
+}
+
+/**
+  * @breaf 蓝牙断开函数
+  */
+void CancelConnection(void)
+{
+	if((g_MBA32A_8buf_Down[2]==0x02) && (g_MBA32A_8buf_Down[3]==0x01))//解封(关锁完成)
+	{
+		HAL_Delay(50);
+		sendCmd_BT("AT+DISCONN=0\r\n","NULL",1,1);//断开连接
+	}
+	else if((g_MBA32A_8buf_Down[2]==0x03) && (g_MBA32A_8buf_Down[3]==0x01))//施封(关锁完成)
+	{
+		HAL_Delay(50);
+		sendCmd_BT("AT+DISCONN=0\r\n","NULL",1,1);//断开连接
+	}
+}

+ 120 - 0
Core/Src/ml307a.c

@@ -0,0 +1,120 @@
+#include "ml307a.h"
+
+/**
+  * @breaf 本页定义
+  */
+bool u4RecvFlag = false;
+bool reset4Gmodule = false;
+bool ml307aFail = false;
+bool module4G_init = false;
+uint8_t u4length = 0;
+uint8_t resetcount_4g=0;
+uint8_t g_ML307A_8buf[2048]={0}; 
+uint8_t g_ML307A_8buf_Down[2048]={0}; 
+
+/**
+  * @breaf 本页方法
+  */
+void ML307AReset(void);	//4G模块重启
+uint8_t sendCmd_4G(char *pCmd, char *pRes, uint32_t timeOut, uint8_t sendNum);
+
+/**
+  * @breaf 外部声明
+  */
+extern UART_HandleTypeDef huart4;
+
+
+
+void ML307A_Init(void)
+{
+	
+	//4Gled 隔1s快闪搜网未注册,隔2s为成功注册上网络
+	//<***> 单括号内为正常回复
+	if(!module4G_init)  //复位需同时变true
+		return;
+	INIT_4G_FRAME();
+	if(!sendCmd_4G("AT\r\n","OK",1,1))
+	{
+		ml307aFail=true;
+		printf("4G模组异常!\r\n");
+	}
+	if(sendCmd_4G("AT+CPIN?\r\n","+CME ERROR: 10",1,1))				//00检测是否有SIM卡									<+CPIN: READY\r\nOK>
+	{
+		printf("未检测到SIM卡\r\n");
+	}		
+	else if(ml307aFail)
+	{
+		printf("#4G模块初始化Fail");
+	}
+	else if(!ml307aFail)
+	{
+		if(sendCmd_4G("AT+CSQ\r\n","ERROR",1,1))					//01查询信号值(信号强度,误码率)						<+CSQ: 26,99\r\nOK>
+		{printf("查询信号Fail\r\n");}
+		if(sendCmd_4G("AT+CEREG?\r\n","ERROR",1,1))		    		//02查询附着成功(驻网:*,@ @为1或5表示附着成功)	<+CEREG: 0,1\r\nOK>
+		{printf("查询驻网Fail\r\n");}
+		if(sendCmd_4G("AT+MIPCALL?\r\n","ERROR",1,1))				//03查询PDP激活状态									<+MIPCALL: 1,1,"10.94.99.162"\r\nOK>
+		{printf("查询PDP激活状态Fail\r\n");}
+
+	}
+	//初始化后Todo
+	module4G_init=false;
+	
+}
+
+
+
+
+/**
+  * @breaf 串口发送命令,有接收数组比较函数
+  */
+uint8_t sendCmd_4G(char *pCmd, char *pRes, uint32_t timeOut, uint8_t sendNum)
+{
+    uint8_t i = 0;
+    uint32_t time;          
+    for(i = 0; i < sendNum; i++)
+	{
+        time = timeOut * 10;
+        USART_SendString(&huart4, pCmd);
+		HAL_Delay(50);
+		printf("------->%s",g_ML307A_8buf_Down);
+		
+        while(time--)
+		{
+			if(strstr((const char *)g_ML307A_8buf_Down, pRes) != NULL)             // 如果检索到关键词
+			{
+				memset(g_ML307A_8buf_Down,0,u4length);
+				return 1;
+			}
+			HAL_Delay(100);
+        }
+    }
+    return 0;
+}
+
+/**
+ @brief 重启模块
+ @param 无
+ @return 无
+*/
+void ML307AReset(void)
+{
+	reset4Gmodule=true;
+	resetcount_4g+=1;
+	printf("4G Module_Reset\n");    
+	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
+	HAL_Delay(5000);
+	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);
+}
+
+void Transfer4GBuff(void)
+{
+	if(u4RecvFlag)
+	{
+		u4RecvFlag=false;
+		memset(g_ML307A_8buf_Down,0,2048);
+		memcpy(g_ML307A_8buf_Down,g_ML307A_8buf,u4length);
+	}
+}
+
+
+

+ 0 - 324
Core/Src/net4g.c

@@ -1,324 +0,0 @@
-#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);
-}
-
-

+ 16 - 2
Core/Src/stm32f1xx_it.c

@@ -22,7 +22,7 @@
 #include "stm32f1xx_it.h"
 /* Private includes ----------------------------------------------------------*/
 /* USER CODE BEGIN Includes */
-
+#include "usart.h"
 /* USER CODE END Includes */
 
 /* Private typedef -----------------------------------------------------------*/
@@ -425,8 +425,22 @@ void USART3_IRQHandler(void)
 void UART4_IRQHandler(void)
 {
   /* USER CODE BEGIN UART4_IRQn 0 */
+	uint32_t tmpFlag = 0;
+	uint32_t temp;
+	tmpFlag =__HAL_UART_GET_FLAG(&huart4,UART_FLAG_IDLE); //获取IDLE标志位
+	if((tmpFlag != RESET))//idle标志被置位
+	{ 
+		__HAL_UART_CLEAR_IDLEFLAG(&huart4);					//清除标志位
+		HAL_UART_DMAStop(&huart4); 
+		temp  =  __HAL_DMA_GET_COUNTER(&hdma_uart4_rx);		// 获取DMA中未传输的数据个数   
+		recvLength  =  2048 - temp - 2; 	//-2>去掉\r\n		//总计数减去未传输的数据个数,得到已经接收的数据个数
+		u4length = recvLength;
+		memcpy(g_ML307A_8buf, &recvBuff[2], recvLength);	
+		u4RecvFlag = true;
+		
+		HAL_UART_Receive_DMA(&huart4, recvBuff, 2048);		//重新打开DMA接收,不然只能接收一次数据
+	 }
 
-		 		
   /* USER CODE END UART4_IRQn 0 */
   HAL_UART_IRQHandler(&huart4);
   /* USER CODE BEGIN UART4_IRQn 1 */

+ 2 - 0
Core/Src/usart.c

@@ -22,6 +22,8 @@
 
 /* USER CODE BEGIN 0 */
 
+volatile uint8_t recvLength = 0;  //½ÓÊÕÒ»Ö¡Êý¾ÝµÄ³¤¶È
+uint8_t recvBuff[2048];
 /* USER CODE END 0 */
 
 UART_HandleTypeDef huart4;

+ 41 - 29
MDK-ARM/dtu.uvoptx

@@ -431,6 +431,18 @@
       <RteFlg>0</RteFlg>
       <bShared>0</bShared>
     </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>18</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\Core\Src\ml307a.c</PathWithFileName>
+      <FilenameWithoutPath>ml307a.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
   </Group>
 
   <Group>
@@ -441,7 +453,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>18</FileNumber>
+      <FileNumber>19</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -453,7 +465,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>19</FileNumber>
+      <FileNumber>20</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -465,7 +477,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>20</FileNumber>
+      <FileNumber>21</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -477,7 +489,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>21</FileNumber>
+      <FileNumber>22</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -489,7 +501,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>22</FileNumber>
+      <FileNumber>23</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -501,7 +513,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>23</FileNumber>
+      <FileNumber>24</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -513,7 +525,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>24</FileNumber>
+      <FileNumber>25</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -525,7 +537,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>25</FileNumber>
+      <FileNumber>26</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -537,7 +549,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>26</FileNumber>
+      <FileNumber>27</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -549,7 +561,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>27</FileNumber>
+      <FileNumber>28</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -561,7 +573,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>28</FileNumber>
+      <FileNumber>29</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -573,7 +585,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>29</FileNumber>
+      <FileNumber>30</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -585,7 +597,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>30</FileNumber>
+      <FileNumber>31</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -597,7 +609,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>31</FileNumber>
+      <FileNumber>32</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -609,7 +621,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>32</FileNumber>
+      <FileNumber>33</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -621,7 +633,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>33</FileNumber>
+      <FileNumber>34</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -633,7 +645,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>34</FileNumber>
+      <FileNumber>35</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -645,7 +657,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>35</FileNumber>
+      <FileNumber>36</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -665,7 +677,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>36</FileNumber>
+      <FileNumber>37</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -685,7 +697,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>37</FileNumber>
+      <FileNumber>38</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -697,7 +709,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>38</FileNumber>
+      <FileNumber>39</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -709,7 +721,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>39</FileNumber>
+      <FileNumber>40</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -721,7 +733,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>40</FileNumber>
+      <FileNumber>41</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -733,7 +745,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>41</FileNumber>
+      <FileNumber>42</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -745,7 +757,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>42</FileNumber>
+      <FileNumber>43</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -757,7 +769,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>43</FileNumber>
+      <FileNumber>44</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -769,7 +781,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>44</FileNumber>
+      <FileNumber>45</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -781,7 +793,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>45</FileNumber>
+      <FileNumber>46</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -793,7 +805,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>46</FileNumber>
+      <FileNumber>47</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>

+ 5 - 0
MDK-ARM/dtu.uvprojx

@@ -627,6 +627,11 @@
               <FileType>1</FileType>
               <FilePath>../Core/Src/stm32f1xx_hal_timebase_tim.c</FilePath>
             </File>
+            <File>
+              <FileName>ml307a.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\Core\Src\ml307a.c</FilePath>
+            </File>
           </Files>
         </Group>
         <Group>

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 3209 - 3119
Output/dtu.hex


+ 1 - 0
Output/dtu.lnp

@@ -16,6 +16,7 @@
 "..\output\stm32f1xx_it.o"
 "..\output\stm32f1xx_hal_msp.o"
 "..\output\stm32f1xx_hal_timebase_tim.o"
+"..\output\ml307a.o"
 "..\output\stm32f1xx_hal_gpio_ex.o"
 "..\output\stm32f1xx_hal_can.o"
 "..\output\stm32f1xx_hal.o"