|
#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采集应该不至一秒采集一次吧 模块就是你们配合开发板的模块 |
|