linux的cs架构c语言,C语言解码GPS--实现篇

#include/*标准输入输出定义*/

#include/*标准函数库定义*/

#include/*Unix 标准函数定义*/

#include

#include

#include

#include

#include

#include

//#define  dev  "/dev/ttyS0"

#define  BUFF_SIZE 512

#define  MAX_COM_NUM 3

intSectionID=0,i=0;

struct data

{

char GPS_time[20];          //UTC时间

char GPS_sv;               //使用卫星

char GPS_wd[12];           //纬度

char GPS_jd[12];           //经度

//char GPS_warn;             //定位警告

char GPS_speed[5];         //速度

char GPS_date[8];          //UTC日期

}GPS_DATA;

int set_com_config(int fd,int baud_rate,int data_bits,char parity,int stop_bits)

{

struct termios new_cfg,old_cfg;

int speed;

//保存并测试现有串口参数设置,在这里如果串口号出错,会有相关的出错信息

if(tcgetattr(fd,&old_cfg)!=0)

{

perror("tcgetattr");

return -1;

}

tcflush(fd, TCIOFLUSH);

new_cfg=old_cfg;

cfmakeraw(&new_cfg);//配置为原始模式

new_cfg.c_cflag&=~CSIZE;

//设置波特率

switch(baud_rate)

{

case 2400:

{

speed=B2400;

break;

}

case 4800:

{

speed=B4800;

break;

}

case 9600:

{

speed=B9600;

break;

}

case 19200:

{

speed=B19200;

break;

}

case 38400:

{

speed=B38400;

break;

}

case 115200:

{

speed=B115200;

break;

}

}

cfsetispeed(&new_cfg,speed);

cfsetospeed(&new_cfg,speed);

//设置数据位

switch(data_bits)

{

case 7:

{

new_cfg.c_cflag|=CS7;

break;

}

case 8:

{

new_cfg.c_cflag|=CS8;

break;

}

}

//设置停止位

switch(stop_bits)

{

case 1:

{

new_cfg.c_cflag &=~CSTOPB;

break;

}

case 2:

{

new_cfg.c_cflag |=CSTOPB;

break;

}

}

//设置奇偶校验位

switch(parity)

{

case 'o':

case 'O':

{

new_cfg.c_cflag|=(PARODD|PARENB);

new_cfg.c_iflag|=(INPCK |ISTRIP);

break;

}

case 'e':

case 'E':

{

new_cfg.c_cflag |=PARENB;

new_cfg.c_cflag &=~PARODD;

new_cfg.c_iflag |=(INPCK | ISTRIP);

break;

}

case 's':

case 'S':

{

new_cfg.c_cflag &=~PARENB;

new_cfg.c_cflag &=~CSTOPB;

break;

}

case 'n':

case 'N':

{

new_cfg.c_cflag &=~PARENB;

new_cfg.c_iflag &=~INPCK;

break;

}

}

new_cfg.c_cc[VTIME] =10;

new_cfg.c_cc[VMIN] =5;

//处理未接收字符

tcflush(fd,TCIFLUSH);

if((tcsetattr(fd,TCSANOW,&new_cfg))!=0)

{

perror("tcsetattr");

return -1;

}

return 0;

}

//打开串口函数

int open_port(int com_port)

{

int fd;

#if (COM_TYPE== GNR_COM)  //使用普通串口

char* dev[] = {"/dev/ttyS0","/dev/ttyS1","/dev/ttyS2"};

#else//使用USB转串口

char* dev[] = {"/dev/ttyUSB0","/dev/ttyUSB1","/dev/ttyUSB2"};

#endif

if((com_port<0)||(com_port>MAX_COM_NUM))

{

return -1;

}

//打开串口

if((fd=open(dev[com_port-1],O_RDWR|O_NOCTTY|O_NDELAY))<0)

{

perror("open serial port");

return -1;

}

//恢复串口为堵塞状态

if(fcntl(fd,F_SETFL,0)<0)

{

perror("fcntl F_SETFL\n");

return -1;

}

//测试是否为终端设备

if(isatty(STDIN_FILENO)==0)

{

perror("standard input is not a terminal device");

}

return fd;

}

void print_info(void)

{

//打印选择界面,即引导的字符号

printf("Now the receive time is %s\n",GPS_DATA.GPS_time);

printf("The star is %c 3\n",GPS_DATA.GPS_sv);

printf("The earth latitude is :%s\n",GPS_DATA.GPS_wd);

printf("The earth longitude is :%s\n",GPS_DATA.GPS_jd);

printf("The train speed is:%s km/h\n",GPS_DATA.GPS_speed);

printf("The date is:%s\n",GPS_DATA.GPS_date);

}

void GPS_resolve_GPRMC(char data)

{

//$GPRMC,092427.604,V,4002.1531,N,11618.3097,E,0.000,0.00,280812,,E,N*08

if(data==',')

{

++SectionID;

i=0;

}

else

{

switch(SectionID)

{

case 1://02:48:13

GPS_DATA.GPS_time[i++]=data;

if(i==2 ||i==5)

{

GPS_DATA.GPS_time[i++]=':';

}

GPS_DATA.GPS_time[8]='\0';

break;

case 2:

if(data=='A')

GPS_DATA.GPS_sv='>';

else

GPS_DATA.GPS_sv='

break;

case 3://3158.4608

GPS_DATA.GPS_wd[++i]=data;

GPS_DATA.GPS_wd[12]='\0';

break;

case 4:

if(data=='N')

GPS_DATA.GPS_wd[0]='N';

else if(data=='S')

GPS_DATA.GPS_wd[0]='S';

break;

case 5://11848.3737,E

GPS_DATA.GPS_jd[++i]=data;

GPS_DATA.GPS_jd[12]='\0';

break;

case 6:

if(data=='E')

GPS_DATA.GPS_jd[0]='E';

else if(data=='W')

GPS_DATA.GPS_jd[0]='W';

break;

case 7://10.05

GPS_DATA.GPS_speed[i++]=data;

GPS_DATA.GPS_speed[4]='\0';

break;

case 9://15-07-06 ->06-07-15

GPS_DATA.GPS_date[i++]=data;

if(i==2 ||i==5)

{

GPS_DATA.GPS_date[i++]='-';

}

GPS_DATA.GPS_date[8]='\0';

break;

}

}

}

void read_data(int fd)

{

char buffer[BUFF_SIZE],dest[1024];

char array[10]="$GPRMC";

int  res,i=0,j=0,k;

intdata=1,len=0;

memset(dest,0,sizeof(dest));

do

{

memset(buffer,0,sizeof(buffer));

//$GPRMC,024813.640,A,3158.4608,N,11848.3737,E,10.05,324.27,150706,,,A*50

if(res=read(fd,buffer,1)>0)

{

//此处源源不断传入参数,一次读到数据可能为($GPRMC,024),res为读到长度,现在把每一位传入函数处理;

strcat(dest,buffer);

if(buffer[0]=='\n')

{

i=0;

if(strncmp(dest,array,6)==0)

{

printf("%s",dest);

len=strlen(dest);

for(k=0;k

{

GPS_resolve_GPRMC(dest[k]);

}

SectionID=0;

print_info();

}

bzero(dest,sizeof(dest));

}

}

}while(1);

close(fd);

}

int main(int argc,char*argv[])

{

intfd=0;

intHOST_COM_PORT=1;

fd=open_port(HOST_COM_PORT);

if(fd<0)

{

perror("open fail!");

}

printf("open sucess!\n");

if((set_com_config(fd,9600,8,'N',1))<0)

{

perror("set_com_config fail!\n");

}

printf("The received worlds are:\n");

read_data(fd);

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值