stm32 利用SIM800C模块定位再通过该模块http协议发送给服务器

http 入门参考:https://cloud.tencent.com/developer/article/1425279

1、http基本命令

AT+SAPBR=3,1,"APN","UNINET"   //CMNET移动 CNNET电信 UNINET联通
AT+SAPBR=1,1  //激活网络 一定要等到ok返回,否则出错
AT+HTTPINIT   //初始化http网络
AT+HTTPPARA="CID",1  //设置回话参数
//设置域名给让模块解析
AT+HTTPPARA="URL","www.xiongyuchun.xyz:9999/Api/addDreamValueAPI.aspx?id=1&lng=115.40&lat=27.08"
AT+HTTPACTION=0 //开始发送请求并等待服务器响应 最后程序最后确认响应内容是否正确

2、定位基本命令

参考文章:http://www.openedv.com/forum.php?mod=viewthread&tid=232045&page=1

AT+CLBS=1,1
+CLBS: 0,113.333941,23.308106,550

+CLBS: 0,113.333941,23.308106,550 //这就得到了想要的定位数据,这里直接输出的是经纬度。其中113.333941是经度,23.308106是纬度,

 

3、程序控制

//SIM800C主测试程序
void sim800c_test(void)
{
	u8 key=0; 
	u8 timex=0;
	u8 sim_ready=0;
//	u8 start_flag = 0;
	
	POINT_COLOR=RED;
	Show_Str_Mid(0,30,"ATK-SIM800C 测试程序",16,240); //LCD显示
	while(sim800c_send_cmd("AT","OK",100))//检测是否应答AT指令 
	{
		Show_Str(40,55,200,16,"未检测到模块!!!",16,0);
		delay_ms(800);
		LCD_Fill(40,55,200,55+16,WHITE);
		Show_Str(40,55,200,16,"尝试连接模块...",16,0);
		delay_ms(400);  
	} 	 
	LCD_Fill(40,55,200,55+16,WHITE);
	key+=sim800c_send_cmd("ATE0","OK",200);//不回显
	sim800c_mtest_ui(40,20);
	ntp_update();//网络更新
	while(1)
	{
		delay_ms(10); 
		sim_at_response(1);//检查GSM模块发送过来的数据,及时上传给电脑
		if(sim_ready)//SIM卡就绪.
		{
			key=KEY_Scan(0); 
			if(key==KEY0_PRES)
			{
//				 start_flag =!start_flag;
//				 if(start_flag)
//				 {
							
						GPS_Location(); //定位测试
				 
//				 }

				sim800c_mtest_ui(40,30);
				timex=0;
			} 			
		}
		if(timex==0)		//2.5秒左右更新一次
		{
			if(sim800c_gsminfo_show(40,225)==0)sim_ready=1;
			else sim_ready=0;
		}	
		if((timex%20)==0)LED0=!LED0;//200ms闪烁 
		timex++;	 
	} 	
}

void GPS_Location()
{
		char *buf;
		char *p,*p1,*p2; 
		char longitude[10],latitude[10];
	
		buf=mymalloc(SRAMIN,80);//申请80个字节的内存
		p=mymalloc(SRAMIN,50);//申请50个字节的内存
		if(buf==NULL||p==NULL)
		{
				printf("buf=mymalloc 失败!!!!!!!!!!\r\n");
		
		}
	
		 //查询经纬度信息	
		while(sim800c_send_cmd("AT+CLBS=1,1","+CLBS",200))
		{
		   printf("查询经纬度失败\r\n");
		}
//+CLBS		
		
    		p1=(u8*)strstr((const char*)USART3_RX_BUF,","); //第一个逗号开始
	      	p2=(u8*)strstr((const char*)(p1+1),","); //第二个逗号开始
			p2[0]=0;
		    sprintf((char*)longitude,"%s",p1+1); //经度		
			p1=(u8*)strstr((const char*)(p2+1),","); //第三个逗号开始
			p1[0]=0;
		    sprintf((char*)latitude,"%s",p2+1); //纬度
			USART3_RX_STA=0;		
		
		
	  sprintf((char*)buf,"AT+HTTPPARA=\"URL\",\"www.xiongyuchun.xyz:9999/Api/addDreamValueAPI.aspx?id=1&lng=%s&lat=%s\"",longitude,latitude); //经纬度作为http请求参数
		sim800c_send_cmd(buf,"OK",200);		
		sim800c_send_cmd("AT+HTTPACTION=0","OK",200);
		
		printf("%s\r\n",buf); //显示域名
		
		myfree(SRAMIN,buf);
		myfree(SRAMIN,p);
		
		delay_ms(1000);
		delay_ms(1000);
		delay_ms(1000); 
		delay_ms(1000); //延时4s
		
}


//gprs网络初始化
void ntp_update(void)
{  
	 u8 ;
	
	 while(sim800c_send_cmd("AT+SAPBR=3,1,\"Contype\",\"GPRS\"","OK",200))//配置承载场景1
	 {
			printf("配置承载场景1失败\r\n");	
	 
	 }
	while(sim800c_send_cmd("AT+SAPBR=3,1,\"APN\",\"CMNET\"","OK",200))//设置为中国联通网络
	 {
			printf("设置为中国联通网络失败\r\n");	
	 
	 }
	 while(sim800c_send_cmd("AT+SAPBR=1,1",0,200))//激活一个GPRS上下文
	 {
			printf("激活一个GPRS上下文失败\r\n");	
	 
	 }
	 
	  sim800c_send_cmd("AT+HTTPINIT","OK",200);              //http初始化
		sim800c_send_cmd("AT+HTTPPARA=\"CID\",1","OK",200);	  //设置http回话参数
	 

}




4、工程下载

 

https://download.csdn.net/download/shenlong1356/12453371

 

 

  • 2
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是基于STM32单片机和SIM800C模块发送短信的代码,供参考: 首先,需要定义一些常量和变量: ```c #define SIM800C_USART USART3 #define SIM800C_USART_RCC RCC_APB1Periph_USART3 #define SIM800C_USART_GPIO_RCC RCC_AHB1Periph_GPIOB #define SIM800C_USART_TX_PIN GPIO_Pin_10 #define SIM800C_USART_TX_GPIO GPIOB #define SIM800C_USART_RX_PIN GPIO_Pin_11 #define SIM800C_USART_RX_GPIO GPIOB #define SIM800C_PWRKEY_GPIO_RCC RCC_AHB1Periph_GPIOC #define SIM800C_PWRKEY_GPIO GPIOC #define SIM800C_PWRKEY_PIN GPIO_Pin_13 #define SIM800C_PWRKEY_ON GPIO_SetBits(SIM800C_PWRKEY_GPIO, SIM800C_PWRKEY_PIN) #define SIM800C_PWRKEY_OFF GPIO_ResetBits(SIM800C_PWRKEY_GPIO, SIM800C_PWRKEY_PIN) char message[100]; // 存储短信内容 ``` 然后,需要初始化USART3和SIM800C模块: ```c void SIM800C_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; // 使能GPIO时钟 RCC_AHB1PeriphClockCmd(SIM800C_PWRKEY_GPIO_RCC, ENABLE); RCC_AHB1PeriphClockCmd(SIM800C_USART_GPIO_RCC, ENABLE); // 配置GPIO为输出模式 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Pin = SIM800C_PWRKEY_PIN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(SIM800C_PWRKEY_GPIO, &GPIO_InitStructure); // 配置USART3 RCC_APB1PeriphClockCmd(SIM800C_USART_RCC, ENABLE); GPIO_PinAFConfig(SIM800C_USART_TX_GPIO, GPIO_PinSource10, GPIO_AF_USART3); GPIO_PinAFConfig(SIM800C_USART_RX_GPIO, GPIO_PinSource11, GPIO_AF_USART3); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Pin = SIM800C_USART_TX_PIN | SIM800C_USART_RX_PIN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(SIM800C_USART_TX_GPIO, &GPIO_InitStructure); USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(SIM800C_USART, &USART_InitStructure); // 使能USART3 USART_Cmd(SIM800C_USART, ENABLE); // 初始化SIM800C模块 SIM800C_PWRKEY_OFF; delay_ms(1000); SIM800C_PWRKEY_ON; delay_ms(1000); SIM800C_PWRKEY_OFF; delay_ms(3000); } ``` 发送短信的函数如下: ```c void SIM800C_SendSMS(char* number, char* message) { char buffer[50]; // 存储AT指令 // 发送AT指令,检查模块是否处于就绪状态 USART_SendString(SIM800C_USART, "AT\r\n"); if (!USART_WaitForResponse(SIM800C_USART, "OK", 1000)) { return; } // 发送AT+CMGF=1指令,设置短信格式为文本模式 USART_SendString(SIM800C_USART, "AT+CMGF=1\r\n"); if (!USART_WaitForResponse(SIM800C_USART, "OK", 1000)) { return; } // 发送AT+CMGS="number"指令,设置短信接收方号码 sprintf(buffer, "AT+CMGS=\"%s\"\r\n", number); USART_SendString(SIM800C_USART, buffer); if (!USART_WaitForResponse(SIM800C_USART, ">", 1000)) { return; } // 发送短信内容 USART_SendString(SIM800C_USART, message); USART_SendByte(SIM800C_USART, 0x1A); // 等待短信发送完成 USART_WaitForResponse(SIM800C_USART, "+CMGS:", 10000); } ``` 其中,`USART_SendString`和`USART_SendByte`函数用于发送AT指令和短信内容,`USART_WaitForResponse`函数用于等待模块返回的响应。 最后,使用以下代码发送短信: ```c SIM800C_Init(); strcpy(message, "Hello, World!"); SIM800C_SendSMS("13312345678", message); ``` 其中,第一个参数为短信接收方的号码,第二个参数为短信内容。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值