⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dataret.c

📁 利用ARM解析4HZ GPS模块的定位信息和经纬度
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************************************************
* 文件名:DMS_GPS.C
* 功能:使用串口UART1接收GPS发送的数据,并将数据原封不动地使用串口UART0发送回上位机。
* 说明:将跳线器JP8短接。
*      通讯波特率9600,8位数据位,1位停止位,无奇偶校验。
****************************************************************************/
#include  "config.h" 

#define   SPI_CS	0x00000100		/* P0.8 */
#define   SPI_DATA	0x00000040		/* P0.6 */
#define   SPI_CLK	0x00000010		/* P0.4 */

#define   SPI_IOCON	0x00000150		/* 定义SPI接口的I/O设置字 */


/* 定义串口模式设置数据结构 */
typedef  struct  UartMode
{  uint8 datab;         // 字长度,5/6/7/8
   uint8 stopb;         // 停止位,1/2
   uint8 parity;    	// 奇偶校验位,0为无校验,1奇数校验,2为偶数校验
}  UARTMODE;


uint8  rcv_buf[295];       		// UART0数据接收缓冲区
uint32	WD;
uint32	JD;
uint8	LO;
uint8	NUM;
uint16	count1;					//定义接收数据的长度
volatile uint8  rcv_new;     	// 接收新数据标志
/****************************************************************************
* 名称:IRQ_UART1()
* 功能:串口UART1接收中断。接收串口数据
* 入口参数:无
* 出口参数:无
****************************************************************************/
void   __irq IRQ_UART1(void)
{  uint16  k=1;

     
   if( 0x04==(U1IIR&0x0F) ) rcv_new = 1;// 设置接收到新的数据标志
   while(U1RBR != 0x24) ;				//接收到数据头" $"了吗?
   
   rcv_buf[0] = U1RBR; 					//如果收到数据头,就开始接收数据
  do
	{
		while((U1LSR&0X01)==0);      	
  	    rcv_buf[k] = U1RBR;
		k++;
	}
	while(rcv_buf[k-1]!=0x24);//接收第一组数据

	do
	{
		//rcv_buf[k] = U1RBR;
		while((U1LSR&0X01)==0);      	
  	    rcv_buf[k] = U1RBR;
		k++;
		
	}
	while(rcv_buf[k-1]!=0x24);//接收第二组数据
   count1=k;					//将接收到数据的长度赋给全局变量
   VICVectAddr = 0x00;              	// 中断处理结束
} 
/****************************************************************************
* 名称:SendByte()
* 功能:向串口UART0发送字节数据。
* 入口参数:data                要发送的数据
* 出口参数:无
****************************************************************************/
void  SendByte(uint8 data)
{  U0THR = data;                      	// 发送数据
}


/*****************************
* 名称:ISendbyte32()
* 功能:发送四字节长度的数据
* 出口参数:data
*****************************/
void	ISendbyte32( int data1)
{
	SendByte(data1>>24);
	SendByte(data1>>16);
	SendByte(data1>>8);
	SendByte(data1);
}
       




/****************************************************************************
* 名称:ISendBuf()
* 功能:将缓冲区的数据发送回主机(使用FIFO),并等待发送完毕。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void  ISendBuf(void)
{  uint16  j;
uint16  i=0;
j=count1;
  
   for(i=0; i<count1; i++)
   { SendByte(rcv_buf[i]);
   while( (U0LSR&0x20)==0 );
   }         	// 等待数据发送
   count1=0;//将接收到的数据全部发送给上位机后将数据长度清零
}               
                 


/*****************************
* 名称:IrcvgpsW()
* 功能:计算纬度
* 入口参数:无
* 出口参数:无
***
**************************/  
void	IrcvgpsW(void)
{
//	uint16    count1=0;
	uint16    count3=0;
	uint16  k=0;
	uint16  i=0;
	uint8	j;
	WD=0;
		
	if(rcv_buf[3]=='G')//如果收到的是$GPGGA桢数据,接着执行,如果收到的是$GPRMC数据就跳转
	{
		k=4;
		do
		{
			while(rcv_buf[k]!=0x2C)
			{
				k++;
			}
			count3++;
			k++;
		}
		while(count3!=2);//从第三个逗号开始是纬度数据
//由ASIIC码格式变为十六进制形式
		i=k;
		do
		{			
			k++;
		}
		while(rcv_buf[k-1]!=0x2E);		//找到小数点
		j=k-i;
		for(i=(k-j);i<(k+4);i++)
		{
		
			if(0x30<=rcv_buf[i]&&rcv_buf[i]<=0x39)
			{
				rcv_buf[i]=rcv_buf[i]-0x30;
			}
		}
		//j--;
		if(j==4)//如果纬度数据是一千以上的按照下面计算
		{
			WD=(rcv_buf[k-4]*10000+rcv_buf[k-3]*1000+rcv_buf[k-2]*100
			+rcv_buf[k-1]*10+rcv_buf[k])*6;
		}
		else if(j==5)//如果纬度数据是一万以上的按照下面计算
		{
			WD=(rcv_buf[k-5]*100000+rcv_buf[k-4]*10000+rcv_buf[k-3]*1000
			+rcv_buf[k-2]*100+rcv_buf[k-1]*10+rcv_buf[k])*6;
		}

		ISendbyte32(WD);//将计算结果发出来
	}


	
	else if(rcv_buf[3]=='R')//如果收到的是$GPRMC数据就按照下面计算
	{
	   k=4;
		do
		{
			while(rcv_buf[k]!=0x2C)
			{
				k++;
			}
			count3++;
			k++;
		}
		while(count3!=3);
//由ASIIC码格式变为十六进制形式
		i=k;
		do
		{			
			k++;
		}
		while(rcv_buf[k-1]!=0x2E);		//找到小数点
		j=k-i;
		for(i=(k-j);i<(k+4);i++)
		{
		
			if(0x30<=rcv_buf[i]&&rcv_buf[i]<=0x39)
			{
				rcv_buf[i]=rcv_buf[i]-0x30;
			}
		}
		//j--;
		if(j==4)//如果纬度数据是一千以上的按照下面计算
		{
			WD=(rcv_buf[k-4]*10000+rcv_buf[k-3]*1000+rcv_buf[k-2]*100
			+rcv_buf[k-1]*10+rcv_buf[k])*6;
		}
		else if(j==5)//如果纬度数据是一万以上的按照下面计算
		{
			WD=(rcv_buf[k-5]*100000+rcv_buf[k-4]*10000+rcv_buf[k-3]*1000
			+rcv_buf[k-2]*100+rcv_buf[k-1]*10+rcv_buf[k])*6;
		}


		ISendbyte32(WD);//将计算结果发出来
	}

}
       


/*****************************
* 名称:IrcvgpsJ()
* 功能:计算经度
* 入口参数:无
* 出口参数:无
***
**************************/  
void	IrcvgpsJ(void)
{
//	uint16    count1=0;
	uint16    count3=0;
	uint16  k=0;
	uint16  i=0;
	uint8	j;
	JD=0;
		
	if(rcv_buf[3]=='G')//如果收到的是$GPGGA桢数据,接着执行,如果收到的是$GPRMC数据就跳转
	{
		k=4;
		do
		{
			while(rcv_buf[k]!=0x2C)
			{
				k++;
			}
			count3++;
			k++;
		}
		while(count3!=4);//从第四个逗号开始是纬度数据
//由ASIIC码格式变为十六进制形式
		i=k;
		do
		{			
			k++;
		}
		while(rcv_buf[k-1]!=0x2E);		//找到小数点
		j=k-i;
		for(i=(k-j);i<(k+4);i++)
		{
		
			if(0x30<=rcv_buf[i]&&rcv_buf[i]<=0x39)
			{
				rcv_buf[i]=rcv_buf[i]-0x30;
			}
		}
		//j--;
		if(j==6)//如果经度数据是十万以上的按照下面计算
		{
			JD=(rcv_buf[k-5]*1000000+rcv_buf[k-4]*10000+rcv_buf[k-3]*1000
			+rcv_buf[k-2]*100+rcv_buf[k-1]*10+rcv_buf[k])*6;
		}
		else if(j==5)//如果经度数据是一万以上的按照下面计算
		{
			JD=(rcv_buf[k-5]*100000+rcv_buf[k-4]*10000+rcv_buf[k-3]*1000
			+rcv_buf[k-2]*100+rcv_buf[k-1]*10+rcv_buf[k])*6;
		}

		ISendbyte32(JD);//将计算结果发出来
	}


	
	else if(rcv_buf[3]=='R')
	{
	   k=4;
		do
		{
			while(rcv_buf[k]!=0x2C)
			{
				k++;
			}
			count3++;
			k++;
		}
		while(count3!=5);
//由ASIIC码格式变为十六进制形式
		i=k;
		do
		{			
			k++;
		}
		while(rcv_buf[k-1]!=0x2E);		//找到小数点
		j=k-i;
		for(i=(k-j);i<(k+4);i++)
		{
		
			if(0x30<=rcv_buf[i]&&rcv_buf[i]<=0x39)
			{
				rcv_buf[i]=rcv_buf[i]-0x30;
			}
		}
		//j--;
		if(j==6)//如果经度数据是十万以上的按照下面计算
		{
			JD=(rcv_buf[k-5]*1000000+rcv_buf[k-4]*10000+rcv_buf[k-3]*1000
			+rcv_buf[k-2]*100+rcv_buf[k-1]*10+rcv_buf[k])*6;
		}
		else if(j==5)//如果经度数据是一万以上的按照下面计算
		{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -