#1
|
|||
|
|||
Непонятки с read и write
Denis Sovkov написал(а) к All в Nov 23 22:02:08 по местному времени:
Нello everybody! Ситауция следующая: имеем программу, программа открывает /dev/ttyUSB0 с флагом ORDWR - можно как записывать, так и читать. В программе два параллельных потока - один раз в 3 секунды записывать текстовыю строку в открытый дескриптор, другой считывает оттуда присланную строку ПОБАЙТНО внешним устройством тогда, когда сможет и выводит на экран. Проблема в том, что во входные данные попадает часть того, что пишется в дескриптор, причем независимо от времени. Пробовал защищать дескриптор мютексом - не помогло, мусорные данные все равно попадают на вход (кстати, нужные данные при этом тоже считываются). Пробовал ставить флаг ODSYNC - тоже не помогло. Мозможно, нужно очищать буфер (какой и как?) сразу после отправки строки. В потоках буферы используются разные - для каждого потока свой. Имею ввиду очистку выходного буфера, который пишет write. ЧЯДНТ? Куда копать? Denis --- GoldED+/LNX 1.1.5-b20180707 |
#2
|
|||
|
|||
Непонятки с 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, ORDWR | O_NOCTTY | OSYNC ); Sergei --- GoldED/W32 3.0.1 |
#3
|
|||
|
|||
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) |
#4
|
|||
|
|||
Непонятки с 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, ORDWR | O_NOCTTY | OSYNC ); Спасибо! Про O_NOCTTY не дочитал видимо, попробую! Denis --- GoldED+/LNX 1.1.5-b20180707 |
#5
|
|||
|
|||
Непонятки с 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 |
#6
|
|||
|
|||
Непонятки с 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 http://www.dxsoft.com (2:5000/28) О как! не сразу обнаружил! de R2AIV 73! --- GoldED+/LNX 1.1.5-b20180707 |
#7
|
|||
|
|||
Непонятки с 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, ORDWR | O_NOCTTY | OSYNC ); DS> Спасибо! Про O_NOCTTY не дочитал видимо, попробую! Вобщем, добавил в open O_NOCTTY и в stty добавить -echo при настройке порта и все поехало! Спасибо! Буду дальше ковыряться... Denis --- GoldED+/LNX 1.1.5-b20180707 |
#8
|
|||
|
|||
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) |
#9
|
|||
|
|||
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) |
#10
|
|||
|
|||
Непонятки с 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 |