Модераторы: xvr

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> С++ в Linux и RS485 работа с протоколом, Работа с протоколом 
:(
    Опции темы
hente
Дата 20.3.2009, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 20.3.2009
Где: Томск

Репутация: нет
Всего: нет



Добрый день уважаемые...
Проблема в следующем: не могу записать на порт RS-485
под Linux пишу прогу:

Код


int f;
f=open("/dev/ttyS1",<флаги открытия>)

int Str=444;

write(f,Str,sizeof(Str));  // работает
read(f,Str,sizeof(Str));  // не работает

close (f);


Под виндой смотрю данные из программы Terminal. 

так вот write работает нармально сообщения уходят, а вот read ну никак не хочет:(((
даже не знаю чо делать....

По идее надо переключить режим чтение запись а как это сделать?
Гугля ничего путевого не дала.... а сам не знаю куда смотреть...

За ранее благодаренsmile)за ранее спасибо...

--------------------
  долой быдло кодеров!!!
PM MAIL   Вверх
GrayCardinal
Дата 20.3.2009, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 8
Всего: 58



Цитата

а вот read ну никак не хочет

Извини, но лично я не врубаюсь, как оно должно "работать"  smile

Добавлено через 2 минуты и 36 секунд
Цитата

int Str

меня убило  smile 

Это сообщение отредактировал(а) GrayCardinal - 20.3.2009, 14:53


--------------------
PM MAIL WWW   Вверх
hente
Дата 20.3.2009, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 20.3.2009
Где: Томск

Репутация: нет
Всего: нет



Сорри брал не из исходника по этому синт. ошибки ...

Код


int f;
f=open("/dev/ttyS1",<флаги открытия>)

int Str=444;

write(f,&Str,sizeof(Str));  // работает
read(f,&Str,sizeof(Str));  // не работает

close (f);




--------------------
  долой быдло кодеров!!!
PM MAIL   Вверх
GrayCardinal
Дата 20.3.2009, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 8
Всего: 58



hente
После read воткни perror и скажи результат...


--------------------
PM MAIL WWW   Вверх
hente
Дата 20.3.2009, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 20.3.2009
Где: Томск

Репутация: нет
Всего: нет



На Read просто останавливается и никаких ошибок нет...
Я так понял идет ожидание появления данных порте или как...
Если поставить в опен Open флаг O_NOCTTY тогда Read возвращает 0

Это сообщение отредактировал(а) hente - 20.3.2009, 16:06
--------------------
  долой быдло кодеров!!!
PM MAIL   Вверх
kurtis
Дата 20.3.2009, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 10.8.2007

Репутация: нет
Всего: нет



А как у Вас происходит переключение режима Прием/Передача (направление передачи) ? Обычно схематически RS-485 представляет собой 2 линии связи и 3-я линия для управления потоком передачи. Возможно для переключения режима нужно "дергать" пин DTS ком-порта. А как это делается в драйвере Linux это уже читайте документацию вроде Serial HOW-TO или что-то подобное.
PM MAIL   Вверх
hente
Дата 20.3.2009, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 20.3.2009
Где: Томск

Репутация: нет
Всего: нет



Да вот в том то и проблема что никак...

В документациях в примерах никакого переключателя я так и не нашел..
Да и сам пример откуда брал там тож ничего такого нет, просто подряд идут write и read.
Щас еще раз попробую прогуглить мож чо полуиться....

но если есть варианты решения проблемы то буду очень рад, да и так спс smile))

Добавлено через 59 секунд
к стате как я понял то у RS485 всего 2 канала а не 3
--------------------
  долой быдло кодеров!!!
PM MAIL   Вверх
kurtis
Дата 20.3.2009, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 10.8.2007

Репутация: нет
Всего: нет



Цитата(hente @ 20.3.2009,  15:55)
к стате как я понял то у RS485 всего 2 канала а не 3

Ну как бы интерфейс считается 2-х проводным, но по факту обычно еще требуется иметь общие земляные потенциалы между абонентами, так что земля может считаться 3-м проводом, но это на важно, я говорил немного не про это.
В RS-485 ключевым моментом является переключения направление передачи. В RS485 все устройства делятся на master и slave. Соответственно мастер передает, а слейв слушает и если его спросят, он отвечает. Для избежания мусора на линии используется переключение направление передачи, т.к. мастер изначально становиться на передачу, слейвы становятся на прием и слушают свой адрес для ответа, когда мастер заканчивает передачу, он становиться на прием и начинает слушать кто и что ответит. Слейв который услышал свой адрес, становиться на передачу и отвечает, после ответа он снова становиться на прием, а мастер становиться на передачу. Управление направлением передачи осуществляется программно.

Как вы работаете с RS-485 ? Через КОМ-порт (RS-232) или у вас какая-то плата расширения (USB, PCI) ?
Что такое /dev/ttyS1 ? Покажите вывод "setserial -a /det/ttyS1"
PM MAIL   Вверх
hente
Дата 21.3.2009, 07:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 20.3.2009
Где: Томск

Репутация: нет
Всего: нет



на одноплатной ЭВМ (на физическом уровне)джемперами COM2 выставил на RS485
принцип работы то я понял а вот как программно работать хз.

к стате если воспользоваться утилиткой cat, то ситация такая:
при вводе 

Код

X#  cat >/dev/ttyS1
<вводим любые данные>

то на другом конце RS485 (под виндой) данные приходят без проблем все в норме

если ввести
Код

X#  cat /dev/ttyS1
<ждем прихода сигнала>

то на другом конце RS485 (под виндой) данные отсылая
под Linux ничего не приходит... в документациях никак не могу найти переключение режима чтения записи


Код

setserial выдает:
UART 16550A, port 0x02f8, irq 3



к стате под виндой я уже говорил использую Terminal прогу
и там соединение идет через переходник USB->RS485 (+дрова там всяки)

/dev/ttyS1 - это устройство 

Это сообщение отредактировал(а) hente - 21.3.2009, 07:26
--------------------
  долой быдло кодеров!!!
PM MAIL   Вверх
hente
Дата 21.3.2009, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 20.3.2009
Где: Томск

Репутация: нет
Всего: нет



 smile Люди добрые так может кто-нибуть посоветует что либо? уже 4 дня на одном месте топчусь не знаю что делать.... Поисковики ваще бред выдают .... Может есть какие-либо другие технологии...

Тут подкинули идею: отслеживать прерывания ну и читать определенные регистры...
А вот как отловить эти прервания, бог его знает...

Хотя всяко данная проблема решается очень легко а вот по какому пути идти.... smile 
--------------------
  долой быдло кодеров!!!
PM MAIL   Вверх
xvr
Дата 23.3.2009, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



Цитата(hente @ 21.3.2009,  07:24)
на одноплатной ЭВМ (на физическом уровне)джемперами COM2 выставил на RS485

Марку этой 'одноплатной ЭВМ' - в студию!

Цитата

к стате под виндой я уже говорил использую Terminal прогу
и там соединение идет через переходник USB->RS485 (+дрова там всяки)
А с этой стороны направление как переключается? Terminal может быть не в курсе  smile 

PM MAIL   Вверх
hente
Дата 24.3.2009, 06:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 20.3.2009
Где: Томск

Репутация: нет
Всего: нет



Код

Марку этой 'одноплатной ЭВМ' - в студию!


PCE-5120G2

Код

А с этой стороны направление как переключается? Terminal может быть не в курсе


terminal автоматом стоит на приеме...т.е. надо разобраться только с линуксом...

К стате многомерными пробами и ошибками нашел такую чтуку как RTS (под линуксом) вроде данные начали отправляться и приниматься вот тока не полностью...smile)) пару байтов теряется не могу понять в чом дело...но все это дело пока работает нга низком уровне (функции inb,oub,insb,uotsb) а хотелось бы просто работать с функциями write read...
--------------------
  долой быдло кодеров!!!
PM MAIL   Вверх
xvr
Дата 24.3.2009, 09:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



Цитата(hente @ 24.3.2009,  06:31)
Код

Марку этой 'одноплатной ЭВМ' - в студию!


PCE-5120G2

Хм, действительно не описанно, как переключать направление

Цитата

Код

А с этой стороны направление как переключается? Terminal может быть не в курсе

terminal автоматом стоит на приеме...т.е. надо разобраться только с линуксом...
Автоматом, пулеметом  smile 
Цитата

К стате многомерными пробами и ошибками нашел такую чтуку как RTS (под линуксом)
 Угу, один из стандартных вариантов пешения
Цитата

вроде данные начали отправляться и приниматься вот тока не полностью...smile)) пару байтов теряется не могу понять в чом дело...
Дело в том, что RS485 - полудуплексная шина, а RS232 - полнодуплексная. И для того, что бы преобразовать одно в другое не хватает 1го сигнала - направление передачи. Решают это по разному, либо делают RS485 всегда на прием, а когда обнаруживают, что RS232 что то передает, то переключают на передачу (у вас это сделано на PC). Обратное переключение происходит по timeout'у. Недостаток - нужна задержка после передачи последнего байта, иначе RS485 может не успеть переключиться на прием
Второй вариант - переключение ногой в интерфейсе RS232 (RTS в вашем случае). Недостаток - надо ловить окончание передачи (физическое) байтов из RS232 и только потом переключаться на прием. Дело усложняется тем, что передаваемые данные буферизуются в железе (FIFO). Дело еще более усложняется тем, что у чипа RS232 нет прерывания по опустошению передающего регистра (IMHO) (есть только по готовности принять следующий байт для передачи, что не одно и тоже). Так что для отлова момента переключения RTS надо непрерывно читать регистр состояния передатчика  smile 

Цитата

но все это дело пока работает нга низком уровне (функции inb,oub,insb,uotsb) а хотелось бы просто работать с функциями write read...
До RTS можно добраться через ioctl, а вот для решения вышеобозначенных проблем - увы только драйвер

Кстати, последствия полудуплекса RS485 - одновременный прием и передача невозможны, только по очереди.

PM MAIL   Вверх
hente
Дата 24.3.2009, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 20.3.2009
Где: Томск

Репутация: нет
Всего: нет




Код

а когда обнаруживают, что RS232 что то передает, то переключают на передачу


xvr - на конце у меня собственно не rs232 а переходник USB->RS485 (все эт под win)

а что такое CRS? 

переключать то я научился а вот read все равно колом встает при отправке не зависимо в каком положении RTS cстоит не подскажете в чем дело?
--------------------
  долой быдло кодеров!!!
PM MAIL   Вверх
xvr
Дата 24.3.2009, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



Цитата(hente @ 24.3.2009,  11:57)
Код

а когда обнаруживают, что RS232 что то передает, то переключают на передачу


xvr - на конце у меня собственно не rs232 а переходник USB->RS485 (все эт под win)

Это не имеет значения - там такой же автосвитчер для переключения направления (ну может чуть поумнее и делать паузы после отправки ему не надо)
Цитата

а что такое CRS? 
А это вообще откуда?

Цитата

переключать то я научился а вот read все равно колом встает при отправке не зависимо в каком положении RTS cстоит не подскажете в чем дело?
Для начала надо убедится что PC действительно что то передает (осциллографом например). Потом надо смотреть, в чем стоит RTS и сколько просили прочесть от read.

PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.1836 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.