Hello everybody!
Ситауция следующая: имеем программу, программа открывает /dev/ttyUSB0
с флагом O_RDWR - можно как записывать, так и читать. В программе два параллельных потока - один раз в 3 секунды записывать текстовыю строку
в открытый дескриптор, другой считывает оттуда присланную строку
ПОБАЙТО внешним устройством тогда, когда сможет и выводит на экран. Проблема в том, что во входные данные попадает часть того, что пишется
в дескриптор, причем независимо от времени. Пробовал защищать
дескриптор мютексом - не помогло, мусорные данные все равно попадают
на вход (кстати, нужные данные при этом тоже считываются). Пробовал ставить флаг O_DSYNC - тоже не помогло. Мозможно, нужно очищать буфер (какой и как?) сразу после отправки строки. В потоках буферы
используются разные - для каждого потока свой. Имею ввиду очистку выходного буфера, который пишет write. ЧЯДТ? Куда копать?
Ситауция следующая: имеем программу, программа открывает /dev/ttyUSB0 с флагом
O_RDWR - можно как записывать, так и читать. В программе два параллельных потока
- один раз в 3 секунды записывать текстовыю строку в открытый дескриптор, другой
считывает оттуда присланную строку ПОБАЙТHО внешним устройством тогда, когда
сможет и выводит на экран. Проблема в том, что во входные данные попадает часть
того, что пишется в дескриптор, причем независимо от времени. Пробовал защищать
дескриптор мютексом - не помогло, мусорные данные все равно попадают на вход
(кстати, нужные данные при этом тоже считываются). Пробовал ставить флаг O_DSYNC
- тоже не помогло. Мозможно, нужно очищать буфер (какой и как?) сразу после
отправки строки. В потоках буферы используются разные - для каждого потока свой.
Имею ввиду очистку выходного буфера, который пишет write. ЧЯДHТ? Куда копать?
буферы используются разные - для каждого потока свой. Имею ввидуЛично я открываю так, и у меня всё работает как ожидается: InputFd=open(SerDevice, O_RDWR | O_NOCTTY | O_SYNC );
очистку выходного буфера, который пишет write. ЧЯДТ? Куда копать?
очистку выходного буфера, который пишет write. ЧЯДHТ? КудаПохоже на то, что у устройства, подключенного через USB,
копать?
включено эхо ввода. И ему надо его выключить.
У старых аналоговых модемов такое было и у других устройств
с terminal line discipline тоже.
Что за устройство?
* Origin: ua9ov[at]dxsoft.com http://www.dxsoft.com (2:5000/28)
буферы используются разные - для каждого потока свой. Имею ввиду
очистку выходного буфера, который пишет write. ЧЯДТ? Куда
копать?
Лично я открываю так, и у меня всё работает как ожидается:Спасибо! Про O_NOCTTY не дочитал видимо, попробую!
InputFd=open(SerDevice, O_RDWR | O_NOCTTY | O_SYNC );
очистку выходного буфера, который пишет write. ЧЯДHТ? Куда
копать?
Похоже на то, что у устройства, подключенного через USB,Пролифик PL2303 (( других у нас на работе нет, увы. HО(!) пробовал с CP2102 и
включено эхо ввода. И ему надо его выключить.
У старых аналоговых модемов такое было и у других устройств
с terminal line discipline тоже.
Что за устройство?
FT232R - тоже самое.
очистку выходного буфера, который пишет write. ЧЯДHТ? Куда
копать?
Похоже на то, что у устройства, подключенного через USB,
включено эхо ввода. И ему надо его выключить.
У старых аналоговых модемов такое было и у других устройств
с terminal line discipline тоже.
Что за устройство?
Пролифик PL2303 (( других у нас на работе нет, увы. HО(!) пробовал с CP2102 и
FT232R - тоже самое.
Так это всё переходники для USB/COM, с этого надо было начинать.
Для COM-портов существует куча настроен драйвер терминала
с вышеупомянутой serial line discipline и первым делом
надо читать man stty и выставлять драйверу верные настройки линии
через stty. Вторым делом смотреть устройство, подключенное на этой
линии, оно тоже может дублировать вывод, как это делали модемы,
если им не запретить.
У старых аналоговых модемов такое было и у других устройств
с terminal line discipline тоже.
Что за устройство?
Пролифик PL2303 (( других у нас на работе нет, увы. HО(!)Так это всё переходники для USB/COM, с этого надо было начинать.
пробовал с CP2102 и FT232R - тоже самое.
Для COM-портов существует куча настроен драйвер терминала
с вышеупомянутой serial line discipline и первым делом
надо читать man stty и выставлять драйверу верные настройки линии
через stty. Вторым делом смотреть устройство, подключенное на этой
линии, оно тоже может дублировать вывод, как это делали модемы,
если им не запретить.
Вот все как раз именно так ) Сначала скрипт запускает stty с
настройками, затем уже запускается само приложение.
Вот все как раз именно так ) Сначала скрипт запускает stty сА зачем такой бутерброд?
настройками, затем уже запускается само приложение.
Почему в самой программе не настроить?
Sysop: | Angel Ripoll |
---|---|
Location: | Madrid, Spain |
Users: | 11 |
Nodes: | 8 (0 / 8) |
Uptime: | 112:54:11 |
Calls: | 483 |
Files: | 14,095 |
Messages: | 66,250 |