📄 dataret.c
字号:
/****************************************************************************
* 文件名: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 + -