|
Модераторы: xvr |
|
hente |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 116 Регистрация: 20.3.2009 Где: Томск Репутация: нет Всего: нет |
Добрый день уважаемые...
Проблема в следующем: не могу записать на порт RS-485 под Linux пишу прогу:
Под виндой смотрю данные из программы Terminal. так вот write работает нармально сообщения уходят, а вот read ну никак не хочет:((( даже не знаю чо делать.... По идее надо переключить режим чтение запись а как это сделать? Гугля ничего путевого не дала.... а сам не знаю куда смотреть... За ранее благодарен)за ранее спасибо... --------------------
долой быдло кодеров!!! |
|||
|
||||
GrayCardinal |
|
||||
Фигасе Профиль Группа: Завсегдатай Сообщений: 3039 Регистрация: 9.11.2003 Репутация: 8 Всего: 58 |
Извини, но лично я не врубаюсь, как оно должно "работать" Добавлено через 2 минуты и 36 секунд
меня убило Это сообщение отредактировал(а) GrayCardinal - 20.3.2009, 14:53 |
||||
|
|||||
hente |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 116 Регистрация: 20.3.2009 Где: Томск Репутация: нет Всего: нет |
Сорри брал не из исходника по этому синт. ошибки ...
--------------------
долой быдло кодеров!!! |
|||
|
||||
GrayCardinal |
|
|||
Фигасе Профиль Группа: Завсегдатай Сообщений: 3039 Регистрация: 9.11.2003 Репутация: 8 Всего: 58 |
hente,
После read воткни perror и скажи результат... |
|||
|
||||
hente |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 116 Регистрация: 20.3.2009 Где: Томск Репутация: нет Всего: нет |
На Read просто останавливается и никаких ошибок нет...
Я так понял идет ожидание появления данных порте или как... Если поставить в опен Open флаг O_NOCTTY тогда Read возвращает 0 Это сообщение отредактировал(а) hente - 20.3.2009, 16:06 --------------------
долой быдло кодеров!!! |
|||
|
||||
kurtis |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 65 Регистрация: 10.8.2007 Репутация: нет Всего: нет |
А как у Вас происходит переключение режима Прием/Передача (направление передачи) ? Обычно схематически RS-485 представляет собой 2 линии связи и 3-я линия для управления потоком передачи. Возможно для переключения режима нужно "дергать" пин DTS ком-порта. А как это делается в драйвере Linux это уже читайте документацию вроде Serial HOW-TO или что-то подобное.
|
|||
|
||||
hente |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 116 Регистрация: 20.3.2009 Где: Томск Репутация: нет Всего: нет |
Да вот в том то и проблема что никак...
В документациях в примерах никакого переключателя я так и не нашел.. Да и сам пример откуда брал там тож ничего такого нет, просто подряд идут write и read. Щас еще раз попробую прогуглить мож чо полуиться.... но если есть варианты решения проблемы то буду очень рад, да и так спс )) Добавлено через 59 секунд к стате как я понял то у RS485 всего 2 канала а не 3 --------------------
долой быдло кодеров!!! |
|||
|
||||
kurtis |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 65 Регистрация: 10.8.2007 Репутация: нет Всего: нет |
Ну как бы интерфейс считается 2-х проводным, но по факту обычно еще требуется иметь общие земляные потенциалы между абонентами, так что земля может считаться 3-м проводом, но это на важно, я говорил немного не про это. В RS-485 ключевым моментом является переключения направление передачи. В RS485 все устройства делятся на master и slave. Соответственно мастер передает, а слейв слушает и если его спросят, он отвечает. Для избежания мусора на линии используется переключение направление передачи, т.к. мастер изначально становиться на передачу, слейвы становятся на прием и слушают свой адрес для ответа, когда мастер заканчивает передачу, он становиться на прием и начинает слушать кто и что ответит. Слейв который услышал свой адрес, становиться на передачу и отвечает, после ответа он снова становиться на прием, а мастер становиться на передачу. Управление направлением передачи осуществляется программно. Как вы работаете с RS-485 ? Через КОМ-порт (RS-232) или у вас какая-то плата расширения (USB, PCI) ? Что такое /dev/ttyS1 ? Покажите вывод "setserial -a /det/ttyS1" |
|||
|
||||
hente |
|
||||||
Шустрый Профиль Группа: Участник Сообщений: 116 Регистрация: 20.3.2009 Где: Томск Репутация: нет Всего: нет |
на одноплатной ЭВМ (на физическом уровне)джемперами COM2 выставил на RS485
принцип работы то я понял а вот как программно работать хз. к стате если воспользоваться утилиткой cat, то ситация такая: при вводе
то на другом конце RS485 (под виндой) данные приходят без проблем все в норме если ввести
то на другом конце RS485 (под виндой) данные отсылая под Linux ничего не приходит... в документациях никак не могу найти переключение режима чтения записи
к стате под виндой я уже говорил использую Terminal прогу и там соединение идет через переходник USB->RS485 (+дрова там всяки) /dev/ttyS1 - это устройство Это сообщение отредактировал(а) hente - 21.3.2009, 07:26 --------------------
долой быдло кодеров!!! |
||||||
|
|||||||
hente |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 116 Регистрация: 20.3.2009 Где: Томск Репутация: нет Всего: нет |
Люди добрые так может кто-нибуть посоветует что либо? уже 4 дня на одном месте топчусь не знаю что делать.... Поисковики ваще бред выдают .... Может есть какие-либо другие технологии...
Тут подкинули идею: отслеживать прерывания ну и читать определенные регистры... А вот как отловить эти прервания, бог его знает... Хотя всяко данная проблема решается очень легко а вот по какому пути идти.... --------------------
долой быдло кодеров!!! |
|||
|
||||
xvr |
|
||||
Эксперт Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 20 Всего: 223 |
Марку этой 'одноплатной ЭВМ' - в студию!
|
||||
|
|||||
hente |
|
||||
Шустрый Профиль Группа: Участник Сообщений: 116 Регистрация: 20.3.2009 Где: Томск Репутация: нет Всего: нет |
PCE-5120G2
terminal автоматом стоит на приеме...т.е. надо разобраться только с линуксом... К стате многомерными пробами и ошибками нашел такую чтуку как RTS (под линуксом) вроде данные начали отправляться и приниматься вот тока не полностью...)) пару байтов теряется не могу понять в чом дело...но все это дело пока работает нга низком уровне (функции inb,oub,insb,uotsb) а хотелось бы просто работать с функциями write read... --------------------
долой быдло кодеров!!! |
||||
|
|||||
xvr |
|
||||||||||||||
Эксперт Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 20 Всего: 223 |
Хм, действительно не описанно, как переключать направление
Второй вариант - переключение ногой в интерфейсе RS232 (RTS в вашем случае). Недостаток - надо ловить окончание передачи (физическое) байтов из RS232 и только потом переключаться на прием. Дело усложняется тем, что передаваемые данные буферизуются в железе (FIFO). Дело еще более усложняется тем, что у чипа RS232 нет прерывания по опустошению передающего регистра (IMHO) (есть только по готовности принять следующий байт для передачи, что не одно и тоже). Так что для отлова момента переключения RTS надо непрерывно читать регистр состояния передатчика
Кстати, последствия полудуплекса RS485 - одновременный прием и передача невозможны, только по очереди. |
||||||||||||||
|
|||||||||||||||
hente |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 116 Регистрация: 20.3.2009 Где: Томск Репутация: нет Всего: нет |
xvr - на конце у меня собственно не rs232 а переходник USB->RS485 (все эт под win) а что такое CRS? переключать то я научился а вот read все равно колом встает при отправке не зависимо в каком положении RTS cстоит не подскажете в чем дело? --------------------
долой быдло кодеров!!! |
|||
|
||||
xvr |
|
||||||||
Эксперт Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 20 Всего: 223 |
Это не имеет значения - там такой же автосвитчер для переключения направления (ну может чуть поумнее и делать паузы после отправки ему не надо)
|
||||||||
|
|||||||||
hente |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 116 Регистрация: 20.3.2009 Где: Томск Репутация: нет Всего: нет |
PC в том то и дело передает осцилограф уже подключал...а вотREAD не читает не важно скока ему передаю байтов на чтение 1,2,3... из под Win запустил на постоянную отпраку... а под Linux'ом шляпа реад висит и ничего не читает --------------------
долой быдло кодеров!!! |
|||
|
||||
xvr |
|
||||
Эксперт Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 20 Всего: 223 |
А там случайно hardware flow control не включен? |
||||
|
|||||
hente |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 116 Регистрация: 20.3.2009 Где: Томск Репутация: нет Всего: нет |
Что эт такое и с чем его едят? --------------------
долой быдло кодеров!!! |
|||
|
||||
xvr |
|
||||
Эксперт Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 20 Всего: 223 |
Аппаратное управление потоком передачи с помощью сигналов RTS CTS DTR (и еще кто то - не помню ) Если включено, а эти линии никуда не подключены, то работать не будет (повиснет) |
||||
|
|||||
hente |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 116 Регистрация: 20.3.2009 Где: Томск Репутация: нет Всего: нет |
так ну я нашел переключение IXON/IXOFF вроде по док-ии эт оно ...но вот реад все равно не читает....
Пробую другой вариант функцией outsb() - вывести на порт работает нармально на др. конце прием в норме insb() - пытаюст считать данные считывает полный бред какойто.... select'oм пробовал отловить момент прихода данных все равно хрень какаято.... время ожидания кончается и все. --------------------
долой быдло кодеров!!! |
|||
|
||||
hente |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 116 Регистрация: 20.3.2009 Где: Томск Репутация: нет Всего: нет |
Люди добрые спустя кучу времени опять прошу помощи....
Научился отлавливать прерывания от клавиатуры(irq 1), теперь надо переделать под отлавливаний прерыванйи от UART тупая подстановка (irq 3) ни к чему не приводит может кто делал? По мимо номера прерывания соответственно меняю третий параметр в функции request_irq(ном прерывания, имя функции, флаг прерывания) при работе с клавиатурой использую SA_SHIRQ а при работе с уартом SA_INTERRUPT Может я еще что-то не делаю...посоветуйте) Заранее спасибо за помощь... А вообще идея в том чтобы по прерываниям считывать/записывать данные в COM порт --------------------
долой быдло кодеров!!! |
|||
|
||||
Oligarch |
|
|||
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 8.8.2007 Репутация: нет Всего: нет |
Доброе время суток.
Подскажите пожалуста! почему то при чтении из последовательного порта символ 0x0D (или просто "cr") принимается как 0x0A, причем порт настроен на неканонический ввод. И еще вопрос: как можно организовать задержки в Linux, что то типа delay()??? не нашел я там такой функции. Заранее спасибо) |
|||
|
||||
hente |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 116 Регистрация: 20.3.2009 Где: Томск Репутация: нет Всего: нет |
sleep() -задержка в секундах
unsleep() -в милисекундах Это сообщение отредактировал(а) hente - 8.4.2009, 06:31 --------------------
долой быдло кодеров!!! |
|||
|
||||
Oligarch |
|
|||
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 8.8.2007 Репутация: нет Всего: нет |
помогите плиз.
Недавно сел за Linux. Создаю файл new.cpp следующего содержания: //************************ #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <fcntl.h> #include <errno.h> #include <termios.h> int main(void) { int fd; fd=open("/dev/ttyS0",O_RDWR); return 1; } //************************ компилятор выдает следующее: linux-m28h:/work # gcc new.cpp -o new /tmp/ccGJsdKt.o:(.eh_frame+0x11): undefined reference to `__gxx_personality_v0' collect2: ld returned 1 exit status При этом если закоментировать вызов open(), то всё компилится. может надо прикрепить какие нибудь библиотеки? openSUSE у меня) |
|||
|
||||
xvr |
|
|||
Эксперт Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 20 Всего: 223 |
C++ файлы компилировать и собирать нужно с помощью g++ |
|||
|
||||
hente |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 116 Регистрация: 20.3.2009 Где: Томск Репутация: нет Всего: нет |
g++ new.cpp -o new ибудет тебе счастье
--------------------
долой быдло кодеров!!! |
|||
|
||||
Oligarch |
|
|||
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 8.8.2007 Репутация: нет Всего: нет |
спасибо за помощь)
|
|||
|
||||
hente |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 116 Регистрация: 20.3.2009 Где: Томск Репутация: нет Всего: нет |
А как ты переключаешь режим приема/передачи....просто я так и не добился этого от драйвера....???может у тебя решение есть?
--------------------
долой быдло кодеров!!! |
|||
|
||||
hente |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 116 Регистрация: 20.3.2009 Где: Томск Репутация: нет Всего: нет |
я победил RS-486 порт как ни странно работает... вот тока не нашел объяснения таму что прием осуществляется только тогда когда - скорость = 0 B(иначе при любых других скоростях только запись в порт )
щас код по умней напишу потом выложу может еще кому нибуть понадобится.... Это сообщение отредактировал(а) hente - 9.4.2009, 12:58 --------------------
долой быдло кодеров!!! |
|||
|
||||
Oligarch |
|
|||
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 8.8.2007 Репутация: нет Всего: нет |
У меня стоит MOXA CP-132, она сама занимается переключением приема и передачи.
Помогите пожалуста. Почему то при чтении из порта при помощи команды read(), читается не больше 14 символов, сколько бы я не указывал читать в последнем параметре read(). Вот код конфигурации порта и чтения из него:
|
|||
|
||||
xvr |
|
|||
Эксперт Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 20 Всего: 223 |
На эти грабли уже наступали в соседней ветке (в другом разделе, правда). 14 байт - размер аппаратного FIFO у порта. Остальные байты просто еще не успели прийти. Читайте read'ом в цикле, пока не наберется сколько надо. Еще можно настроить timeout'ы приема символов (не знаю, где это настраивается в Linux, ищите) |
|||
|
||||
Oligarch |
|
|||
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 8.8.2007 Репутация: нет Всего: нет |
спасибо.
|
|||
|
||||
Oligarch |
|
|||
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 8.8.2007 Репутация: нет Всего: нет |
v cikle eto ponyatno. Prosto mne ydobnee kogda potok, v kotorom budet vipolnyat'sya etot kod, budet gdat' priema vsego paketa, kotoryi ochen' dlinnui. A v to vremya poka on gdet, drygie potoki bydyt vipolnyat'sya. Ya ychitivay eto, potomy chto proga dolgna rabotat' na controllere ARM9 (200MHz), poetomy kipeshy za bistrodeistvie i proizvoditel'nos't.
Ya ge vistavil time-out: termios_struct.c_cc[VMIN]=0; termios_struct.c_cc[VTIME]=1; eto oznachaet, chto read() budet otschitivat' 100ms dlya kagdogo vhodyashego simvola, i kak tol'ko dlya kakogo nibud' simvola time_out isteket, to read() vozvratit prochitannie simvoli. Eto tak ved'? moget vse taki kak to mogno bez cikla i bez vremennoi zadergki megdy zapis'y i chteniem oboitis'? |
|||
|
||||
xvr |
|
||||
Эксперт Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 20 Всего: 223 |
Нет
|
||||
|
|||||
Oligarch |
|
|||
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 8.8.2007 Репутация: нет Всего: нет |
Как там дела с переключением приема/передачи RS-485 под линуксом? Не решил еще? Если решил, вышли код.
у меня отладочная плата с микроконтроллером AT91SAM9260 (линукс вшит во флэш), её UASRT'ы могут работать в режиме RS-485. Переключение в этот режим происходит выставлением определенного бита в управляющем регистре порта. В этом режиме контроллер автоматически дёргает ногой RTS, которая запаяна на управляющий вход управления приемом/передачей схемы RS-485 интерфейса. И всё бы хорошо, но как из под линукса достучаться до этого управляющего регистра и выставить порт в режим RS-485. Либо можно как то программно дёргать этой ногой RST? опять же будет неизвестно все ли данные отосланы перед выставлением интерфейса на прием.... Это сообщение отредактировал(а) Oligarch - 27.4.2009, 22:02 |
|||
|
||||
hente |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 116 Регистрация: 20.3.2009 Где: Томск Репутация: нет Всего: нет |
Для начала чтобы из ком порта сделать RS485 необходимо выставить джампера на плате(в соответствии с документацией на плату)
Далее 2 пути: 1) Программный, тогда тебе надо будет удостовериться что стоят драйвера(либо при необходимости поставить их), и используешь стандартные функции Read/write (я делал именно так) 2)Аппаратный тут либо ты используешь функцию ioctl либо явно через регистры выставляешь то что те надо ща поищу доку к регистрам ... Это сообщение отредактировал(а) hente - 30.4.2009, 10:58 --------------------
долой быдло кодеров!!! |
|||
|
||||
demon051 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 26.7.2011 Репутация: нет Всего: нет |
для примера
Это сообщение отредактировал(а) demon051 - 20.12.2019, 12:53 |
|||
|
||||
Правила форума "С/С++: Программирование под Unix/Linux" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |