<?xml version="1.0" encoding="koi8-r"?>
<rss version="0.91">
<channel>
    <title>OpenForum RSS: задержка при чтении COM-порта под Linux</title>
    <link>https://opennet.ru/openforum/vsluhforumID9/8327.html</link>
    <description>Добрый день! Есть девайс,подключенный к COM-порту. Протокол обмена таков: посылаем 2 байта вопроса и читаем 3 байта ответа. Осциллографом четко видны посылки к устройству и практически сразу же ответ, все вместе занимает приблизительно 0,5 мс, однако функция чтения read возвращает значение только через 10 мс! Подскажите, как ускорить этот процесс до 1мс?&lt;br&gt;Пример программы:&lt;br&gt;&lt;br&gt; char dev&#091;&#093; = &quot;/dev/ttyS0&quot;;&lt;br&gt; port=open(dev,O_RDWR &amp;#124; O_NDELAY &amp;#124; O_NOCTTY);&lt;br&gt; if (port==-1) &#123;&lt;br&gt;    printf(&quot;err: failed to open &quot;&quot;&#037;s&quot;&quot;!&quot;,dev);&lt;br&gt;    return 1;&lt;br&gt; &#125;&lt;br&gt;&lt;br&gt;  //если поставить этот кусок, то задержка уменьшается до 4 мс, но этого мало&lt;br&gt;  struct serial_struct ser;&lt;br&gt;  ioctl(port, TIOCGSERIAL, &amp;ser);&lt;br&gt;  ser.flags &amp;#124;= ASYNC_LOW_LATENCY;&lt;br&gt;  ioctl(port, TIOCSSERIAL, &amp;ser);&lt;br&gt;  &lt;br&gt;  //настройки порта таковы&lt;br&gt;  termios tinfo;&lt;br&gt;  fcntl(port,F_SETFL, 0); //ждать запрошенных данных&lt;br&gt;  tcgetattr(port,&amp;tinfo);&lt;br&gt;&lt;br&gt;  tinfo.c_cflag&amp;=~(CSIZE &amp;#124; CRTSCTS &amp;#124; CSTOPB);&lt;br&gt;  tinfo.c_cflag&amp;#124;=(CLOCAL &amp;#124; CREAD &amp;#124; CS8 &amp;#124; PAR</description>

<item>
    <title>задержка при чтении COM-порта под Linux (alex_x80)</title>
    <link>https://opennet.ru/openforum/vsluhforumID9/8327.html#2</link>
    <pubDate>Fri, 26 Jun 2009 07:56:03 GMT</pubDate>
    <description>&amp;gt;1А. Попробуйте использовать флаг O_NONBLOCK. Маловероятно, но может будет разница. &lt;br&gt;&amp;gt;port=open(dev,O_RDWR &amp;#124; O_NOCTTY &amp;#124; O_NONBLOCK); &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;1Б. Я бы еще добавил следующее: &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;tinfo.c_cc&#091;VMIN&#093;=1; &lt;br&gt;&amp;gt;tinfo.c_cc&#091;VTIME&#093;=0; &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;2. Попробуйте использовать чтение/запись в разных потоках. &lt;br&gt;&lt;br&gt;Пробовали с флагом O_NONBLOCK, варьировали параметры tinfo.c_cc, меняли размер буфера xmit_fifo_size - ничего не влияет. Единственное, что частично помогло, это на одном из имортных форумом кому-то в такой же ситуации посоветовали установить флаг ASYNCH_LOW_LATENCY. Есть подозрение, что такова особенность ОС Linux, и средствами стандартного драйвера более высокого быстродействия добиться невозможно. Если кто-то точно знает что это так - пожалуйста, отпишитесь.&lt;br&gt;</description>
</item>

<item>
    <title>задержка при чтении COM-порта под Linux (hold_fast_)</title>
    <link>https://opennet.ru/openforum/vsluhforumID9/8327.html#1</link>
    <pubDate>Fri, 26 Jun 2009 07:43:20 GMT</pubDate>
    <description>1А. Попробуйте использовать флаг O_NONBLOCK. Маловероятно, но может будет разница.&lt;br&gt;port=open(dev,O_RDWR &amp;#124; O_NOCTTY &amp;#124; O_NONBLOCK);&lt;br&gt;&lt;br&gt;1Б. Я бы еще добавил следующее:&lt;br&gt;&lt;br&gt;tinfo.c_cc&#091;VMIN&#093;=1;&lt;br&gt;tinfo.c_cc&#091;VTIME&#093;=0;&lt;br&gt;&lt;br&gt;2. Попробуйте использовать чтение/запись в разных потоках.&lt;br&gt;</description>
</item>

</channel>
</rss>
