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

📄 dataret.c

📁 利用ARM解析4HZ GPS模块的定位信息和经纬度
💻 C
📖 第 1 页 / 共 2 页
字号:
			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);//将计算结果发出来
	}

}
       
/*****************************
* 名称:IrcvgpsL()
* 功能:将定位标志发出来
* 入口参数:无
* 出口参数:无
***
**************************/  
void	IrcvgpsL(void)
{
//	uint16    count1=0;
	uint16    count3=0;
	uint16  k=0;
	LO=0;
		
	if(rcv_buf[3]=='G')//如果收到的是$GPGGA桢数据,接着执行,如果收到的是$GPRMC数据就跳转
	{
		k=4;
		do
		{
			while(rcv_buf[k]!=0x2C)
			{
				k++;
			}
			count3++;
			k++;
		}
		while(count3!=6);//从第七个逗号开始是定位标志
		if(0x30<=rcv_buf[k]&&rcv_buf[k]<=0x39)
			{
				rcv_buf[k]=rcv_buf[k]-0x30;
			}
		LO=rcv_buf[k];
		SendByte(LO);//将定位标志发出来
	}
		
	else if(rcv_buf[3]=='R')//如果收到的是$GPGGA桢数据,县找到$GPGGA桢数据再进行计算
	{
	   k=4;
		do
		{
			while(rcv_buf[k]!=0x2C)
			{
				k++;
			}
			count3++;
			k++;
		}
		while(count3!=12);//寻找$GPGGA标志,是在第12各逗号后再加上9个字节
	if(rcv_buf[k+9]=='G')
	{
		k=k+10;//找到数据标志后,开始找定为标志位
		count3=0;
		do
		{
			while(rcv_buf[k]!=0x2C)
			{
				k++;
			}
			count3++;
			k++;
		}
		while(count3!=6);//在第七个逗号后
		if(0x30<=rcv_buf[k]&&rcv_buf[k]<=0x39)
			{
				rcv_buf[k]=rcv_buf[k]-0x30;
			}
		LO=rcv_buf[k];
		SendByte(LO);//江计算结果发出来
	

}
}
}
/*****************************
* 名称:IrcvgpsN()
* 功能:将星数发出来
* 入口参数:无
* 出口参数:无
***
**************************/  
void	IrcvgpsN(void)
{
//	uint16    count1=0;
	uint16    count3=0;
	uint16  k=0;
	uint16  l=0;
	uint16  j=0;
	NUM=0;
		
	if(rcv_buf[3]=='G')//如果收到的是$GPGGA桢数据,接着执行,如果收到的是$GPRMC数据就跳转
	{
		k=4;
		do
		{
			while(rcv_buf[k]!=0x2C)
			{
				k++;
			}
			count3++;
			k++;
		}
		while(count3!=7);//从第八个逗号开始是定位标志
	l=k;
		do
		{
			while(rcv_buf[k]!=0x2C)
			{
				k++;
			}
			count3++;
			k++;
		}
		while(count3!=8);//计算星数是个几位数
		j=k-l;
		for(l=(k-l);l<(k+4);l++)
		{
		
			if(0x30<=rcv_buf[l]&&rcv_buf[l]<=0x39)
			{
				rcv_buf[l]=rcv_buf[l]-0x30;
			}
		}
		if(j==2)//如果是个位数,直接发过来
		{
			NUM=rcv_buf[k-2];
		}
		else if(j==3)//如果是个两位数,计算过后发过来
		{
			NUM=rcv_buf[k-3]*10+rcv_buf[k-2];
		}
		SendByte(NUM);
		l=0;k=0;
	
	}
		
	else if(rcv_buf[3]=='R')//如果收到的是$GPGGA桢数据,县找到$GPGGA桢数据再进行计算
	{
	   k=4;
		do
		{
			while(rcv_buf[k]!=0x2C)
			{
				k++;
			}
			count3++;
			k++;
		}
		while(count3!=12);//先找到$GPGGA数据标志
	if(rcv_buf[k+9]=='G')
	{
		k=k+10;
		count3=0;
		do
		{
			while(rcv_buf[k]!=0x2C)
			{
				k++;
			}
			count3++;
			k++;
		}
		while(count3!=7);
		l=k;
		do
		{
			while(rcv_buf[k]!=0x2C)
			{
				k++;
			}
			count3++;
			k++;
		}
		while(count3!=8);
		j=k-l;
		for(l=(k-l);l<(k+4);l++)
		{
		
			if(0x30<=rcv_buf[l]&&rcv_buf[l]<=0x39)
			{
				rcv_buf[l]=rcv_buf[l]-0x30;
			}
		}
		if(j==2)
		{
			NUM=rcv_buf[k-2];
		}
		else if(j==3)
		{
			NUM=rcv_buf[k-3]*10+rcv_buf[k-2];
		}
		SendByte(NUM);
		l=0;k=0;
	

}
}
}
/******************************************************/
//串口0初始化程序
//初始化波特率,奇偶校验等等
/******************************************************/
uint8  UART0_Ini(uint32 baud, UARTMODE set)
{  uint32  bak;
   
   /* 参数过滤 */
   if( (0==baud)||(baud>115200) ) return(0);
   if( (set.datab<5)||(set.datab>8) ) return(0);
   if( (0==set.stopb)||(set.stopb>2) ) return(0);
   if( set.parity>4 ) return(0);

   /* 设置串口波特率 */
   U0LCR = 0x80;                        // DLAB位置1
   bak = (Fpclk>>4)/baud;
   U0DLM = bak>>8;
   U0DLL = bak&0xff;
   
   /* 设置串口模式 */
   bak = set.datab-5;                   // 设置字长度
   if(2==set.stopb) bak |= 0x04;        // 判断是否为2位停止位  
   
   if(0!=set.parity) {set.parity = set.parity-1; bak |= 0x08;}
   bak |= set.parity<<4;              	// 设置奇偶校验
      
   U0LCR = bak;
   
   return(1);
}     
/*******************************                   
/****************************************************************************
* 名称:UART1_Ini()
* 功能:初始化串口1。设置其工作模式及波特率。
* 入口参数:baud                波特率
*          set          模式设置(UARTMODE数据结构)
* 出口参数:返回值为1时表示初化成功,为0表除参数出错
****************************************************************************/
uint8  UART1_Ini(uint32 baud, UARTMODE set)
{  uint32  bak;
   
   /* 参数过滤 */
   if( (0==baud)||(baud>115200) ) return(0);
   if( (set.datab<5)||(set.datab>8) ) return(0);
   if( (0==set.stopb)||(set.stopb>2) ) return(0);
   if( set.parity>4 ) return(0);

   /* 设置串口波特率 */
   U1LCR = 0x80;                        // DLAB位置1
   bak = (Fpclk>>4)/baud;
   U1DLM = bak>>8;
   U1DLL = bak&0xff;
   
   /* 设置串口模式 */
   bak = set.datab-5;                   // 设置字长度
   if(2==set.stopb) bak |= 0x04;        // 判断是否为2位停止位  
   
   if(0!=set.parity) {set.parity = set.parity-1; bak |= 0x08;}
   bak |= set.parity<<4;              	// 设置奇偶校验
      
   U1LCR = bak;
   
   return(1);
}

 
/****************************************************************************
* 名称:main()
* 功能:初始化串口,并等待接收到串口数据。
* 说明:在STARTUP.S文件中使能IRQ中断(清零CPSR中的I位)。
****************************************************************************/
int  main(void)
{  uint8     rcv_counter;
   UARTMODE  uart1_set;
   UARTMODE  uart0_set;
        
   PINSEL0 =((PINSEL0&0xfff0fff0)|0x00050005);                // 设置I/O连接到UART0
   PINSEL1 = 0x00000000;                
   rcv_new = 0;
   uart1_set.datab = 8;                 // 8位数据位
   uart1_set.stopb = 1;                 // 1位停止位
   uart1_set.parity = 0;                // 无奇偶校验
   uart0_set.datab = 8;                 // 8位数据位
   uart0_set.stopb = 1;                 // 1位停止位
   uart0_set.parity = 0;                // 无奇偶校验
   
   UART1_Ini(9600, uart1_set);        // 初始化串口模式
   UART0_Ini(115200, uart0_set);  
   
   U1FCR = 0x81;                        // 使能FIFO,并设置触发点为8字节
   U0FCR = 0x81;                        // 使能FIFO,并设置触发点为8字节
   U1IER = 0x01;                        // 允许RBR中断,即接收中断
   
   VICIntSelect = 0x00000000;           // 设置所有通道为IRQ中断
    VICVectCntl0 = 0x27;                 // UART1中断通道分配到IRQ slot 0,即优先级最高
   VICVectAddr0 = (int)IRQ_UART1;       // 设置UART1向量地址
   VICIntEnable = 0x00000080;           // 使能UART1中断
  
   while(1)                             // 等待中断
   { if(1==rcv_new)//判断接收到新数据了吗,如果是,就关掉中断开始将数据发送给上位机,如果不是继续判断
    {U1IER=0x00; 
     rcv_new = 0;
     IrcvgpsW();
     IrcvgpsJ();
     IrcvgpsL();
     IrcvgpsN();
//     ISendBuf();  
     count1=0;                   // 将接收到的数据发送回主机
	U1IER=0x01;
     }
   }
   return(0);
}

⌨️ 快捷键说明

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