国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

cubemx hal stm32 atgm336h GPS 北斗 定位 模塊 驅(qū)動代碼

這篇具有很好參考價(jià)值的文章主要介紹了cubemx hal stm32 atgm336h GPS 北斗 定位 模塊 驅(qū)動代碼。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

atgm336h,STM32,單片機(jī)模塊,cubemx,stm32,單片機(jī),嵌入式硬件

代碼部分

atgm336h.c

#include "atgm336h.h"
#include "stdio.h"
#include "string.h"

char rxdatabufer;
u16 point1 = 0;

_SaveData Save_Data;
LatitudeAndLongitude_s g_LatAndLongData =
{
	.E_W = 0,
	.N_S = 0,
	.latitude = 0.0,
	.longitude = 0.0
};

// 串口1中斷服務(wù)程序
// 注意,讀取USARTx->SR能避免莫名其妙的錯誤
char USART_RX_BUF[USART_REC_LEN];	// 接收緩沖,最大USART_REC_LEN個字節(jié).
uint8_t uart_A_RX_Buff;

// 接收狀態(tài)
// bit15,	接收完成標(biāo)志
// bit14,	接收到0x0d
// bit13~0,	接收到的有效字節(jié)數(shù)目
u16 USART_RX_STA=0;	// 接收狀態(tài)標(biāo)記

void atgm336h_init(void)
{
	clrStruct();
	HAL_UART_Receive_IT(&huart2, &uart_A_RX_Buff, 1);
}

void atgm336h_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart->Instance == USART2)
	{
//		printf("%c", uart_A_RX_Buff);
		if(uart_A_RX_Buff == '$')
		{
			point1 = 0;
		}
		USART_RX_BUF[point1++] = uart_A_RX_Buff;

		if(USART_RX_BUF[0] == '$' && USART_RX_BUF[4] == 'M' && USART_RX_BUF[5] == 'C')	//確定是否收到"GPRMC/GNRMC"這一幀數(shù)據(jù)
		{
			if(uart_A_RX_Buff == '\n')
			{
				memset(Save_Data.GPS_Buffer, 0, GPS_Buffer_Length);      //清空
				memcpy(Save_Data.GPS_Buffer, USART_RX_BUF, point1); 	//保存數(shù)據(jù)
				Save_Data.isGetData = true;
				point1 = 0;
				memset(USART_RX_BUF, 0, USART_REC_LEN);      //清空
			}
		}
		if(point1 >= USART_REC_LEN)
		{
			point1 = USART_REC_LEN;
		}

		HAL_UART_Receive_IT(&huart2, &uart_A_RX_Buff, 1);
	}
}

u8 Hand(char *a)	// 串口命令識別函數(shù)
{
    if(strstr(USART_RX_BUF, a)!=NULL)
	    return 1;
	else
		return 0;
}

void CLR_Buf(void)	// 串口緩存清理
{
	memset(USART_RX_BUF, 0, USART_REC_LEN);	//清空
  point1 = 0;
}

void clrStruct(void)
{
	Save_Data.isGetData = false;
	Save_Data.isParseData = false;
	Save_Data.isUsefull = false;
	memset(Save_Data.GPS_Buffer, 0, GPS_Buffer_Length);	//清空
	memset(Save_Data.UTCTime, 0, UTCTime_Length);
	memset(Save_Data.latitude, 0, latitude_Length);
	memset(Save_Data.N_S, 0, N_S_Length);
	memset(Save_Data.longitude, 0, longitude_Length);
	memset(Save_Data.E_W, 0, E_W_Length);
}

void errorLog(int num)
{

	while (1)
	{
	  	printf("ERROR%d\r\n",num);
	}
}

void parseGpsBuffer(void)
{
	char *subString;
	char *subStringNext;
	char i = 0;

	uint16_t Number=0, Integer=0, Decimal=0;


	if (Save_Data.isGetData)
	{
		Save_Data.isGetData = false;
		printf("**************\r\n");
		printf("%s\r\n", Save_Data.GPS_Buffer);

		for (i = 0 ; i <= 6 ; i++)
		{
			if (i == 0)
			{
				if ((subString = strstr(Save_Data.GPS_Buffer, ",")) == NULL)
					errorLog(1);	//解析錯誤
			}
			else
			{
				subString++;
				if ((subStringNext = strstr(subString, ",")) != NULL)
				{
					char usefullBuffer[2];
					switch(i)
					{
						case 1:memcpy(Save_Data.UTCTime, subString, subStringNext - subString);break;	//獲取UTC時間
						case 2:memcpy(usefullBuffer, subString, subStringNext - subString);break;	//獲取UTC時間
						case 3:memcpy(Save_Data.latitude, subString, subStringNext - subString);break;	//獲取緯度信息
						case 4:memcpy(Save_Data.N_S, subString, subStringNext - subString);break;	//獲取N/S
						case 5:memcpy(Save_Data.longitude, subString, subStringNext - subString);break;	//獲取經(jīng)度信息
						case 6:memcpy(Save_Data.E_W, subString, subStringNext - subString);break;	//獲取E/W

						default:break;
					}
					subString = subStringNext;
					Save_Data.isParseData = true;
					if(usefullBuffer[0] == 'A')
						Save_Data.isUsefull = true;
					else if(usefullBuffer[0] == 'V')
						Save_Data.isUsefull = false;
				}
				else
				{
					errorLog(2);	//解析錯誤
				}
			}
		}

		if (Save_Data.isParseData)
		{
			if(Save_Data.isUsefull)
			{
				// 獲取 N/S 和 E/W
				g_LatAndLongData.N_S = Save_Data.N_S[0];
				g_LatAndLongData.E_W = Save_Data.E_W[0];

				// 獲取緯度
				for(uint8_t i=0; i<9; i++)
				{
					if(i<2)
					{
						Number *= 10;
						Number += Save_Data.latitude[i]-'0';
					}
					else if(i<4)
					{
						Integer *= 10;
						Integer += Save_Data.latitude[i]-'0';
					}
					else if(i==4);
					else if(i<9)
					{
						Decimal *= 10;
						Decimal += Save_Data.latitude[i]-'0';
					}
				}
				g_LatAndLongData.latitude = 1.0*Number + (1.0*Integer+1.0*Decimal/10000)/60;

				Number = 0;
				Integer = 0;
				Decimal = 0;

				// 獲取經(jīng)度
				for(uint8_t i=0; i<10; i++)
				{
					if(i<3)
					{
						Number *= 10;
						Number += Save_Data.longitude[i]-'0';
					}
					else if(i<5)
					{
						Integer *= 10;
						Integer += Save_Data.longitude[i]-'0';
					}
					else if(i==5);
					else if(i<10)
					{
						Decimal *= 10;
						Decimal += Save_Data.longitude[i]-'0';
					}
				}
				g_LatAndLongData.longitude = 1.0*Number + (1.0*Integer+1.0*Decimal/10000)/60;
			}
		}
	}
}

void printGpsBuffer(void)
{
	if (Save_Data.isParseData)
	{
		Save_Data.isParseData = false;

		printf("Save_Data.UTCTime = %s\r\n", Save_Data.UTCTime);

		if(Save_Data.isUsefull)
		{
			Save_Data.isUsefull = false;
			printf("Save_Data.latitude = %s\r\n", Save_Data.latitude);
			printf("Save_Data.N_S = %s", Save_Data.N_S);
			printf("Save_Data.longitude = %s", Save_Data.longitude);
			printf("Save_Data.E_W = %s\r\n", Save_Data.E_W);

			printf("latitude: %c,%.4f\r\n", g_LatAndLongData.N_S, g_LatAndLongData.latitude);
			printf("longitude: %c,%.4f\r\n", g_LatAndLongData.E_W, g_LatAndLongData.longitude);
		}
		else
		{
			printf("GPS DATA is not usefull!\r\n");
		}
	}
}

atgm336h.h

#ifndef __ATGM336H_H
#define __ATGM336H_H

#include "usart.h"
#include "sys.h"
#include "stdbool.h"

#define USART_REC_LEN  		200	//定義最大接收字節(jié)數(shù) 200
#define EN_USART1_RX 			1		//使能(1)/禁止(0)串口1接收

//#define false 0
//#define true 1

//定義數(shù)組長度
#define GPS_Buffer_Length 80
#define UTCTime_Length 11
#define latitude_Length 11
#define N_S_Length 2
#define longitude_Length 12
#define E_W_Length 2



typedef struct SaveData
{
	char GPS_Buffer[GPS_Buffer_Length];
	char isGetData;		//是否獲取到GPS數(shù)據(jù)
	char isParseData;	//是否解析完成
	char UTCTime[UTCTime_Length];		//UTC時間
	char latitude[latitude_Length];		//緯度
	char N_S[N_S_Length];		//N/S
	char longitude[longitude_Length];		//經(jīng)度
	char E_W[E_W_Length];		//E/W
	char isUsefull;		//定位信息是否有效
} _SaveData;

// 經(jīng)緯度數(shù)據(jù)
typedef struct _LatitudeAndLongitude_s
{
	float latitude;			// 緯度
	float longitude;		// 經(jīng)度

	char N_S;	// 北南
	char E_W;	// 東西
}LatitudeAndLongitude_s;


extern char rxdatabufer;
extern u16 point1;
extern _SaveData Save_Data;
extern LatitudeAndLongitude_s g_LatAndLongData;

// 放入串口接收中斷中
void atgm336h_UART_RxCpltCallback(UART_HandleTypeDef *huart);

// 初始化
void atgm336h_init(void);

// 清除結(jié)構(gòu)體數(shù)據(jù)
void clrStruct(void);

// 解包函數(shù)
void parseGpsBuffer(void);

// 打印函數(shù)
void printGpsBuffer(void);

#endif	// __ATGM336H_H


使用

main.c文章來源地址http://www.zghlxwxcb.cn/news/detail-859153.html

#include "atgm336h.h"
#include "stdio.h"


int fputc(int ch, FILE *fp)
{
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
  return ch;
}

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	atgm336h_UART_RxCpltCallback(huart);
}

int main(void)
{
  atgm336h_init();

  while (1)
  {
	if (Save_Data.isParseData)
	{
		Save_Data.isParseData = false;
		if(Save_Data.isUsefull)
		{
			Save_Data.isUsefull = false;
			printf("latitude: %c,%.4f\r\n", g_LatAndLongData.N_S, g_LatAndLongData.latitude);
			printf("longitude: %c,%.4f\r\n", g_LatAndLongData.E_W, g_LatAndLongData.longitude);
		}
		else
		{
			printf("GPS DATA is not usefull!\r\n");
		}
	}
	HAL_Delay(30);
  }
}

到了這里,關(guān)于cubemx hal stm32 atgm336h GPS 北斗 定位 模塊 驅(qū)動代碼的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • STM32基于HAL解析GPS經(jīng)度緯度以及時間

    STM32基于HAL解析GPS經(jīng)度緯度以及時間

    第一步:打開CubeMX工具: 第二步:創(chuàng)建一個工程:搜索一下需要的芯片。 ?第三步:配置調(diào)試器 第四步:配置時鐘 第五步: 配置時鐘樹,在下圖所示出輸入,點(diǎn)擊回車即可。 ?第六步:配置串口 ?第七步: 第二部分:?代碼編寫 第一步:定義一個用于存放經(jīng)度緯度的緩存

    2024年04月08日
    瀏覽(34)
  • STM32GPS定位 NEO_6M

    STM32GPS定位 NEO_6M

    提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 目錄 前言: 一、使用HAL庫生成代碼 ? ? ? ? ?1、HAL庫設(shè)置 二、程序編寫 1.串口 2.gps.c ???????GPS.h 3、串口1開啟接收 4、main.c 總結(jié) 使用stm3f103c8t6, GPS是NEO-6M ? ? ? ? ? ? ? ? ? ? 選擇使用的芯片 ?

    2023年04月08日
    瀏覽(19)
  • 【11】STM32·HAL庫開發(fā)-STM32CubeMX簡介、安裝 | 新建STM32CubeMX工程步驟

    【11】STM32·HAL庫開發(fā)-STM32CubeMX簡介、安裝 | 新建STM32CubeMX工程步驟

    ??STM32CubeMX是ST開發(fā)的一款圖形配置工具,可通過配置自動生成 初始化代碼 (并不包括邏輯代碼)。以下是STM32CubeMX官方宣傳圖片,適用于Windows和macOS系統(tǒng),用于生成初始化代碼,一個圖形配置工具,搭配不同系列的STM32Cube固件包,即可支持不同系列的STM32芯片,初始化代碼

    2024年02月17日
    瀏覽(57)
  • STM32 HAL庫 STM32CubeMX -- ADC

    STM32 HAL庫 STM32CubeMX -- ADC

    ADC(Analog-to-Digital Converter)指模/數(shù)轉(zhuǎn)換器或者模擬/數(shù)字轉(zhuǎn)換器。 是指將連續(xù)變量的模擬信號轉(zhuǎn)換為離散的數(shù)字信號的器件。 也就是將 模擬信號 轉(zhuǎn)化為 數(shù)字信號 。 STM32f103 系列有3 個ADC,精度為12 位,每個ADC 最多有16 個外部通道和2個內(nèi)部信號源。其中ADC1 和ADC2 都有16 個外部

    2024年02月15日
    瀏覽(24)
  • STM32 HAL庫 STM32CubeMx -- 外部中斷

    STM32 HAL庫 STM32CubeMx -- 外部中斷

    中斷,是指處理機(jī)處理程序運(yùn)行中出現(xiàn)的緊急事件的整個過程。程序運(yùn)行過程中,系統(tǒng)外部、系統(tǒng)內(nèi)部或者現(xiàn)行程序本身若出現(xiàn)緊急事件,處理機(jī)立即中止現(xiàn)行程序的運(yùn)行,自動轉(zhuǎn)入相應(yīng)的處理程序(中斷服務(wù)程序),待處理完后,再返回原來的程序運(yùn)行,這整個過程稱為程序

    2024年02月08日
    瀏覽(21)
  • STM32 HAL庫 STM32CubeMX -- SPI

    STM32 HAL庫 STM32CubeMX -- SPI

    SPI (Serial Peripheral Interface)協(xié)議,即串行外圍設(shè)備接口,是一種高速全雙工的通信總線。 它被廣泛地使用在ADC、LCD 等設(shè)備與MCU 間,要求通訊速率較高的場合。 SPI 通訊使用3 條總線及片選線, 3 條總線分別為SCK、MOSI、MISO,片選線為SS(CS) ,它們的作用介紹如下: (1) SS( Slav

    2024年02月13日
    瀏覽(27)
  • 【HAL庫】HAL庫STM32cubemx快速使用

    【HAL庫】HAL庫STM32cubemx快速使用

    軟件:keil5、STM32Cubemx 硬件:淘寶的STM32F103C8T6最小系統(tǒng) 1 新建工程 2 配置RCC 選擇外部時鐘源。 設(shè)置外部晶振輸入值,我這塊板子是8M。 然后手動輸入最大時鐘頻率,然后回車讓他自動配置時鐘樹。我這塊板子是72M。 3 配置SYS 我的下載器是SWD兩根線的,所以我選這個。(一定

    2023年04月20日
    瀏覽(26)
  • 【北斗GPS社區(qū)】如何把換盆子的舊手機(jī)變成定位器

    【北斗GPS社區(qū)】如何把換盆子的舊手機(jī)變成定位器

    基本所有的手機(jī)都支持GPS定位功能,最新的手機(jī)也已經(jīng)支持了全球的北斗,GPS等定位技術(shù),因此手機(jī)基本是可以滿足定位功能。平時大家使用手機(jī)的GPS技術(shù)進(jìn)行導(dǎo)航等功能,但導(dǎo)航軟件一般都沒有記錄和回放自己行程軌跡的功能。 ? 但這種功能手機(jī)也是可以支持的,大家一起

    2024年02月02日
    瀏覽(30)
  • STM32 HAL庫 STM32CubeMX -- PWM(呼吸燈)

    STM32 HAL庫 STM32CubeMX -- PWM(呼吸燈)

    PWM (Pulse Width Modulation)就是對外輸出脈寬(即占空比)可調(diào)的方波信號,簡稱脈寬調(diào)制; 信號頻率由自動重裝寄存器ARR 的值決定,占空比由比較寄存器CCR 的值決定。 PWM模式1 : 在向上計(jì)數(shù)時 ,一旦TIMx_CNTTIMx_CCR1時通道1為有效電平,否則為無效電平; 在向下計(jì)數(shù)時 ,一旦

    2024年02月01日
    瀏覽(20)
  • STM32 HAL庫 STM32CubeMX -- IWDG(獨(dú)立看門狗)

    STM32 HAL庫 STM32CubeMX -- IWDG(獨(dú)立看門狗)

    看門狗(Watchdog)就是MCU上的一種特殊的定時器,用于監(jiān)視系統(tǒng)的運(yùn)行,在發(fā)生錯誤(例如程序出現(xiàn)死循環(huán))時,能觸發(fā)一個中斷或產(chǎn)生系統(tǒng)復(fù)位,防止程序跑飛。STM32 有兩個看門狗,一個是獨(dú)立看門狗另外一個是窗口看門狗,獨(dú)立看門狗號稱寵物狗,窗口看門狗號稱警犬。 獨(dú)立看

    2024年02月19日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包