Модераторы: 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   Вверх
hente
Дата 25.3.2009, 08:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

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


PC в том то и дело передает осцилограф уже подключал...а вотREAD не читает не важно скока ему передаю байтов на чтение 1,2,3... из под Win запустил на постоянную отпраку... а под Linux'ом шляпа реад висит и ничего не читает
--------------------
  долой быдло кодеров!!!
PM MAIL   Вверх
xvr
Дата 25.3.2009, 08:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(hente @ 25.3.2009,  08:16)
Код

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


PC в том то и дело передает осцилограф уже подключал...а вотREAD не читает не важно скока ему передаю байтов на чтение 1,2,3... из под Win запустил на постоянную отпраку... а под Linux'ом шляпа реад висит и ничего не читает

А там случайно hardware flow control не включен?

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


Шустрый
*


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

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



Код

А там случайно hardware flow control не включен?


Что 
эт такое и с чем его едят?
--------------------
  долой быдло кодеров!!!
PM MAIL   Вверх
xvr
Дата 25.3.2009, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(hente @ 25.3.2009,  13:30)
Код

А там случайно hardware flow control не включен?


Что 
эт такое и с чем его едят?

Аппаратное управление потоком передачи с помощью сигналов RTS CTS DTR (и еще кто то - не помню  smile ) Если включено, а эти линии никуда не подключены, то работать не будет (повиснет)

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


Шустрый
*


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

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



так ну я нашел переключение IXON/IXOFF вроде по док-ии эт оно ...но вот реад все равно не читает....
Пробую другой вариант функцией 
outsb() - вывести на порт работает нармально на др. конце прием в норме
insb() - пытаюст считать данные считывает полный бред какойто....

select'oм пробовал отловить момент прихода данных все равно хрень какаято....
время ожидания кончается и все.

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


Шустрый
*


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

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



Люди добрые спустя кучу времени опять прошу помощи....

Научился отлавливать прерывания от клавиатуры(irq 1), теперь 
надо переделать под отлавливаний прерыванйи от UART тупая подстановка (irq 3) 
ни к чему не приводит может кто делал?
По мимо номера прерывания соответственно меняю третий параметр в функции

request_irq(ном прерывания, имя функции, флаг прерывания)

при работе с клавиатурой использую SA_SHIRQ
а при работе с уартом SA_INTERRUPT

Может я еще что-то не делаю...посоветуйтеsmile) Заранее спасибо за помощь...

А вообще идея в том чтобы по прерываниям считывать/записывать данные в COM порт

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


Новичок



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

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



Доброе время суток.
Подскажите пожалуста! почему то при чтении из последовательного порта символ 0x0D (или просто "cr") принимается как 0x0A, причем порт настроен на неканонический ввод. И еще вопрос: как можно организовать задержки в Linux, что то типа delay()??? не нашел я там такой функции.
Заранее спасибо)
PM MAIL   Вверх
hente
Дата 8.4.2009, 06:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



sleep() -задержка в секундах 
unsleep()  -в милисекундах

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


Новичок



Профиль
Группа: Участник
Сообщений: 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 у меня)
PM MAIL   Вверх
xvr
Дата 8.4.2009, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Oligarch @ 8.4.2009,  14:43)
компилятор выдает следующее:
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

C++ файлы компилировать и собирать нужно с помощью g++

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


Шустрый
*


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

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



g++ new.cpp -o new ибудет тебе счастье smile 
--------------------
  долой быдло кодеров!!!
PM MAIL   Вверх
Oligarch
Дата 9.4.2009, 06:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



спасибо за помощь)
PM MAIL   Вверх
hente
Дата 9.4.2009, 07:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А как ты переключаешь режим приема/передачи....просто я так и не добился этого от драйвера....???может у тебя решение есть?
--------------------
  долой быдло кодеров!!!
PM MAIL   Вверх
hente
Дата 9.4.2009, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



 smile  я победил RS-486 порт  smile  как ни странно работает... вот тока не нашел объяснения таму что прием осуществляется только тогда когда - скорость = 0 B(иначе при любых других скоростях только запись в порт smile )

щас код по умней напишу потом выложу может еще кому нибуть понадобится....

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


Новичок



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

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



У меня стоит MOXA CP-132, она сама занимается переключением приема и передачи.

Помогите пожалуста.
Почему то при чтении из порта при помощи команды read(), читается не больше 14 символов, сколько бы я не указывал читать в последнем параметре read(). Вот код конфигурации порта и чтения из него:

Код

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <termios.h>

int main(void)
{
    int oldflags,fdDK ;
    unsigned char temp;
                char out[10],in[50];
    struct termios termios_struct;

//Конфигурирование порта
                fdDK = open("/dev/ttyM0",O_RDWR|O_NOCTTY);         /*ttyM0 - имя файла порта RS-485 (MOXA CP-132IS)*/
    oldflags = fcntl (fdDK, F_GETFL, 0);
    oldflags&=~O_NONBLOCK;
    fcntl (fdDK, F_SETFL, oldflags);

    tcgetattr(fdDK,&termios_struct);
    termios_struct.c_cflag|=(CLOCAL|CREAD);
    cfsetispeed(&termios_struct,B38400);
    cfsetospeed(&termios_struct,B38400);
    termios_struct.c_cflag&=~PARENB;
    termios_struct.c_cflag&=~CSTOPB;
    termios_struct.c_cflag&=~CSIZE;
    termios_struct.c_cflag|=CS8;
    termios_struct.c_lflag&=~(ICANON | ECHO | ECHOE | ISIG );
    termios_struct.c_iflag|=(INPCK | ISTRIP);
    termios_struct.c_iflag&=~IXON&~IXOFF&~IXANY&~ICRNL;
    termios_struct.c_iflag|=BRKINT;
    termios_struct.c_oflag&=~OPOST;
    termios_struct.c_cc[VMIN]=0;
    termios_struct.c_cc[VTIME]=10;
    tcsetattr(fdDK,TCSANOW,&termios_struct);
    //Очистка входного буфера порта
    while(read(fdDK,&temp,1));

//Обмен                
    sprintf(out,"$02K\r");
    if(write(fdDK,out,5)<0)return 0;
    read(fdDK,in,40);
    printf("%s\n",in);
                close(fdDK);
                return 1;
}

PM MAIL   Вверх
xvr
Дата 11.4.2009, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Oligarch @ 11.4.2009,  08:02)
Помогите пожалуста.
Почему то при чтении из порта при помощи команды read(), читается не больше 14 символов, сколько бы я не указывал читать в последнем параметре read().

На эти грабли уже наступали в соседней ветке (в другом разделе, правда). 14 байт - размер аппаратного FIFO у порта. Остальные байты просто еще не успели прийти. Читайте read'ом в цикле, пока не наберется сколько надо. Еще можно настроить timeout'ы приема символов (не знаю, где это настраивается в Linux, ищите)

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


Новичок



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

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



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


Новичок



Профиль
Группа: Участник
Сообщений: 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'?
PM MAIL   Вверх
xvr
Дата 11.4.2009, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Oligarch @ 11.4.2009,  11:28)
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'?

Нет
Цитата

Case A: MIN > 0, TIME > 0
In this case TIME serves as an inter-byte timer and is activated after the first byte is received. Since it is an inter-byte timer, it is reset after a byte is received. The interaction between MIN and TIME is as follows. As soon as one byte is received, the inter-byte timer is started. If MIN bytes are received before the inter-byte timer expires (remember that the timer is reset upon receipt of each byte), the read is satisfied. If the timer expires before MIN bytes are received, the characters received to that point are returned to the user. Note that if TIME expires at least one byte is returned because the timer would not have been enabled unless a byte was received. In this case (MIN > 0, TIME > 0) the read blocks until the MIN and TIME mechanisms are activated by the receipt of the first byte, or a signal is received. If the data is in the buffer at the time of the read(), the result will be as if the data has been received immediately after the read().

Case C: MIN = 0, TIME > 0
In this case, since MIN = 0, TIME no longer represents an inter-byte timer. It now serves as a read timer that is activated as soon as the read() function is processed. A read is satisfied as soon as a single byte is received or the read timer expires. Note that in this case if the timer expires, no bytes are returned. If the timer does not expire, the only way the read can be satisfied is if a byte is received. In this case the read will not block indefinitely waiting for a byte; if no byte is received within TIME*0.1 seconds after the read is initiated, the read() returns a value of zero, having read no data. If the data is in the buffer at the time of the read(), the timer is started as if the data has been received immediately after the read(). 
Поставьте в VMIN размер вашего буфера

PM MAIL   Вверх
Oligarch
Дата 27.4.2009, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Как там дела с переключением приема/передачи RS-485 под линуксом? Не решил еще? Если решил, вышли код.
у меня отладочная плата с микроконтроллером AT91SAM9260 (линукс вшит во флэш), её UASRT'ы могут работать в режиме RS-485. Переключение в этот режим происходит выставлением определенного бита в управляющем регистре порта. В этом режиме контроллер автоматически дёргает ногой RTS, которая запаяна на управляющий вход управления приемом/передачей схемы RS-485 интерфейса. И всё бы хорошо, но как из под линукса достучаться до этого управляющего регистра и выставить порт в режим RS-485. Либо можно как то программно дёргать этой ногой RST? опять же будет неизвестно все ли данные отосланы перед выставлением интерфейса на прием....

Это сообщение отредактировал(а) Oligarch - 27.4.2009, 22:02
PM MAIL   Вверх
hente
Дата 30.4.2009, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

Далее 2 пути:

1) Программный, тогда тебе надо будет удостовериться что стоят драйвера(либо при необходимости поставить их), и используешь стандартные функции Read/write (я делал именно так)

2)Аппаратный тут либо ты используешь функцию ioctl либо явно через регистры выставляешь то что те надо

ща поищу доку к регистрам ...

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


Новичок



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

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



для примера
Код

#include <iostream>
#include <signal.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <stdio.h>
#include <unistd.h>

#include <linux/serial.h>
#include <sys/ioctl.h>

using namespace std;

it fd = -1;

void handlerSIGTERM(int nsig)
{
    if(fd>0)
        close(fd);
    exit(0);
}

int main(int argc, char *argv[])
{    
    signal(SIGINT, handlerSIGTERM); 
    signal(SIGTERM, handlerSIGTERM);
    signal(SIGQUIT, handlerSIGTERM);

    int baudrate = 9600;

    string device = "/dev/ttymxc1";

    cout << "Test Com Port (RS-485)..." << endl;
    cout << "Device: "<<device<<endl;
    cout << "Baudrate: "<<baudrate<<endl;
    cout << "Waiting for data..."<<"(press Ctrl+C to exit)" << endl;


    int res;
    unsigned char buf[255];

    fd = open(device.data(), O_RDWR | O_NOCTTY /*| O_NDELAY*/);
    if (fd == -1)
    {
        cout<< "Could not open device "<<device<<endl;
        perror(device.data());
        exit(-1);
    }
    else
       fcntl(fd, F_SETFL, 0);


    struct termios options;

    // Получение текущих опций для порта...

    tcgetattr(fd, &options);

    // Установка скорости передачи...

    cfsetispeed(&options, baudrate);
    cfsetospeed(&options, baudrate);

    // Разрешение приемника и установка локального режима...

    options.c_cflag |= (CLOCAL | CREAD);
    //Отсутствие проверки на четность (8N1):
    options.c_cflag &= ~PARENB;
    options.c_cflag &= ~CSTOPB;
    options.c_cflag &= ~CSIZE;
    options.c_cflag |= CS8;

    //Выбор неканонического (Raw) ввода
    options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);

    options.c_cc[VTIME]    = 0;   // посимвольный таймер не используется
    options.c_cc[VMIN]     = 4;   // блокировка чтения до тех пор пока не будут приняты 4 байта
    // Установка новых опций для порта...

    tcsetattr(fd, TCSANOW, &options);

    struct serial_rs485 rs485conf;

    /* Enable RS485 mode: */
    rs485conf.flags |= SER_RS485_ENABLED;

    /* Set logical level for RTS pin equal to 1 when sending: */
    rs485conf.flags |= SER_RS485_RTS_ON_SEND;
    /* or, set logical level for RTS pin equal to 0 when sending: */
    rs485conf.flags &= ~(SER_RS485_RTS_ON_SEND);

    /* Set logical level for RTS pin equal to 1 after sending: */
    rs485conf.flags |= SER_RS485_RTS_AFTER_SEND;
    /* or, set logical level for RTS pin equal to 0 after sending: */
    rs485conf.flags &= ~(SER_RS485_RTS_AFTER_SEND);

    /* Set rts delay before send, if needed: */
    //rs485conf.delay_rts_before_send = ...;

    /* Set rts delay after send, if needed: */
    //rs485conf.delay_rts_after_send = ...;

    /* Set this flag if you want to receive data even while sending data */
    //rs485conf.flags |= SER_RS485_RX_DURING_TX;

    if (ioctl (fd, TIOCSRS485, &rs485conf) < 0) {
        /* Error handling. See errno. */
        cout<< "Could not set RS-485 settings!"<<endl;
        if(fd>0) close(fd);
        exit(-1);
    }

    while (1)
    { /* цикл ввода/вывода */
        res = read(fd,buf,255);   /* выход после приема/ввода 4-х байт */
        buf[res]=0;               /* для того чтобы мы могли использовать printf... */
        printf(":%s:%d\n", buf, res);
        cout<< "Data sending... "<<endl;

        int n = write(fd, buf, res);
        if(n==res)
           cout << "OK! "<<endl;
        else
           cout << "Error! Sent "<<n<<" bytes instead of "<<res<<endl;
    }

    close(fd);   
    return 0;
}


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

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

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


 




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


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

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