linux c gps 接收程序,Linux下串口GPS数据接收程序

#include #include #include #include #include #include #include //如果不添加,printf,exit等会警告参数不匹配等

#include

void set_speed(int, int);

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

{

int fd,result,wr_num=0,rd_num=0,z=1,buff_num;

struct termios term_param;//串口通信参数结构体

speed_t baud_rate_i,baud_rate_o;        //无符号整数类型

char buff[100],read_buf[1];

//打开串口 (根据实际情况修改串口设备名)

fd=open("/dev/s3c2410_serial1",O_RDWR|O_NONBLOCK);

if(!fd){//打开串口失败

perror("syd168:Can't open the COM1!\n");

exit(-1);

}

else

printf("syd168:Open COM1 ok!\n");

//获取打开串口的参数

result=tcgetattr(fd,&term_param); //取得原配置参数

if(result==-1){

perror("syd168:Get param error!\n");

exit(-1);

}

baud_rate_i=cfgetispeed(&term_param);//读取输入速度

baud_rate_o=cfgetospeed(&term_param);//读取发送速度

printf("初始:输入波特率是%d,输出波特率是%d,文件描述符是%d\n",baud_rate_i,baud_rate_o,fd);

set_speed(fd,4800);

result=tcgetattr(fd,&term_param);

if(result==-1){

perror("syd168:Set param error!\n");

exit(-1);

}

baud_rate_i=cfgetispeed(&term_param);

baud_rate_o=cfgetospeed(&term_param);

printf("设置后:输入波特率是%d,输出波特率是%d,文件描述符是%d\n",baud_rate_i,baud_rate_o,fd);

buff_num=0;//缓存中字符数为0

printf("syd168:Receive....\n");

while(1)

{

//接收一个字符

rd_num=read(fd,read_buf,sizeof(read_buf));

if(rd_num>0){   //接收到字符

/*收到字符直接输出

printf("%c",read_buf[0]);

continue;

*/

if(read_buf[0]=='$'){//如果该字符是$

if(buff[0]=='$'&&buff_num>0){//一个GPS信号接收已经完成,处理接受的GPS信息(打印)

int j=0;

while(j//清除缓存和缓存计数,继续接受GPS信号

buff_num=0;

memset(buff,0,sizeof(buff));

}

buff[buff_num++]=read_buf[0];//记录GPS信息开始符

goto delay;     //延时1秒钟

}

else{ //接收到非$字符

if(buff[0]=='$')//已经存在首字符,则添加后续字符

buff[buff_num++]=read_buf[0];

continue;//如果开头的$不存在,放弃该字符

}

}

else{

//printf("Receive....\n");

continue;

}

delay:

sleep(1);

}

}

int speed_arr[] = {B115200,B38400, B19200, B9600, B4800, B2400, B1200, B300,

B38400, B19200, B9600, B4800, B2400, B1200, B300, };

int name_arr[] = {115200,38400, 19200, 9600, 4800, 2400, 1200, 300, 38400,

19200, 9600, 4800, 2400, 1200, 300, };

void set_speed(int fd, int speed){

int   i;

int   status;

struct termios   Opt;

tcgetattr(fd, &Opt);

for ( i= 0; i < sizeof(speed_arr) / sizeof(int); i++) {

if (speed == name_arr[i]) {

tcflush(fd, TCIOFLUSH);

cfsetispeed(&Opt, speed_arr[i]);

cfsetospeed(&Opt, speed_arr[i]);

status = tcsetattr(fd, TCSANOW, &Opt);

if (status != 0) {

perror("tcsetattr fd1");

return;

}

tcflush(fd,TCIOFLUSH);

}

}

}

=================采集数据举例===========================

Receive....

$GPGGA,003841.000,3604.9074,N,10427.3777,E,2,06,1.5,107.1,M,-14.7,M,2.8,0000*50

$GPRMC,003841.000,A,3604.9074,N,10427.3777,E,0.00,201.43,180211,,,D*65

$GPVTG,201.43,T,,M,0.00,N,0.0,K,D*0C

$GPGGA,003842.000,3604.9074,N,10427.3777,E,2,06,1.5,107.1,M,-14.7,M,1.8,0000*50

$GPGSV,3,1,12,04,69,352,19,10,61,194,23,17,51,116,25,02,45,285,15*7F

$GPRMC,003842.000,A,3604.9074,N,10427.3777,E,0.00,201.43,180211,,,D*66

阅读(365) | 评论(0) | 转发(0) |

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值