![]() |
Непонятки с read и write
Denis Sovkov написал(а) к All в Nov 23 22:02:08 по местному времени:
Нello everybody! Ситауция следующая: имеем программу, программа открывает /dev/ttyUSB0 с флагом O[b]RDWR - можно как записывать, так и читать. В программе два параллельных потока - один раз в 3 секунды записывать текстовыю строку в открытый дескриптор, другой считывает оттуда присланную строку ПОБАЙТНО внешним устройством тогда, когда сможет и выводит на экран. Проблема в том, что во входные данные попадает часть того, что пишется в дескриптор, причем независимо от времени. Пробовал защищать дескриптор мютексом - не помогло, мусорные данные все равно попадают на вход (кстати, нужные данные при этом тоже считываются). Пробовал ставить флаг O[/b]DSYNC - тоже не помогло. Мозможно, нужно очищать буфер (какой и как?) сразу после отправки строки. В потоках буферы используются разные - для каждого потока свой. Имею ввиду очистку выходного буфера, который пишет write. ЧЯДНТ? Куда копать? Denis --- GoldED+/LNX 1.1.5-b20180707 |
Непонятки с read и write
Sergei Podstrigailo написал(а) к Denis Sovkov в Nov 23 10:03:22 по местному времени:
Нello Denis! 29 Nov 23 22:02, Denis Sovkov wrote to All: DS> Нello everybody! DS> Ситауция следующая: имеем программу, программа открывает /dev/ttyUSB0 DS> с флагом O_RDWR - можно как записывать, так и читать. В программе два DS> параллельных потока - один раз в 3 секунды записывать текстовыю строку DS> в открытый дескриптор, другой считывает оттуда присланную строку DS> ПОБАЙТО внешним устройством тогда, когда сможет и выводит на экран. DS> Проблема в том, что во входные данные попадает часть того, что пишется DS> в дескриптор, причем независимо от времени. Пробовал защищать DS> дескриптор мютексом - не помогло, мусорные данные все равно попадают DS> на вход (кстати, нужные данные при этом тоже считываются). Пробовал DS> ставить флаг O_DSYNC - тоже не помогло. Мозможно, нужно очищать буфер DS> (какой и как?) сразу после отправки строки. В потоках буферы DS> используются разные - для каждого потока свой. Имею ввиду очистку DS> выходного буфера, который пишет write. ЧЯДТ? Куда копать? Лично я открываю так, и у меня всё работает как ожидается: InputFd=open(SerDevice, O[b]RDWR | O_NOCTTY | O[/b]SYNC ); Sergei --- GoldED/W32 3.0.1 |
Re: Непонятки с read и write
Eugene Grosbein написал(а) к Denis Sovkov в Nov 23 12:10:31 по местному времени:
29 нояб. 2023, среда, в 22:02 NOVT, Denis Sovkov написал(а): DS> Ситауция следующая: имеем программу, программа открывает /dev/ttyUSB0 с флагом DS> O_RDWR - можно как записывать, так и читать. В программе два параллельных потока DS> - один раз в 3 секунды записывать текстовыю строку в открытый дескриптор, другой DS> считывает оттуда присланную строку ПОБАЙТНО внешним устройством тогда, когда DS> сможет и выводит на экран. Проблема в том, что во входные данные попадает часть DS> того, что пишется в дескриптор, причем независимо от времени. Пробовал защищать DS> дескриптор мютексом - не помогло, мусорные данные все равно попадают на вход DS> (кстати, нужные данные при этом тоже считываются). Пробовал ставить флаг O_DSYNC DS> - тоже не помогло. Мозможно, нужно очищать буфер (какой и как?) сразу после DS> отправки строки. В потоках буферы используются разные - для каждого потока свой. DS> Имею ввиду очистку выходного буфера, который пишет write. ЧЯДНТ? Куда копать? Похоже на то, что у устройства, подключенного через USB, включено эхо ввода. И ему надо его выключить. У старых аналоговых модемов такое было и у других устройств с terminal line discipline тоже. Что за устройство? Eugene --- slrn/1.0.3 (FreeBSD) |
Непонятки с read и write
Denis Sovkov написал(а) к Sergei Podstrigailo в Nov 23 14:41:38 по местному времени:
Нello Sergei! 30 Nov 23 10:03, you wrote to me: DS>> буферы используются разные - для каждого потока свой. Имею ввиду DS>> очистку выходного буфера, который пишет write. ЧЯДТ? Куда копать? SP> Лично я открываю так, и у меня всё работает как ожидается: SP> InputFd=open(SerDevice, O[b]RDWR | O_NOCTTY | O[/b]SYNC ); Спасибо! Про O_NOCTTY не дочитал видимо, попробую! Denis --- GoldED+/LNX 1.1.5-b20180707 |
Непонятки с read и write
Denis Sovkov написал(а) к Eugene Grosbein в Nov 23 14:42:18 по местному времени:
Нello Eugene! 30 Nov 23 12:10, you wrote to me: DS>> очистку выходного буфера, который пишет write. ЧЯДНТ? Куда DS>> копать? EG> Похоже на то, что у устройства, подключенного через USB, EG> включено эхо ввода. И ему надо его выключить. EG> У старых аналоговых модемов такое было и у других устройств EG> с terminal line discipline тоже. EG> Что за устройство? Пролифик PL2303 (( других у нас на работе нет, увы. НО(!) пробовал с CP2102 и FT232R - тоже самое. Denis --- GoldED+/LNX 1.1.5-b20180707 |
Непонятки с read и write
Denis Sovkov написал(а) к Sergei Podstrigailo в Nov 23 14:50:34 по местному времени:
* Replying to a msg in CARBONZ (My personal EchoMail) Нello Sergei! 30 Nov 23 10:03, you wrote to me: SP> * Origin: ua9ov[at]dxsoft.com [url]http://www.dxsoft.com[/url] (2:5000/28) О как! не сразу обнаружил! de R2AIV 73! --- GoldED+/LNX 1.1.5-b20180707 |
Непонятки с read и write
Denis Sovkov написал(а) к Denis Sovkov в Nov 23 17:37:20 по местному времени:
Нello Denis! 30 Nov 23 14:41, I wrote to Sergei Podstrigailo: DS>>> буферы используются разные - для каждого потока свой. Имею ввиду DS>>> очистку выходного буфера, который пишет write. ЧЯДТ? Куда DS>>> копать? SP>> Лично я открываю так, и у меня всё работает как ожидается: SP>> InputFd=open(SerDevice, O[b]RDWR | O_NOCTTY | O[/b]SYNC ); DS> Спасибо! Про O_NOCTTY не дочитал видимо, попробую! Вобщем, добавил в open O_NOCTTY и в stty добавить -echo при настройке порта и все поехало! Спасибо! Буду дальше ковыряться... Denis --- GoldED+/LNX 1.1.5-b20180707 |
Re: Непонятки с read и write
Eugene Grosbein написал(а) к Denis Sovkov в Dec 23 13:51:01 по местному времени:
30 нояб. 2023, четверг, в 14:42 NOVT, Denis Sovkov написал(а): DS>>> очистку выходного буфера, который пишет write. ЧЯДНТ? Куда DS>>> копать? EG>> Похоже на то, что у устройства, подключенного через USB, EG>> включено эхо ввода. И ему надо его выключить. EG>> У старых аналоговых модемов такое было и у других устройств EG>> с terminal line discipline тоже. EG>> Что за устройство? DS> Пролифик PL2303 (( других у нас на работе нет, увы. НО(!) пробовал с CP2102 и DS> FT232R - тоже самое. Так это всё переходники для USB/COM, с этого надо было начинать. Для COM-портов существует куча настроен драйвер терминала с вышеупомянутой serial line discipline и первым делом надо читать man stty и выставлять драйверу верные настройки линии через stty. Вторым делом смотреть устройство, подключенное на этой линии, оно тоже может дублировать вывод, как это делали модемы, если им не запретить. Eugene --- slrn/1.0.3 (FreeBSD) |
Re: Непонятки с read и write
Eugene Grosbein написал(а) к All в Dec 23 13:51:50 по местному времени:
02 дек. 2023, суббота, в 13:51 NOVT, Eugene Grosbein написал(а): DS>>>> очистку выходного буфера, который пишет write. ЧЯДНТ? Куда DS>>>> копать? EG>>> Похоже на то, что у устройства, подключенного через USB, EG>>> включено эхо ввода. И ему надо его выключить. EG>>> У старых аналоговых модемов такое было и у других устройств EG>>> с terminal line discipline тоже. EG>>> Что за устройство? DS>> Пролифик PL2303 (( других у нас на работе нет, увы. НО(!) пробовал с CP2102 и DS>> FT232R - тоже самое. EG> Так это всё переходники для USB/COM, с этого надо было начинать. EG> Для COM-портов существует куча настроен драйвер терминала *куча настроке драйвера терминала EG> с вышеупомянутой serial line discipline и первым делом EG> надо читать man stty и выставлять драйверу верные настройки линии EG> через stty. Вторым делом смотреть устройство, подключенное на этой EG> линии, оно тоже может дублировать вывод, как это делали модемы, EG> если им не запретить. Eugene -- Поэты - страшные люди. У них все святое. --- slrn/1.0.3 (FreeBSD) |
Непонятки с read и write
Denis Sovkov написал(а) к Eugene Grosbein в Dec 23 16:09:52 по местному времени:
* Replying to a msg in CARBONZ (My personal EchoMail) Нello Eugene! 02 Dec 23 13:51, you wrote to me: EG>>> У старых аналоговых модемов такое было и у других устройств EG>>> с terminal line discipline тоже. EG>>> Что за устройство? DS>> Пролифик PL2303 (( других у нас на работе нет, увы. НО(!) DS>> пробовал с CP2102 и FT232R - тоже самое. EG> Так это всё переходники для USB/COM, с этого надо было начинать. EG> Для COM-портов существует куча настроен драйвер терминала EG> с вышеупомянутой serial line discipline и первым делом EG> надо читать man stty и выставлять драйверу верные настройки линии EG> через stty. Вторым делом смотреть устройство, подключенное на этой EG> линии, оно тоже может дублировать вывод, как это делали модемы, EG> если им не запретить. Вот все как раз именно так ) Сначала скрипт запускает stty с настройками, затем уже запускается само приложение. Запрет эхо, конечно, присутствует )) Теперь с другой проблемой воюю - ncurses с многопоточкой не особо дружит, ну и ладно. Denis --- GoldED+/LNX 1.1.5-b20180707 |
Непонятки с read и write
Sergei Podstrigailo написал(а) к Denis Sovkov в Dec 23 05:54:54 по местному времени:
Нello Denis! 02 Dec 23 16:09, Denis Sovkov wrote to Eugene Grosbein: DS> Вот все как раз именно так ) Сначала скрипт запускает stty с DS> настройками, затем уже запускается само приложение. А зачем такой бутерброд? Почему в самой программе не настроить? === Cut === int OpenSerialDevice(void) // 0 - успех { InputFd=open(SerDevice, O[b]RDWR | O_NOCTTY | O[/b]SYNC ); if(InputFd<0) return 1; struct termios tty; memset (&tty, 0, sizeof(tty)); if (tcgetattr (InputFd, &tty) != 0) return 2; cfmakeraw(&tty); // наверно, этого и достаточно, остальные флаги можно и не // править руками... cfsetospeed (&tty, SpeedVal); cfsetispeed (&tty, SpeedVal); tty.c_iflag |= IGNBRK; tty.c_iflag &= ~IGNPAR; tty.c_iflag &= ~PARMRK; tty.c_iflag &= ~INLCR; tty.c_iflag &= ~IGNCR; tty.c_iflag &= ~ICRNL; tty.c_iflag &= ~(IXON | IXOFF | IXANY); tty.c_lflag = 0; tty.c_oflag = 0; tty.c_cc[VMIN] = 0; // no blocking tty.c_cc[VTIME] = 0; // read timeout tty.c[b]cflag = (tty.c[/b]cflag & ~CSIZE) | CS8; // 8-bit chars tty.c_cflag |= (CLOCAL | CREAD);// do not parse control while reading tty.c_cflag &= ~(PARENB | PARODD); tty.c_cflag &= ~CSTOPB; tty.c_cflag &= ~CRTSCTS; if (tcsetattr (InputFd, TCSANOW, &tty) != 0) return 3; return 0; } === Cut === Sergei --- GoldED/W32 3.0.1 |
Непонятки с read и write
Denis Sovkov написал(а) к Sergei Podstrigailo в Dec 23 19:37:00 по местному времени:
* Replying to a msg in CARBONZ (My personal EchoMail) Нello Sergei! 03 Dec 23 05:54, you wrote to me: DS>> Вот все как раз именно так ) Сначала скрипт запускает stty с DS>> настройками, затем уже запускается само приложение. SP> А зачем такой бутерброд? SP> Почему в самой программе не настроить? Тестирую же-ж )) Спасибо за код! Читал про это на Хабре. Попробую! Denis --- GoldED+/LNX 1.1.5-b20180707 |
Текущее время: 19:09. Часовой пояс GMT +4. |
Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2025, vBulletin Solutions, Inc. Перевод: zCarot