天嵌 ARM开发社区

 找回密码
 注册
查看: 2435|回复: 13

gps模块

[复制链接]
cxs05741018 发表于 2010-9-25 10:46:11 | 显示全部楼层 |阅读模式
我买了配套GPS模块 写了个读取经纬度的 程序 打印出来结果大约一秒打印一次 正常吗 GPS数据采集1秒才一次吗? 还有GPS模块信号经常收不到 能应用到实际产品中吗
machoe 发表于 2010-9-25 12:42:04 | 显示全部楼层
你用的是GR-87吗?其实不是1S一次的,实时输出多种格式的信息,你可以直接将其模块通过232电平转换后,连电脑上,你就明白了
 楼主| cxs05741018 发表于 2010-9-25 21:27:23 | 显示全部楼层
谢谢版主回答 不过我没弄明白 我的模块怎么连到电脑上 需要配电平转换模块吗 ,我现在测试程序就是把读到的所有数据各种格式都打印出来,结果还是停顿了1秒这样打印接下来内容。还有义个问题 我串口设置 不设置成按照行读取的话,每次只能读8个字符  本来翔设置 最少接收字符 但 读取的数据长度又不确定 我怎么能确保一次读取指定的数据
machoe 发表于 2010-9-26 07:57:59 | 显示全部楼层
如果你用的是GR87的话,肯定是要电平转换的,因为GR-87模块输出是5V的。你自己焊一个232,转一下就可以了,这时候你可以打开一人GPS的软件,就能看见他的所有输出了。不过不同的模块,输出肯定是不一样的,大同小异,我只用过GR-87,别的没有用过。就不大清楚了。
machoe 发表于 2010-9-26 08:01:04 | 显示全部楼层
至于你的串口设置的问题,你用的是TQ2440还是别的?2440串口有一个FIFO,其实你的意思我明白了,这和设置成多少个字符是没有关系的,如果你想把读到的东西全打印出来,我只在写一个死循环,在死循环里面一直打印出读到的东西就可以了。至于为什么一秒一次,应该是你的GPS模块的问题,不知道你用的是什么模块。
 楼主| cxs05741018 发表于 2010-9-27 11:33:29 | 显示全部楼层
斑竹你好,关于串口打印的问题我的意思是这样的 我已经在循环读数据了while((nread=read(fd,buf,sizeof(buf))>0){printf( %s\n,buf );}我的BUF设置成512,结果每次printf总是8位8位输出
..............
..............
...............
buf 一次只能接受8个啊
我的串口是设置成原始模式了 .
machoe 发表于 2010-9-27 12:06:18 | 显示全部楼层
正因为是原始模式 ,所有才只有8位,和BUF无关的。
天嵌_support1 发表于 2010-9-27 12:11:43 | 显示全部楼层
咱们的超级版主对GPS很有见地性啊
 楼主| cxs05741018 发表于 2010-9-27 12:23:35 | 显示全部楼层
那请问怎么样才能读出所有数据
machoe 发表于 2010-9-27 13:20:46 | 显示全部楼层
其实我对GP理解得也不是特别深,只是做过一次课题。如果你想一次性读出更多的数据,按我说的方法试试。
1.对GPS的控制,我用的是串口控制命令的,输入命令设置其波特率,想要提取的内容,打开其串口;
2.CPU的控制,如果你用的是TQ2440,使能其串口FIFO,如果没记错的话,应该是64Byte的。
这个主要是你的GPS模块的控制,不知道你用的是哪种的?
 楼主| cxs05741018 发表于 2010-9-27 16:46:48 | 显示全部楼层
10# machoe


斑竹能否加下QQ 605945442 可能这样表达不太清楚
 楼主| cxs05741018 发表于 2010-9-27 20:53:56 | 显示全部楼层
版主谢谢你热心回答 你说要势能串口FIFO 那还要条用IO口驱动 设置。。。。还有我现在接收就是经常接收还不到8个字节
 楼主| cxs05741018 发表于 2010-9-27 21:32:23 | 显示全部楼层
#define DEVICE_PORT "/dev/tq2440_serial1"
//FILE *fp;                                       //记录文件描述符
/*  GPRMC                   */
typedef struct gps_info
{
  char utc_time[30];                             //UTC时间,hhmmss.sss(时分秒.毫秒)格式
  char status;                                    //定位状态,A=有效定位,V无效定位
  float latitude_value;                            //纬度ddmm.mmmm(度分)格式(前面的0也将被传输)
  char latitude;                                      //纬度半球N(北半球)S(南半球)
  float  longtitude_value;                                //经度dddmm.mmmm
  char  longtitude;                                     //经度半球E东经 W西经  
  float speed;                                           //地面素率(000.0~999.9节)
  float  azimuth_angle;                                   //地面导航(000.0~359.9度,以正北为参考基准)
  char  utc_data[30];                                   //UTC日期 ddmmyy(日年月格式)
  float declination;                                    //偏磁角(000.0~180.0度)
  char  dectude;                                        //偏此角方相E动W西
}GPS_INFO1;

GPS_INFO1 GPS_INFO;

/*    设置端口                           */
int set_opt(int fd,int nSpeed,int nBits,char nEvent,int nStop)
{
  struct termios newtio,oldtio;
/* 取得现有串口属性                 */
if(tcgetattr(fd,&oldtio)!=0)
{
perror("SetupSerial 1");
return -1;
}
bzero(&newtio,sizeof(newtio));
newtio.c_lflag|=ICANON;  //设置成规范模式 以行读取
/*  原始模式                   */
/*newtio.c_iflag &=~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON);
newtio.c_oflag &=~OPOST;
newtio.c_lflag &=~(ECHO|ECHONL|ICANON|ISIG|IEXTEN);*/
/*设置字符大小             */
newtio.c_cflag |= CLOCAL |CREAD;
newtio.c_cflag &= ~CSIZE;

/*    设置数据位      */
switch(nBits)
{
case 7:
    newtio.c_cflag |=CS7; break;
case 8:
    newtio.c_cflag |=CS8; break;
}
/*    设置 奇偶校验位                */
switch(nEvent)
{
case 'O':
       newtio.c_cflag |=PARENB;
       newtio.c_cflag |=PARODD;
       newtio.c_iflag|=INPCK ;
       break;
case 'E':
       newtio.c_iflag |= INPCK ;
       newtio.c_cflag |= PARENB;
       newtio.c_cflag &=~PARODD;
       break;
case 'N':
      newtio.c_cflag &= ~PARENB;
      break;
}
/* 设置数据波特率 cfsetispeed()输入波特率 cfsetospeed()输出波特率          */
switch(nSpeed)
{
case 2400:
        cfsetispeed(&newtio,B2400);
        cfsetospeed(&newtio,B2400);
        break;
case 4800:
        cfsetispeed(&newtio,B4800);
        cfsetospeed(&newtio,B4800);
        break;
case 9600:
        cfsetispeed(&newtio,B9600);
        cfsetospeed(&newtio,B9600);
        break;
case 115200:
        cfsetispeed(&newtio,B115200);
        cfsetospeed(&newtio,B115200);
        break;
defult:
        cfsetispeed(&newtio,B115200);
        cfsetospeed(&newtio,B115200);
        break;
}
/*  设置停止位*/
if(nStop==1)
  newtio.c_cflag &= ~CSTOPB;
else if(nStop==2)
newtio.c_cflag |= CSTOPB;
/*   设置等待时间和接收最小字符      */
newtio.c_cc[VTIME]=0;
newtio.c_cc[VMIN]=0;
/*  处理未接收字符          */
tcflush(fd,TCIFLUSH);
/* 激活新配置          */
if((tcsetattr(fd,TCSANOW,&newtio))!=0)
{
perror("come set error");
return -1;
}
printf("set done\n");
return 0;
}


/*   打开串口                    */
int open_port(int fd)
{
fd =open(DEVICE_PORT,O_RDWR|O_NOCTTY|O_NDELAY);
if(fd==-1)
{
  perror("open");
exit(1);
}
/* 恢复串口为阻塞状态   */
if(fcntl(fd,F_SETFL,0)<0)
printf("fcntl failed!\n");
else
  printf("fcntl=%d\n",fcntl(fd,F_SETFL,0));
/*   测试是否为终端设备                       */
if(isatty(STDIN_FILENO)==0)
        printf("standard input is not a terminal device\n");
else
        printf("isatty sucess!\n");
printf("fd-open=%d\n",fd);
return fd;
}

/* 读串口                  */
void read_port(int fd)
{
int nread;
char buff[512];
fd_set rd;
FD_ZERO(&rd);
FD_SET(fd,&rd);
while(FD_ISSET(fd,&rd))
{
if(select(fd+1,&rd,NULL,NULL,NULL)<0)
{
perror("select");
exit(1);
}
else {

while((nread=read(fd,buff,512))>0)
{//buff[nread]='\0';
  char *p;
  int n,num=0;

if((p=strstr(buff,"$GPRMC"))!=NULL)
  {
        for(n=0;n<strlen(p);n++)
        {
                if(p[n]='\n')
                        p[n]='\0';
        }         
sscanf(p,"$GPRMC,%*[^,],%*c,%f,%*c,%f,%*c",&GPS_INFO1.latitude_value,&GPS_INFO1.longtitude_value);
printf("%f %f\n",GPS_INFO.latitude_value,GPS_INFO1.longtitude_value);

}
}
}
}

}

int main()
{
int fd;
int i;

if((fd=open_port(fd))<0)
{
perror("open");
exit(1);
}
if(i=set_opt(fd,9600,8,'N',1)<0)
{
perror("set_opt error");
exit(1);
}

read_port(fd);
  
}

这是义个GPS测试 提取经纬度程序 结果打印经纬信息老是停顿一秒打一次  请问正常吗 程序有错误吗 原本我一位串口信息应该一直刷刷的打印下来 GPS采集应该不至一秒采集一次吧  模块就是你们配合开发板的模块
 楼主| cxs05741018 发表于 2010-9-27 21:34:17 | 显示全部楼层
问题很多阿 希望版主有空能给我耐心解答下 谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号-2 )

GMT+8, 2024-9-18 04:27 , Processed in 1.039102 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表