LINUX.ORG.RU

Сообщения TITO

 

Инет приходит по ADSL, надо раздать в LAN по VPN железяка DSL-2650U.

В общем сейчас есть Интернет->адсл-модем->Комп(Opensuse 11.1+PPTPD+пара сетевых карт eth0,eth1)-> Сеть 1: Интернет получают клиенты Windows (стандартный VPN-клиент). Сеть 2: Интернет получают просто по LAN

Надо тоже самое, но на 1 железяке DSL-2650U rev.C1E у кого есть опыт подобного действа? Куда копать? Почитал про OpenWRT, там вроде пишут, что ADSL отваливается если делаешь WAN порт на модеме из LANa. В крайнем случае оставим ADSL-модем->DSL-2650U - > клиенты сети 1 и сети 2.

 dsl-2650,

TITO
()

Com-port странное поведение программы

Здравствуйте, уважаемые. Исходные данные, имеется некоторое устройство которое с частотой 10Гц посылает на компьютер пакет с данными (16 байт). Устройство подключено к ПК с помощью переходника USB to COM. Если программа, код который приведен ниже, стартует в первый раз после перезагрузки/включения, то она отрабатывает некорректно, то есть получается как будто пакеты приходят не с частотой 10Гц а к примеру 3, или 5 всегда по разному. А если выйти из программы после неудачного старта и снова ее запустить, то все работает как часы.

Теперь вопрос в чем может быть причина такого странного поведения? P/S opensuse 11.3, xfce, устройство подключено на юсб, на этот же комп подключена GPS Garmin LVC18 но на реальный физический ком-порт(может быть причина в прерываниях или еще в чем)

Программа: Функция инициализации ком порта

int opendevice(char* device, int speed)
{
  struct termios new;
  speed_t sspeed;
  int res = 0, fd = 0;
  
  if(( fd = open(device, O_RDWR | O_NDELAY | O_NOCTTY)) < 0){
    perror("Can not open device");    
    return -1;
  }
  
  switch(speed)
  {
    case 2400:
       sspeed = B2400;
       break;
    case 4800:
       sspeed = B4800;
       break;
    case 9600:
       sspeed = B9600;
       break;
    case 19200:
       sspeed = B19200;
       break;
    case 38400:
       sspeed = B38400;
       break;
    case 115200:
       sspeed = B115200;
       break;

  }
  memset (&new, 0, sizeof (new));
  cfmakeraw(&new);
  new.c_cflag &= ~PARENB; // disable parent bit
  new.c_cflag &= ~CSTOPB;// disable parent bit    
  new.c_cflag &= ~CSIZE; // 1 stop bit
  new.c_cflag |= CS8;     // 8bit data
  new.c_cflag |= CREAD;  // Enable Receiver 
  new.c_cflag |= CLOCAL; // Ignore modem control lines. 
  new.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
  new.c_oflag &= ~OPOST;
  //new.c_cc[VMIN] = 1;    // 1 simbols for read
  //new.c_cc[VTIME] = 1;    // Time of reading of 1 symbol  

  
  res = cfsetispeed(&new, sspeed); //baud rate 4800
  if (res<0){
    perror("Can not set input speed of device");
    fprintf(filelog,"FATAL ERROR: Can not set input speed of device %s. Time %s\n",device,ctime(&ftmcreated));
    return -1;
  };
 
  res = cfsetospeed(&new, sspeed);
  if (res<0){
    perror("Can not set output speed of device");
    fprintf(filelog,"FATAL ERROR: Can not set output speed of device %s. Time %s\n",device,ctime(&ftmcreated));
    return -1;
  };

    
  tcflush(fd, TCIOFLUSH); 
  res = tcsetattr(fd, TCSAFLUSH, &new); 
  if (res<0){
    perror("Can not set attribute to device");
    fprintf(filelog,"FATAL ERROR: Can not set attribute of device %s. Time %s\n",device,ctime(&ftmcreated));
    return -1;
  };
  return fd;
}.

Функция main

int main(int argc, char** argv)
{
  
  unsigned char chs,indx=0,filename[256], devname[256];
  unsigned char data[16];
  int speed = 4800,dmn;
  
  strcpy(devname, "/dev/ttyUSB0");
  
  filelog=fopen("/station/data/logfile.txt","a");    // создаем лог файл
  if(!filelog){
     printf("Cant create file with logs!\n");
     exit(1);
  }
  
  int c, fd;
  if (argc > 1) {    // открываем девайс
    while (1) {
      c = getopt (argc, argv, "d:s:h");
      if (c == -1)
    break;
      switch (c) {
      case '\0':
    fprintf(stderr,"Error: Unknown command ");
    print_help ();
    return -1;
    break;
      case 'h':
    print_help ();
     return 0;
    break;
      case 's':
    speed = atoi(optarg);
    break;
      case 'd':
    strcpy (devname, optarg);
    break;
      default:
    print_help ();
    return 0;
    break;
      }
    }
  }
  
  
  
    ////// Create files ////////////////
  (void) gettimeofday (&tmvl, NULL);    // получаем текущее время и дату в секундах от начала эпохи
  gmt = *gmtime(&tmvl.tv_sec);        // преобразовавыем его в структуру
  sprintf (filename, "%s/%4.4d%2.2d%2.2d%2.2d%2.2d.mvs",
      dir,
      gmt.tm_year + 1900,
      gmt.tm_mon + 1,
      gmt.tm_mday, gmt.tm_hour,gmt.tm_min);    // создаем имя файла с ткущей датой формат ГГГГММДДЧЧММ.mvs
  
  filedata=fopen(filename,"w");
  if(!filedata) fprintf(filelog,"Cant create data file with name %s! Time %s\n",filename,ctime(&ftmcreated));
     
  ftmcreated=tmvl.tv_sec;
  
  
  dmn=daemon(0,1);
  if(dmn<0){
    printf("MVS daemon not started!\n");
    fprintf(filelog,"MVS daemon not started! Time %s\n",devname,ctime(&ftmcreated));
    
    exit(1);
  }
  printf("MVS DAEMON STARTED\n Press ENTER\n");
  if( (fd = opendevice(devname, speed)) < 0) {
     fprintf(stderr,"FATAL ERROR: Can not open device %s\n",devname);
     fprintf(filelog,"FATAL ERROR: Can not open device %s. Time %s\n",devname,ctime(&ftmcreated));
     exit (1);
  }
 
 
  FILE *raw;
  raw=fopen("/station/data/raw.bin","w+b"); //debug
  FILE *dev;
  dev=fopen(devname,"r+b");
  while (1){
      chs=fgetc(dev);
      //fwrite(&chs,sizeof(char),1,raw);
      if((chs == 'C' ) && (indx == 0 )) {data[0]=chs; indx++;}    // sync 'C'
      if((chs == 'A' ) && (indx == 1 )) {data[1]=chs; indx++;}    // sync 'A'
      if((chs == 'D' ) && (indx == 2 )) {data[2]=chs; indx++;}    // sync 'D'
      if((chs == 'R' ) && (indx == 3 )) {data[3]=chs; indx++;}    // sync 'R'
      if((chs == 0x0 ) && (indx == 4 )) {data[4]=chs; indx++;}    // sync '0' channel 0
      if((data[0]=='C')&&(data[1]=='A')&&(data[2]=='D')&&(data[3]=='R')&&(data[4]==0x0)&&(indx>4)){
    data[indx-1] = chs;
    indx++;
    if((data[0]=='C')&&(data[1]=='A')&&(data[2]=='D')&&(data[3]=='R')&&(data[4]==0x0)&&(data[8]==0x1)&&(data[12]==0x2)&&(indx==17)){ // verify channel number
      //printf("INDX %d DATA %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x \n",indx,data[0],data[1],data[2],data[3],data[4],data[5],data[6],data[7],data[8],data[9],data[10],data[11],data[12],data[13],data[14],data[15]);
      crtfile(data,indx); - функция обработки полученных данных, в данном случае она не важна
      indx=0;
    }
    else{
      if(indx==17){
        //fprintf(filelog,"Sync corrupt CADR has %s\n",data);
        fwrite(data,sizeof(data),1,raw);
      }
    }
      }
  }
  
fclose (dev);
fclose (raw);
fclose (filedata);
fclose (filelog);
return 0;
}

TITO
()

C Оптимизация алгоритма чтение данных с компорта

Здравствуйте уважаемые. Я хочу попросить вас помочь мне в оптимизации моей программки для чтения данных с ком порта. На данный момент меня не устраивает сам алгоритм который я использую в программе для чтения, так как он использует циклы которые грузят процессор до 5-6% что является не оптимальным. Не могли бы вы мне помочь изменить алгоритм. Скорость ком порта 4800 режим 8N1 пакет состоит из 16 байт вида CADR01234567891011. Пакеты приходят каждые 0.1 секунд. У меня проблема в том чтобы оптимально собрать его(пакет) в массив с которым я мог бы дальше работать в программе. Если вы подскажете мне как это сделать, я буду вам очень благодарен.

Привожу текст моей программы:
Функция read_device (читает данные с ком порта)

char read_device(fd,ch) 
{
   unsigned char s[1];
   int nBytes;
   
   nBytes = read(fd, s, sizeof(s));
   if(nBytes>0){    // если прочитали нормальные данные то вернем их
      ch=s[0];
      return ch;
   }
   
   
   return 0; // иначе вернем 0
   
}

Main:

int main(int argc, char** argv)
{
  int speed = 4800,rBytes;
  unsigned char ch,devname[256];
  
  
  
  filelog=fopen("MVS_logfile.txt","w");    // создаем лог файл
  if(!filelog){
     printf("Cant create file with logs!\n");
     exit(1);
  }
  ////////////////////////////////////////////////
  strcpy(devname, "/dev/ttyUSB0");
 
  int c, fd, cfd;
  if (argc > 1) {    // открываем девайс
    while (1) {
      c = getopt (argc, argv, "d:s:");
      if (c == -1)
    break;
      switch (c) {
      case '\0':
    fprintf(stderr,"Error: Unknown command ");
    print_help ();
    return -1;
      case 'h':
    print_help ();
     return 0;
    break;
      case 's':
    speed = atoi(optarg);
    break;
      case 'd':
    strcpy (devname, optarg);
    break;
      default:
    print_help ();
    return 0;
      }
    }
  }
  set_signal ();
  if( (fd = opendevice(devname, speed)) < 0) {
    fprintf(stderr,"FATAL ERROR: Can not open %s\n",devname);
    exit(-1);
  }
  }
  
  
///////////// Start read device /////////////////////////////
  while((!stop))
  {
    ch=read_device(fd,ch); 
    
    if(ch=='R'){ // выбираем данные каналов из потока
      for(rBytes=0;rBytes<12;rBytes++){    // читаем 12 байт данных из потока
    ch=read_device(fd,ch);
    if(ch!=0)
      databuf[rBytes]=ch;        // если read_device вернула не 0, пишем байт в массив данных
    else{
      usleep(6200);                      // спим
      rBytes--;                              // вычитаем индекс массива так как 0 нам не нужен 
    }
      }
      
      crtfile(databuf,rBytes,&filelog); // функция обработки данных собранных в массив
    
     }
    
  }
  

  closedevice(fd);
  fclose(filelog);
   
  
  return 0;
}
Функции остановки программы
void
sig_handler (int sig)
{
  stop = 1;
}


void set_signal ()
{
  signal (SIGTERM, sig_handler);
  signal (SIGQUIT, sig_handler);
  signal (SIGKILL, sig_handler);
  signal (SIGINT, sig_handler);
  signal (SIGSTOP, sig_handler);
}
Настройки ком порта
int opendevice(char* device, int speed)
{
  struct termios new;
  speed_t sspeed;
  int res = 0, fd = 0;
  if(( fd = open(device, O_RDWR | O_NDELAY | O_NOCTTY)) < 0){
    perror("Can not open device");    
    return -1;
  }
  //ttyUSBx settings
  
         sspeed = B4800;

  memset (&new, 0, sizeof (new));
  cfmakeraw(&new);
  new.c_cflag &= ~PARENB; // parent bit
  new.c_cflag &= ~CSTOPB;
  new.c_cflag &= ~CSIZE; // 1 stop bit
  new.c_cflag  = CS8;     // 8bit data
  new.c_cflag |= CREAD;  // Enable Receiver 
  new.c_cflag |= CLOCAL; // Ignore modem control lines. 
  new.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
  new.c_oflag &= ~OPOST;
  new.c_cc[VMIN] = 1;    // 1 simbols for read
  new.c_cc[VTIME] = 1;    // Time of reading of 1 symbol  


  res = cfsetispeed(&new, sspeed); //baud rate 4800
  if (res<0){
    perror("Can not set speed of device");
    return -1;
  };
 
      
  tcflush(fd, TCIOFLUSH); 
  res = tcsetattr(fd, TCSAFLUSH, &new); 
  if (res<0){
    perror("Can not set attribute to device");
    return -1;
  };
  return fd;
}

TITO
()

RSS подписка на новые темы