Задержка при чтении COM-порта в Linux

Тема в разделе "WASM.UNIX", создана пользователем alex_x80, 26 июн 2009.

  1. alex_x80

    alex_x80 New Member

    Публикаций:
    0
    Регистрация:
    26 июн 2009
    Сообщения:
    3
    Добрый день! Есть девайс,подключенный к COM-порту. Протокол обмена таков: посылаем 2 байта вопроса и читаем 3 байта ответа. Осциллографом четко видны посылки к устройству и практически сразу же ответ, все вместе занимает приблизительно 0,5 мс, однако функция чтения read возвращает значение только через 10 мс! Подскажите, как ускорить этот процесс до 1мс?
    Пример программы:

    char dev[] = "/dev/ttyS0";
    port=open(dev,O_RDWR | O_NDELAY | O_NOCTTY); // флаг O_NONBLOCK тоже пробовали
    if (port==-1) {
    printf("err: failed to open ""%s""!",dev);
    return 1;
    }

    //если поставить этот кусок, то задержка уменьшается до 4 мс, но этого мало
    struct serial_struct ser;
    ioctl(port, TIOCGSERIAL, &ser);
    ser.flags |= ASYNC_LOW_LATENCY;
    ioctl(port, TIOCSSERIAL, &ser);

    //настройки порта таковы
    termios tinfo;
    fcntl(port,F_SETFL, 0); //ждать запрошенных данных
    tcgetattr(port,&tinfo);

    tinfo.c_cflag&=~(CSIZE | CRTSCTS | CSTOPB);
    tinfo.c_cflag|=(CLOCAL | CREAD | CS8 | PARENB | CBAUD);
    tinfo.c_iflag&=~(ISTRIP | IXON | IXOFF | IXANY | IGNBRK | BRKINT | PARMRK | INLCR | IGNCR | ICRNL);
    tinfo.c_iflag|=(INPCK);
    tinfo.c_oflag&=~OPOST;
    tinfo.c_lflag&=~(ICANON | ECHO | ECHONL | ECHOE | ISIG | IEXTEN);

    cfsetospeed(&tinfo,B115200);
    cfsetispeed(&tinfo,B115200);
    tcflush(port,TCIFLUSH);
    tcsetattr(port,TCSANOW,&tinfo);

    //собственно главный цикл, который выполняется 10 мс
    char bufO[2]={10,10};
    char buf[20];
    while(1)
    { write(port,bufO,2);
    read(port,buf,3);
    }

    Если поставить чтение без задержки fcntl(port,F_SETFL, FNDELAY), а использовать другие механизмы (через select, либо читать в цикле пока не наберется 3 байта) - результат один и тот же: цикл выполняется недопустимо медленно. Хотя под Windows XP аналогичная программа опрашивает данное устройство около 1 мс!
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Запости еще 6 тем. Когда меньше 9 постишь - обычно не отвечают