gps test

#include <unistd.h>
#include <stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include <termios.h>

#define FALSE  -1
#define TRUE   0
/**
 *@brief   設置串口數據位,停止位和效驗位
 *@param  fd     類型  int  打開的串口文件句柄
 *@param  databits 類型  int 數據位   取值 爲 7 或者8
 *@param  stopbits 類型  int 停止位   取值爲 1 或者2
 *@param  parity  類型  int  效驗類型 取值爲N,E,O,,S
 */
int set_Parity(int fd,int databits,int stopbits,int parity)
{
  struct termios options;
  if  ( tcgetattr( fd,&options)  !=  0) {
    perror("SetupSerial 1");    
    return(FALSE); 
  }
  options.c_cflag &= ~CSIZE;
  switch (databits) /*設置數據位數*/
    {  
    case 7:              
      options.c_cflag |= CS7;
      break;
    case 8:    
      options.c_cflag |= CS8;
      break;  
    default:  
      fprintf(stderr,"Unsupported data size\n"); return (FALSE); 
    }
  switch (parity)
    {  
    case 'n':
    case 'N':  
      options.c_cflag &= ~PARENB;   /* Clear parity enable */
      options.c_iflag &= ~INPCK;     /* Enable parity checking */
      break; 
    case 'o':  
    case 'O':    
      options.c_cflag |= (PARODD | PARENB); /* 設置爲奇效驗*/ 
      options.c_iflag |= INPCK;             /* Disnable parity checking */
      break; 
    case 'e': 
    case 'E':  
      options.c_cflag |= PARENB;     /* Enable parity */  
      options.c_cflag &= ~PARODD;   /* 轉換爲偶效驗*/    
      options.c_iflag |= INPCK;       /* Disnable parity checking */
      break;
    case 'S':
    case 's':  /*as no parity*/  
      options.c_cflag &= ~PARENB;
      options.c_cflag &= ~CSTOPB;break; 
    default:  
      fprintf(stderr,"Unsupported parity\n");  
      return (FALSE); 
    } 
  /* 設置停止位*/ 
  switch (stopbits)
    {  
    case 1:  
      options.c_cflag &= ~CSTOPB; 
      break; 
    case 2:  
      options.c_cflag |= CSTOPB; 
      break;
    default:  
      fprintf(stderr,"Unsupported stop bits\n"); 
      return (FALSE);
    }
  /* Set input parity option */
  if (parity != 'n')  
    options.c_iflag |= INPCK;
  tcflush(fd,TCIFLUSH);
  options.c_cc[VTIME] = 150; /* 設置超時15 seconds*/  
  options.c_cc[VMIN] = 0; /* Update the options and do it NOW */
  if (tcsetattr(fd,TCSANOW,&options) != 0)  
    {
      perror("SetupSerial 3");  
      return (FALSE); 
    }
  return (TRUE); 
}
/*    **
    *@brief  設置串口通信速率
    *@param  fd     類型 int  打開串口的文件句柄
    *@param  speed  類型 int  串口速度
    *@return  void
    */
    int speed_arr[] = { B38400, B19200, B9600, B4800, B2400, B1200, B300,
            B38400, B19200, B9600, B4800, B2400, B1200, B300, };
int name_arr[] = {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);  
    } 
  }
}

int OpenDev(char *Dev)
{
  int        fd = open( Dev, O_RDWR );         //| O_NOCTTY | O_NDELAY       
  if (-1 == fd)       
    {                       
      perror("Can't Open Serial Port");
      return -1;              
    }       
  else       
    return fd;
}

int main(){
  int i,n,z=2,rtn;
  int nGPSCount = 0;
  char cGPSbuf[1024];
  char *cmd[5]={"AT+ZGINIT\r\n","AT+ZGMODE=3\r\n","AT+ZGQOS=50,255\r\n","AT+ZGFIXRATE=2147483647,0\r\n","AT+ZGRUN=2\r\n"};
  char *devw  = "/dev/ttyUSB2";

  int fd,count=100,ret=-1;
  int nread;
  char buff[512];
  char *p;
  char *dev  = "/dev/ttyUSB1";

//----------------------
  fd = OpenDev(devw);
  set_speed(fd,9600);
  if (set_Parity(fd,8,1,'N') == FALSE)  {
    printf("Set Parity Error\n");
    return ret;
  }
 
   n= sizeof(cmd)/sizeof(char*);
   printf("n:%d\n",n);
   for(i=0;i<n;i++){
     if(write(fd, cmd[i], strlen(cmd[i])) <= 0)
     {
       fprintf(stdout, "Write AT cmd Error!\n");
       return -1;
     }
     usleep(50);
     nGPSCount = read (fd, cGPSbuf, 512);
    
     printf("nGPSCount:%d\n",nGPSCount);

     if(nGPSCount==-1){close (fd);printf("return;");return -1;}

     if(nGPSCount>0){
       cGPSbuf[nGPSCount+1]='\0';
       printf("cGPSbuf:%s\n",cGPSbuf);
     }
   }
  close (fd);
  printf("-------------------------\n");
//----------------------

  fd = OpenDev(dev);
  set_speed(fd,9600);
  if (set_Parity(fd,8,1,'N') == FALSE)  {
    printf("Set Parity Error\n");
    return ret;
  }
  while (count--) //循環讀取數據
    {
      if(ret == 0)break;
      while((nread = read(fd, buff, 512))>0)
        {
      printf("\nLen %d\n",nread);
      buff[nread+1] = '\0';  
      printf( "\n%s", buff);
          p=strchr(buff,'$');
       if(p){  
            ret=0;
            break;
      }
        }
    }
  close(fd); 
  return ret;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章