nickita startcev (nicka_startcev) wrote,
nickita startcev
nicka_startcev

linux, gcc, select()

Что-то торможу.
вроде всё делаю по мануалу, а селект() не дожидается данных и/или не видит их.
реально данные (ответ) полностью приходят примерно через 150мс после отправки команды.
если вместо всего этого селекта тупо прождать более 150мс -- данные на месте, если меньше - то не все на месте.

код:
#include <stdio.h>
#include <unistd.h>
#include <termios.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <errno.h>
#include <stdlib.h>
#include <sys/time.h>
#include <sys/types.h>

int main(void)
{
  int fd, serial;
  int n;
  char tmp[256];
  fd_set rfds;
  struct timeval tv;
  int retval;

  fd = open("/dev/ttyUSB0", O_RDWR|O_NDELAY|O_NOCTTY);

  if(fd < 0)
  {
    puts("can't open fd");
  }

  ioctl(fd, TIOCMGET, &serial);
  if (serial & TIOCM_DTR)
    puts("TIOCM_DTR is not set");
  else
    puts("TIOCM_DTR is set");

  FD_ZERO(&rfds);
  FD_SET(fd, &rfds);
   /* Wait up to five seconds. */
  tv.tv_sec = 5;
  tv.tv_usec = 0;

  n=write(fd,"U: ",3);

  printf("put %i bytes to port\n",n);

  retval = select(1, &rfds, NULL, NULL, &tv);
    /* Don't rely on the value of tv now! */
  if (retval == -1)
    perror("select()");
  else if (retval)
    printf("Data is available now.\n");
    /* FD_ISSET(0, &rfds) will be true. */
  else
    printf("No data within five seconds.\n");

  n=read(fd,tmp,255);
  if(n < 0)
  {
    printf("Err=`%s`\n",strerror(errno));
  }else
  {
    tmp[n]=0;
    printf("get %i bytes from port\n",n);
    printf("data=`%s`\n",tmp);
  }
  close(fd);
}


выхлоп:
./a.out
TIOCM_DTR is not set
put 3 bytes to port
No data within five seconds.
get 12 bytes from port

data=`OK
POS_OK
`
Tags: linux, uart
Subscribe

  • (no subject)

    если подумать, если с нуля при современных возможностях спроектировать а не по мелочи подпатчить, то очень многое в жизни станет резко дешевле и…

  • а вот я бы, если бы был вчера таким умным как ?? сегодня..

    а вот любопытно. допустим, вы попали в на 20-30-40-50 лет назад. помните-знаете про пейсбук, ютуб, жж и прочие блоги. как бы вы описали тенденции и…

  • электрофобийное

    внезапно, я боюсь стандартного напряжения 220/240в. осмысленно боюсь. оно неприятно бьёт и рикошетит дергающимися мышцами. итого, при любом…

  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 20 comments

  • (no subject)

    если подумать, если с нуля при современных возможностях спроектировать а не по мелочи подпатчить, то очень многое в жизни станет резко дешевле и…

  • а вот я бы, если бы был вчера таким умным как ?? сегодня..

    а вот любопытно. допустим, вы попали в на 20-30-40-50 лет назад. помните-знаете про пейсбук, ютуб, жж и прочие блоги. как бы вы описали тенденции и…

  • электрофобийное

    внезапно, я боюсь стандартного напряжения 220/240в. осмысленно боюсь. оно неприятно бьёт и рикошетит дергающимися мышцами. итого, при любом…