0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

STM32設(shè)計(jì)的兒童老人GPS防丟定位手環(huán)

DS小龍哥-嵌入式技術(shù) ? 來(lái)源:DS小龍哥-嵌入式技術(shù) ? 作者:DS小龍哥-嵌入式技 ? 2022-02-28 13:49 ? 次閱讀

?

一、環(huán)境介紹

MCU:STM32F103C8T6

GSM模塊:GA6--果云

開(kāi)發(fā)軟件:Keil5

二、GA6-GSM模塊介紹與調(diào)試

說(shuō)明: GA6-B模塊供電必須5V,采用電腦USB供電可能不穩(wěn)定(沒(méi)有5V,只有4.8V左右),導(dǎo)致模塊使用不穩(wěn)定,發(fā)送AT指令沒(méi)有反應(yīng),調(diào)試階段,可將開(kāi)發(fā)板的USB線連接充電寶或者手機(jī)充電插頭取電。

2.1 GA6-B模塊概述

GA6-B 模組:
1. GA6 尺寸 22.8mm x 16.8mm x 2.2 mm;
2. 正常工作溫度:-30°C ~ +80°C,
3. 受限工作溫度:-40°C ~ -30°C 及+80°C ~+85°C*
4. 工作電壓 3.5V-4.2V;
5. 開(kāi)機(jī)電壓>3.5V;
6. SLEEP 模式下的耗流為 0.9mA;
7. 四頻:GSM850, EGSM 900 和 DCS 1800,PCS1900 可以自動(dòng)的搜尋 四個(gè)頻段。 l 符合 GSM Phase 2 / 2+ l GPRS Class 10;
8. 靈敏度<-107;
9. 支持語(yǔ)音通話;
10. 支持 SMS 短信;
11. 支持移動(dòng)和聯(lián)通2G,以及全球的GSM網(wǎng)絡(luò)
12. GPRS 數(shù)據(jù)特性,最大數(shù)據(jù)速率,下載 85.6Kbps,上傳 42.8Kbps;
13. 支持符合 GSM 07.10 協(xié)議的串口復(fù)用功能
14. 支持 2 個(gè)串口,一個(gè)下載串口,一個(gè) AT 命令口;
15. AT 命令支持標(biāo)準(zhǔn) AT 和 TCP/IP 命令接口;
16. 支持?jǐn)?shù)字音頻模擬音頻,支持 HR,F(xiàn)R,EFR,AMR 語(yǔ)音編碼;
17. 支持FCC,CE認(rèn)證
18. SMT 42PIN 封裝;

GA6模塊的優(yōu)勢(shì)
廣域覆蓋:GPRS在全國(guó)34個(gè)省均有良好覆蓋,更是全球通行的2G通訊標(biāo)準(zhǔn)。基本上在手機(jī)可以打電話的地方都可以通過(guò)GPRS無(wú)線上網(wǎng);
永遠(yuǎn)在線:只要激活GPRS應(yīng)用后,將一直保持在線,類似于無(wú)線專線網(wǎng)絡(luò)服務(wù)。
按量計(jì)費(fèi):GPRS服務(wù)雖然保持一直在線,但您不必?fù)?dān)心費(fèi)用問(wèn)題;因?yàn)橹挥挟a(chǎn)生通信流量時(shí)才計(jì)費(fèi)。
高速傳輸:目前GPRS可支持85.6Kbps的峰值傳輸速率,理論峰值傳輸可達(dá)100余Kbps。
價(jià)格便宜 :相對(duì)于 SIM 系列的模塊 價(jià)格只有其的一半。大大降低了物聯(lián)網(wǎng)設(shè)備的入門門檻憑借超小的尺寸,超低功耗和寬工作溫度范圍,GA6是M2M應(yīng)用的理想解決方案,適用于車載、工業(yè)及PDA、個(gè)人跟蹤、電力環(huán)境檢測(cè)、無(wú)線POS、智能計(jì)量以及其它M2M的應(yīng)用,為其提供完善的GSM/GPRS短信、數(shù)據(jù)傳輸及語(yǔ)音服務(wù)。

https://img.alicdn.com/imgextra/i3/672934643/TB2nDNjXD3myKJjSZFCXXbXxXXa_!!672934643.jpg

?

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

https://img.alicdn.com/imgextra/i2/672934643/TB2GaXjXt3nyKJjSZFEXXXTTFXa_!!672934643.jpg

?

poYBAGDYdXCAWkKMAAAAK8RNs4s030.pnghttps://img.alicdn.com/imgextra/i2/672934643/TB2FmdiXtMnyKJjSZPhXXaeZVXa_!!672934643.jpg

?

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

?

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

物聯(lián)網(wǎng)卡:

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

2.2 GA6模塊調(diào)試

模塊默認(rèn)波特率: 115200
電壓: 5V
TX---URX(GA6模塊)
RX---UTX(GA6模塊)

?

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png
  1. 模塊上電串口助手收到的消息:

?

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

注意: 電壓必須5V否則,給模塊發(fā)送AT指令沒(méi)有用。

  1. 正常情況下,模塊插上SIM電話卡,供電達(dá)到5V時(shí),模塊上電會(huì)返回以下提示信息

?

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

當(dāng)模塊出現(xiàn) “SMS Ready”字符串提示時(shí),說(shuō)明模塊已經(jīng)可以正常的接收“AT”指令了。

2.3 基礎(chǔ)常用的指令介紹使用

(指令結(jié)尾發(fā)送都需要加\r\n)

1. 檢測(cè)模塊是否正常

給模塊發(fā)送指令: AT

模塊正常返回,這個(gè)指令可以檢測(cè)模塊是否正常:

OK

2. 查詢SIM卡是否在卡槽內(nèi)

給模塊發(fā)送指令: AT+CPIN?

如果卡在卡槽內(nèi),模塊正常返回值:

+CPIN:READY

OK

3. 查詢模塊是否注冊(cè)到網(wǎng)絡(luò)

給模塊發(fā)送指令: AT+CREG?

如果模塊已經(jīng)正常注冊(cè)到網(wǎng)絡(luò)的返回值:

AT+CREG?

+CREG: 1,1

OK

4. 關(guān)閉指令回顯

給模塊發(fā)送指令: ATE0

指令執(zhí)行成功返回值: (關(guān)閉AT指令回顯,方便調(diào)試,提高程序效率)

OK

2.4GPRS網(wǎng)絡(luò)通信相關(guān)指令介紹

1. 查詢網(wǎng)絡(luò)連接狀態(tài)

給模塊發(fā)送指令: AT+CIPSTATUS

指令執(zhí)行成功返回值如下(多種):

"IP INITIAL" 初始化

"IP START" 啟動(dòng)任務(wù)

"IP CONFIG" 配置場(chǎng)景

"IP IND" 激活 GPRS/CSD 場(chǎng)景中

"IP GPRSACT" 接收?qǐng)鼍芭渲?/p>

"IP STATUS" 獲得本地 IP 地址(參考 AT+CIFSR 命令)

"TCP CONNECTING" TCP 連接中

"UDP CONNECTING" UDP 連接中

"IP CLOSE" TCP/UDP 連接關(guān)閉

"CONNECT OK" TCP/UDP 連接成功 ,連接成功之后才可進(jìn)行網(wǎng)絡(luò)數(shù)據(jù)通信

2. 附著GPRS網(wǎng)絡(luò) (進(jìn)行網(wǎng)絡(luò)通信前,需要先附著GPRS網(wǎng)絡(luò)才可進(jìn)行正常通信)

給模塊發(fā)送指令: AT+CGATT=1

模塊正常附著了GPRS網(wǎng)絡(luò),返回值: (注意該指令第一次附著網(wǎng)絡(luò)需要點(diǎn)時(shí)間,需等待一段時(shí)間)

OK

3. 激活GPRS網(wǎng)絡(luò)

給模塊發(fā)送指令: AT+CGACT=1,1

模塊正常激活了GPRS網(wǎng)絡(luò)返回值:

OK

4. 建立TCP連接: 連接TCP服務(wù)器

模塊發(fā)送指令: AT+CIPSTART="TCP","183.230.40.33",80

如果服務(wù)器正常連接成功的返回值:

OK

CONNECT OK

說(shuō)明: 上面的指令是采用TCP協(xié)議連接,183.230.40.33服務(wù)器,端口號(hào)是80。

5. 發(fā)送數(shù)據(jù)

給模塊發(fā)送指令: AT+CIPSEND

如果收到指令后會(huì)返回 > 符號(hào)。,接下來(lái)就可以發(fā)送 實(shí)際要發(fā)送的數(shù)據(jù),在發(fā)送實(shí)際數(shù)據(jù)時(shí),不需要加回車符(\r\n)。

實(shí)際數(shù)據(jù)發(fā)送之后,緊接著發(fā)送一個(gè)0x1A,即可啟動(dòng)數(shù)據(jù)發(fā)送。

注意: 0x1A是十六進(jìn)制格式數(shù)據(jù),不是字符串。

如果數(shù)據(jù)發(fā)送成功,會(huì)返回 “SEND OK” 字符串。

發(fā)送數(shù)據(jù)示例:

POST /devices/517704007/datapoints HTTP/1.1

api-key:vvQAUiBG=HwKzqGicH=RxBvFCDw=

Host:api.heclouds.com

Connection:close

Content-Length:65

{"datastreams":[{"id":"ds18b20","datapoints":[{"value":66.66}]}]}

?

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

三、STM32代碼調(diào)試GA6模塊

3.1 通過(guò)STM32串口代碼測(cè)試GA6模塊

直接接在STM32F103C8T6最小系統(tǒng)板上面:

?

注意: 如果是使用USB給開(kāi)發(fā)板供電,為了防止電壓不夠,USB線不要接分線器,直接接電腦的USB口。

因?yàn)镚A6模塊的電壓必須5V才可驅(qū)動(dòng),4.8V都不行。

?

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

STM32F103C8T6最小系統(tǒng)板使用串口3與GA6-B模塊連接:

5V-----5V

GND---G

PB10—URX

PB11---UTX

?

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

出現(xiàn)以上提示之后,發(fā)送AT能返回OK就說(shuō)明模塊已經(jīng)正常工作了。

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

模塊上電會(huì)返回以下信息: (注意: 電壓一定要保證是5V)

AT Ready

AST_POWERON

+NITZ:19/03/20,01:57:46,32

Call Ready

+CREG: 1

SMS Ready

3.2 通過(guò)STM32封裝標(biāo)準(zhǔn)函數(shù)(使用HTTP協(xié)議連接OneNet服務(wù)器)

GA6_GPRS.c文件代碼:

#include "ga6_gprs.h"

#define GS6_GSM_CHECK_CNT 10

/*
函數(shù)功能:向GA6_GPRS發(fā)送指令
函數(shù)參數(shù):
        char *cmd     :發(fā)送的指令
        char *check   :檢查返回的字符串
        u32 wait_time :等待的時(shí)間(100ms)為單位
        
說(shuō)明:該函數(shù)只是適用于成功后返回OK的指令
返回值: 0表示成功 1表示失敗
*/
u8 GA6_GSM_SendCmd(char *cmd,char *check,u32 wait_time)
{
   u32 i,j;
   for(i=0;i",50))return 1;

		/*2.2 發(fā)送實(shí)際要發(fā)送的數(shù)據(jù)*/
		USART_X_SendData(USART3,data,len);

		/*2.3 結(jié)束數(shù)據(jù)發(fā)送*/
	  if(GA6_GSM_SendCmd(end_char,"SEND OK",100))return 2;
	  
		return 0;
}
;i++)>
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

GA6_GPRS.h文件代碼:

#ifndef GA6_GPRS
#define GA6_GPRS
#include "stm32f10x.h"
#include "usart.h"
#include "delay.h"
u8 GA6_GSM_StateCheck(void);
u8 GA6_GSM_SendDataToServer(u8 *data,u32 len);
u8 GA6_GSM_ConnectServer(char *server_ip,u32 port);
u8 GA6_GSM_SendCmd(char *cmd,char *check,u32 wait_time);
#endif
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

Main.c代碼

#include "stm32f10x.h"
#include 
#include 
#include "ga6_gprs.h"
#include "usart.h"
#include "timer.h"
#include "led.h"
#include "key.h"

//u8 onenet_http_cmd[]=
//{
//	"POST /devices/517704007/datapoints HTTP/1.1\r\n"\
//	"api-key:vvQAUiBG=HwKzqGicH=RxBvFCDw=\r\n"\
//	"Host:api.heclouds.com\r\n"\
//	"Connection:close\r\n"\
//	"Content-Length:65\r\n"\
//	"\r\n"\
//	"{"datastreams":[{"id":"ds18b20","datapoints":[{"value":88.88}]}]}"
//};

u8 onenet_http_cmd[]=
{
	"POST /devices/517620924/datapoints HTTP/1.1\r\n"\
	"api-key:OCZ6ghYPdky3=FJQCOEVZbByHRM=\r\n"\
	"Host:api.heclouds.com\r\n"\
	"Connection:close\r\n"\
	"Content-Length:62\r\n"\
	"\r\n"\
	"{"datastreams":[{"id":"temp","datapoints":[{"value":88.88}]}]}"
};
//應(yīng)用發(fā)布地址: https://open.iot.10086.cn/iotbox/appsquare/appview?openid=905ef1b56ba526fdeee0c69a0787f176

/*
以下程序正確運(yùn)行返回的數(shù)據(jù):

+NITZ:19/03/20,14:45:27,32

Call Ready

+CREG: 1

SMS Ready
發(fā)送一次數(shù)據(jù)!
GA6_GSM_StateCheck=0
GA6_GSM_ConnectServer=0
GA6_GSM_SendDataToServer=0

SEND OK

HTTP/1.1 200 OK
Date: Wed, 20 Mar 2019 14:45:40 GMT
Content-Type: application/json
Content-Length: 26
Connection: close
Server: Apache-Coyote/1.1
Pragma: no-cache

{"errno":0,"error":"succ"}

CLOSED
*/


int main()
{   
  u8 key,state;
  LED_Init();
  KEY_Init();
  BEEP_Init();
  TIM1_Init(72,20000); //輔助串口1接收,超時(shí)時(shí)間為20ms
  USART_X_Init(USART1,72,115200);
  TIM2_Init(72,20000);//輔助串口2接收,超時(shí)時(shí)間為20ms
  USART_X_Init(USART2,36,9600);
  TIM3_Init(72,20000);//輔助串口3接收,超時(shí)時(shí)間為20ms
  USART_X_Init(USART3,36,115200);
  printf("UART1 OK.....\n");
  
  while(1)
  {     
     if(USART3_RX_FLAG)
     {
         USART3_RX_BUFF[USART3_RX_CNT]='\0';
         //printf("buff=%s,cnt=%d\n\n",USART3_RX_BUFF,USART3_RX_CNT);
         printf("%s",USART3_RX_BUFF);
         USART3_RX_CNT=0;
         USART3_RX_FLAG=0;
         memset(USART3_RX_BUFF,0,sizeof(USART3_RX_BUFF));
     }
     
     key=KEY_Scanf();
     if(key)
     {
		  LED0=!LED0;
		  LED1=!LED1;
		  printf("發(fā)送一次數(shù)據(jù)!\n");
		  /*1. 檢查GSM工作狀態(tài)*/
		  state=GA6_GSM_StateCheck();
		  printf("GA6_GSM_StateCheck=%d\n",state);
		  if(!state)
		  {
			/*2. 連接服務(wù)器*/
			state=GA6_GSM_ConnectServer("183.230.40.33",80);
			printf("GA6_GSM_ConnectServer=%d\n",state);
			if(!state)
			{
				/*3. 向服務(wù)器發(fā)送數(shù)據(jù)*/
				state=GA6_GSM_SendDataToServer(onenet_http_cmd,strlen((char*)onenet_http_cmd));
				printf("GA6_GSM_SendDataToServer=%d\n",state);
			}
			else
			{
				//手動(dòng)斷開(kāi)服務(wù)器連接
				printf("斷開(kāi)服務(wù)器連接:%d\r\n",GA6_GSM_SendCmd("AT+CIPCLOSE\r\n","OK",5000));
			}
		 }
     }
  }
}
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

3.3 GA6-B模塊使用HTTP協(xié)議連接OneNet服務(wù)器上傳GPS經(jīng)緯度

為了提高效率,通過(guò)GPS配置軟件,可以將GPS模塊配置成功以下選項(xiàng):

?

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

主要修改的地方:

  1. GPS模塊默認(rèn)波特率為9600,配置成115200
  2. 輸出的語(yǔ)句,只是輸出RMC(推薦定位信息),因?yàn)楝F(xiàn)在只需要經(jīng)緯度信息即可。
  3. 系統(tǒng)設(shè)置熱啟動(dòng)狀態(tài),提高定位速度

經(jīng)緯度格式分為三種:

度: (ddd.ddddd °) 十進(jìn)制小數(shù)部分(5位)

度 . 分 : (ddd°mm.mmm’ ) 十進(jìn)制小數(shù)部分(3位)

度 . 分 . 秒 :(ddd°mm’ss’’)

關(guān)系:

一度(°)等于60分鐘(’)等于3600秒(“):

整度(d)等于十進(jìn)制的度的整數(shù)部分(dd):

分鐘(m)等于十進(jìn)制的度的整數(shù)部分(dd)減去整數(shù)度(d)的60倍:

秒(s)等于十進(jìn)制的度(dd)減去整數(shù)度(d)減分(M)除以60乘以3600:

GPS.c文件代碼示例:


#include "gps.h"
/*
函數(shù)功能:從buf里面得到第cnt個(gè)逗號(hào)所在的位置
返 回 值:0~254,代表逗號(hào)所在位置的偏移.
255,代表不存在第cnt個(gè)逗號(hào)
*/
u8 GPS_GetCommaOffset(char *buf,u8 cnt)
{
	char *p=buf;
	while(cnt)
	{
		if(*buf=='*'||*buf<' '||*buf>'z')return 255;//遇到'*'或者非法字符,則不存在第cx個(gè)逗號(hào)
		if(*buf==',')cnt--;
		buf++;
	}
	return buf-p; //計(jì)算偏移量
}


/*
函數(shù)功能: 獲取GPS經(jīng)緯度數(shù)據(jù)值
函數(shù)參數(shù):
        double *Longitude  :經(jīng)度
        double *latitude   :緯度
返回值: 0表示定位成功,1表示定位失敗

說(shuō)明: 解析$GNRMC命令,得到經(jīng)緯度
$GNRMC,023705.000,A,2842.4164,N,11549.5713,E,1.73,91.65,150319,,,A*41

轉(zhuǎn)換公式示例:
經(jīng)度: dddmm.mmmm 東經(jīng) 11408.4790 114+(08.4790/60)=114.141317
緯度: ddmm.mmmm 北緯 2236.9453 22+(36.9453/60)= 22.615755
*/
u8 GPS_GNRMC_Decoding(char *gps_buffer,double *Longitude,double *latitude)
{
    u8 Offset;
    u32 int_data;
    double s_Longitude,s_latitude;
    char *p;

    /*1. 確定下定位是否成功*/
    p=strstr(gps_buffer,"$GNRMC");
    if(!p)return 1;
    
    Offset=GPS_GetCommaOffset(p,2);
    if(Offset==255)return 2;
    if(*(p+Offset)!='A')return 3; //定位不準(zhǔn)確
    
    /*2. 得到緯度*/
    Offset=GPS_GetCommaOffset(p,3);
    if(Offset==255)return 4;
    sscanf(p+Offset,"%lf",&s_latitude);
   // printf("轉(zhuǎn)換前的緯度:%lf\r\n",s_latitude);
  
    s_latitude=s_latitude/100;
    int_data=s_latitude;//得到緯度整數(shù)部分
    s_latitude=s_latitude-int_data;//得到緯度小數(shù)部分
    s_latitude=(s_latitude)*100;
    *latitude=int_data+(s_latitude/60.0); //得到轉(zhuǎn)換后的值
   // printf("轉(zhuǎn)換后的緯度: %lf\r\n",*latitude);
 
    /*3. 得到經(jīng)度*/
    Offset=GPS_GetCommaOffset(p,5);
    if(Offset==255)return 5;
    sscanf(p+Offset,"%lf",&s_Longitude);
   // printf("轉(zhuǎn)換前的經(jīng)度:%lf\r\n",s_Longitude);
    
    s_Longitude=s_Longitude/100;
    int_data=s_Longitude;//得到經(jīng)度整數(shù)部分
    s_Longitude=s_Longitude-int_data; //得到經(jīng)度小數(shù)部分
    s_Longitude=s_Longitude*100;
    *Longitude=int_data+(s_Longitude/60.0);
   // printf("轉(zhuǎn)換后的經(jīng)度:%lf\r\n",*Longitude);
    
    return 0;
}
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

GPS.h代碼示例

#ifndef GPS_H
#define GPS_H
#include "stm32f10x.h"
#include 
#include "usart.h"
u8 GPS_GNRMC_Decoding(char *gps_buffer,double *Longitude,double *latitude);
#endif
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

Main.c代碼示例

#include "stm32f10x.h"
#include 
#include 
#include "ga6_gprs.h"
#include "usart.h"
#include "timer.h"
#include "led.h"
#include "key.h"
#include "gps.h"

char onenet_http_cmd[1024];
//應(yīng)用發(fā)布地址: https://open.iot.10086.cn/iotbox/appsquare/appview?openid=fd1307a02210acbef4b34de89d6cfe21

/*
GPS 接線方式: 將 GPS 模塊的 TX 腳與 PA3 相連接。 (串口 2 的接收腳)
GPS 模塊波特率默認(rèn)為 9600  (為了提高速度,可以將GPS的波特率設(shè)置成115200---可直接通過(guò)上位機(jī)軟件設(shè)置)
GPS 模塊型號(hào): ATGM336H-5N
電 源: 3V
*/


/*
GA6-GSM 接線方式: 將 GA6-GSM  模塊的 UTX 腳與 PB11 相連接,URX 腳與 PB10 相連接。 (串口 3 的接收腳)
GA6-GSM  模塊波特率默認(rèn)為 115200
GA6-GSM  模塊型號(hào): 果云GA6-B
電 源: 5V
*/

int main()
{   
  double Longitude,latitude;
  u8 state;
  u32 time_cnt=0;
  u16 data_tx_len=0;
  char temp_buff[50];
  
  LED_Init();
  KEY_Init();
  BEEP_Init();
  TIM1_Init(72,20000); //輔助串口1接收,超時(shí)時(shí)間為20ms
	USART_X_Init(USART1,72,115200);
  TIM2_Init(72,20000);//輔助串口2接收,超時(shí)時(shí)間為20ms
  USART_X_Init(USART2,36,115200);   //接GPS模塊
  TIM3_Init(72,20000);//輔助串口3接收,超時(shí)時(shí)間為20ms
  USART_X_Init(USART3,36,115200); //接GSM模塊
  printf("UART1 OK.....\n");
  
  while(1)
  {     
      //接收GPRS模塊的返回值
     if(USART3_RX_FLAG)
     {
         USART3_RX_BUFF[USART3_RX_CNT]='\0';
         //printf("buff=%s,cnt=%d\n\n",USART3_RX_BUFF,USART3_RX_CNT);
         printf("%s",USART3_RX_BUFF);
         USART3_RX_CNT=0;
         USART3_RX_FLAG=0;
         memset(USART3_RX_BUFF,0,sizeof(USART3_RX_BUFF));
     }
     
     //接收GPS模塊的返回值
     if(USART2_RX_FLAG)
     {
         USART2_RX_BUFF[USART2_RX_CNT]='\0';
         //printf("USART2_RX_BUFF=%s",USART2_RX_BUFF);
       
         //解析GPS數(shù)據(jù),得到經(jīng)緯度
         if(GPS_GNRMC_Decoding((char*)USART2_RX_BUFF,&Longitude,&latitude))
         {
            printf("GPS定位失敗! 請(qǐng)到空曠地方定位\r\n");
         }
         else //定位成功
         {
             if(time_cnt>=8000) //8秒一次
             {
                data_tx_len=71;
                sprintf(temp_buff,"%lf",Longitude);
                data_tx_len+=strlen(temp_buff);
               
                sprintf(temp_buff,"%lf",latitude);
                data_tx_len+=strlen(temp_buff); //得到發(fā)送的數(shù)據(jù)長(zhǎng)度
               
                snprintf(onenet_http_cmd,sizeof(onenet_http_cmd),
                  "POST /devices/517704007/datapoints HTTP/1.1\r\n"\
                  "api-key:vvQAUiBG=HwKzqGicH=RxBvFCDw=\r\n"\
                  "Host:api.heclouds.com\r\n"\
                  "Connection:close\r\n"\
                  "Content-Length:%d\r\n"\
                  "\r\n"\
                  "{"datastreams":[{"id":"gps","datapoints":[{"value":{"lon":%lf,"lat":%lf}}]}]}",
                   data_tx_len,Longitude,latitude
                  );
                printf("data_tx_len=%d\r\n",data_tx_len);
                printf("經(jīng)度:%lf,緯度:%lf\r\n",Longitude,latitude);
 
                time_cnt=0;
                LED0=!LED0;
                LED1=!LED1;
                /*1. 檢查GSM工作狀態(tài)*/
                state=GA6_GSM_StateCheck();
                printf("GA6_GSM_StateCheck=%d\n",state);
                if(!state)
                {
                    /*2. 連接服務(wù)器*/
                    state=GA6_GSM_ConnectServer("183.230.40.33",80);          
                    printf("GA6_GSM_ConnectServer=%d\n",state);
                    if(!state)
                    {
                      /*3. 向服務(wù)器發(fā)送數(shù)據(jù)*/
                    state=GA6_GSM_SendDataToServer((u8*)onenet_http_cmd,strlen((char*)onenet_http_cmd));
                      printf("GA6_GSM_SendDataToServer=%d\n",state);
                    }
                    else
                    {
                        //手動(dòng)斷開(kāi)服務(wù)器連接
                     printf("斷開(kāi)服務(wù)器連接:%d\r\n",GA6_GSM_SendCmd("AT+CIPCLOSE\r\n","OK",5000));
                    }
                }
             }
         }
         USART2_RX_CNT=0;
         USART2_RX_FLAG=0;
         memset(USART2_RX_BUFF,0,sizeof(USART2_RX_BUFF));
     }
     
    time_cnt++;
    delay_ms(1);
  }
}
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png
  1. 網(wǎng)頁(yè)上顯示的效果:
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

完整源碼下載: https://download.csdn.net/download/xiaolong1126626497/18245590

審核編輯:符乾江

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • STM32
    +關(guān)注

    關(guān)注

    2263

    文章

    10849

    瀏覽量

    353874
  • GPRS
    +關(guān)注

    關(guān)注

    21

    文章

    983

    瀏覽量

    129242
  • GSM
    GSM
    +關(guān)注

    關(guān)注

    9

    文章

    835

    瀏覽量

    122727
  • OneNET
    +關(guān)注

    關(guān)注

    1

    文章

    50

    瀏覽量

    12731
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    GPS定位與IP地址定位的互聯(lián)策略

    雖然GPS定位和IP地址定位在原理、精度以及應(yīng)用場(chǎng)景上存在差異,但如果有一種互聯(lián)的策略實(shí)施,兩者的優(yōu)勢(shì)可以互補(bǔ),由此也可以構(gòu)建起更為靈活的定位解決方案。
    的頭像 發(fā)表于 10-11 10:03 ?159次閱讀

    GPS車載定位系統(tǒng)的設(shè)計(jì)

    電子發(fā)燒友網(wǎng)站提供《GPS車載定位系統(tǒng)的設(shè)計(jì).doc》資料免費(fèi)下載
    發(fā)表于 09-07 09:26 ?0次下載

    Tag器芯片方案匯總

    Tag器產(chǎn)業(yè),起源于蘋果2021年推出的AirTag產(chǎn)品。
    的頭像 發(fā)表于 08-30 09:38 ?356次閱讀
    Tag<b class='flag-5'>防</b><b class='flag-5'>丟</b>器芯片方案匯總

    基于STM32單片機(jī)的GPS定位系統(tǒng)設(shè)計(jì)

    本次設(shè)計(jì)的定位系統(tǒng),是以STM32單片機(jī)作為核心控制器,可以控制 GPS 定位模塊對(duì)經(jīng)緯度信息進(jìn)行采集,可以對(duì)安全值進(jìn)行設(shè)定,當(dāng)超過(guò)安全范圖后會(huì)控制無(wú)線通信模塊發(fā)送報(bào)警信息給用戶,同時(shí)
    的頭像 發(fā)表于 06-24 09:50 ?1526次閱讀
    基于<b class='flag-5'>STM32</b>單片機(jī)的<b class='flag-5'>GPS</b><b class='flag-5'>定位</b>系統(tǒng)設(shè)計(jì)

    低功耗藍(lán)牙模塊輕松實(shí)現(xiàn)智能

    ,智能眼鏡、智能器等,尤其是器,近些年需求旺盛,它能很方便的給出提醒。 ?目前器的種
    的頭像 發(fā)表于 05-25 15:19 ?269次閱讀

    基于STM32GPS定位

    應(yīng)用于安領(lǐng)域、物聯(lián)網(wǎng)設(shè)備、車聯(lián)網(wǎng)領(lǐng)域、畢業(yè)設(shè)計(jì)、個(gè)人DIY等。 一.產(chǎn)品簡(jiǎn)介 基于STM32GPS定位儀項(xiàng)目結(jié)合了高性能MCU與GPS
    的頭像 發(fā)表于 05-07 09:45 ?713次閱讀
    基于<b class='flag-5'>STM32</b>的<b class='flag-5'>GPS</b><b class='flag-5'>定位</b>儀

    UWB定位技術(shù)與GPS定位區(qū)別及應(yīng)用

    GPS定位技術(shù)是一種基于衛(wèi)星定位系統(tǒng)的全球定位技術(shù),其主要優(yōu)勢(shì)在于可以覆蓋全球范圍,并且能夠提供相對(duì)較為精確的定位信息,一般達(dá)到米級(jí)或十米級(jí)
    的頭像 發(fā)表于 04-24 16:52 ?1702次閱讀
    UWB<b class='flag-5'>定位</b>技術(shù)與<b class='flag-5'>GPS</b><b class='flag-5'>定位</b>區(qū)別及應(yīng)用

    什么是gps定位? gps定位放線的步驟有哪些

    GPS定位是一種通過(guò)全球衛(wèi)星定位系統(tǒng)(GPS)來(lái)確定地理位置的技術(shù)。GPS定位系統(tǒng)是由一組空間分
    的頭像 發(fā)表于 01-22 15:48 ?6083次閱讀

    僅需AirTag價(jià)格零頭,平替FindMy定位器“蘑菇頭”

    是——FindyMy定位器。早之前就有工程師朋友留言建議:希望有一款A(yù)irTag的平替產(chǎn)品?,F(xiàn)在,它來(lái)了!FindyMy“蘑菇頭”
    的頭像 發(fā)表于 12-19 08:04 ?1393次閱讀
    僅需AirTag價(jià)格零頭,平替FindMy<b class='flag-5'>防</b><b class='flag-5'>丟</b><b class='flag-5'>定位</b>器“蘑菇頭”

    GPS能室內(nèi)定位嗎?

    GPS能室內(nèi)定位嗎? GPS(全球衛(wèi)星導(dǎo)航系統(tǒng))是一種使用衛(wèi)星技術(shù)進(jìn)行定位和導(dǎo)航的系統(tǒng),它可以在戶外環(huán)境下非常準(zhǔn)確地確定位置信息。然而,在室
    的頭像 發(fā)表于 12-12 14:39 ?2107次閱讀

    常見(jiàn)的網(wǎng)絡(luò)包故障定位?法

    包了,類似情況想必?家都不陌?。針對(duì)?絡(luò)包,本?提供?些常見(jiàn)的包故障定位?法,希望能夠幫助?家對(duì)?絡(luò)包有更多的認(rèn)識(shí),遇到
    的頭像 發(fā)表于 12-07 09:48 ?1389次閱讀
    常見(jiàn)的網(wǎng)絡(luò)<b class='flag-5'>丟</b>包故障<b class='flag-5'>定位</b>?法

    芯應(yīng)用 | 低成本GPS定位器供電芯片方案

    GPS定位器通過(guò)全球定位系統(tǒng)(GPS)精確測(cè)定位置并提供實(shí)時(shí)、準(zhǔn)確的位置信息,廣泛應(yīng)用于車輛追蹤、人員安全、智慧物流、物品
    的頭像 發(fā)表于 11-16 08:54 ?899次閱讀
    芯應(yīng)用 | 低成本<b class='flag-5'>GPS</b><b class='flag-5'>定位</b>器供電芯片方案

    網(wǎng)絡(luò)包故障如何定位

    是數(shù)據(jù)被包了,類似情況想必大家都不陌生。針對(duì)網(wǎng)絡(luò)包,本人提供一些常見(jiàn)的包故障定位方法,希望能夠幫助大家對(duì)網(wǎng)絡(luò)包有更多的認(rèn)識(shí),遇到
    的頭像 發(fā)表于 11-10 11:27 ?1134次閱讀
    網(wǎng)絡(luò)<b class='flag-5'>丟</b>包故障如何<b class='flag-5'>定位</b>

    水下GPS定位的誤差分析

    電子發(fā)燒友網(wǎng)站提供《水下GPS定位的誤差分析.pdf》資料免費(fèi)下載
    發(fā)表于 11-06 10:42 ?0次下載
    水下<b class='flag-5'>GPS</b><b class='flag-5'>定位</b>的誤差分析

    GPS定位器供電方案H6217L介紹

    GPS定位器通過(guò)全球定位系統(tǒng)(GPS)精確測(cè)定位置并提供實(shí)時(shí)、準(zhǔn)確的位置信息,廣泛應(yīng)用于車輛追蹤、人員安全、智慧物流、物品
    的頭像 發(fā)表于 11-01 09:32 ?713次閱讀
    <b class='flag-5'>GPS</b><b class='flag-5'>定位</b>器供電方案H6217L介紹