| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Программирование под Unix/Linux > RS485 (плата PCI-1602B) |
| Автор: plica98 19.12.2012, 11:10 |
| Добрый день, уважаемые Коллеги. Возникли проблемы при работе с RS485 (плата PCI-1602B - двухголовая). При приеме идет какой-то мусор из порта. Может кто- нибудь что подскажет или какие-нибудь исходники скинет. Может не совсем корректно проинициализировал плату ? Заранее благодарю за помощь и внимание. |
| Автор: tzirechnoy 19.12.2012, 13:20 |
| Напишыте минимальный пример, который демонстрирует проблемы, и покажыте. Возможно, кто-нибудь что-нибудь в нём поймёт и объяснит, что не так. PS Да, проблемы с приёмом на подобных каналах -- это обычно несоответствие скорости или битности. Но таки всякое можэт быть. |
| Автор: plica98 20.12.2012, 10:02 | ||||||||
| Добрый день, уважаемые Коллеги. ПЕРЕДАЧА
ПРИЕМ
Передающая пишет в порт по 5 байт с интервалом в 1сек. Приемная должна читать по 5 байт, а читает мусор. Может FIFO не задано ? Как задать ? |
| Автор: tzirechnoy 20.12.2012, 13:04 |
| 1) У Вас, я смотрю, какой-то юникс? Почему бы тогда для начальной приладки не вопсользоваться простыми написанными средствами -- stty+cat или там cu -l или minicom. 2) Выглядят программы вроде нормально, собирать не пробовал. ожыдание через FIONREAD немного странное, но для пяти байт буферов должно хватить (там 8k вроде стандартно). 3) Проверьте физику. + должэн быть к +, - к -. Терминаторы по 120 ом (с обоих сторон по-моему). |
| Автор: xvr 20.12.2012, 13:37 |
| Посмотрите в документацию на плату (и/или на ее драйвера) - не надо ли каких либо явных манипуляций по управлению направлением передачи информации, т.к. RS485 - это полудуплекс, и одновременно принимать и передавать оно не может физически |
| Автор: plica98 20.12.2012, 14:31 |
| Плата сама управляет переключением прием-передача. У платы две головы. Я соединил выход одной с входом другой и наоборот. Иногда удается что-то принять. Причем, для этого надо запустить вначале программу приема, а потом передачу. Такое впечатление, что как бы синхронизация нарушается. Добавлено через 5 минут и 2 секунды Без операционки на физическом уровне я работаю с этой платой нормально. А вот хотел сделать под Linux (у меня Fedora стоит). Документации на драйвера нет. Через IOCTL тоже нет документации. Может кто-то уже с ней работал под Linux. Тем более я хотел ее использовать на не стандартных скоростях (192000). |
| Автор: tzirechnoy 20.12.2012, 17:42 | ||
Вот это как раз неудивительно. Добавлено через 39 секунд А, да, чуть не забыл. Все системные вызовы надо проверять на ошыбки, и если есть -- информировать. Часто всплывают очень любопытные вещи. |
| Автор: bsa 20.12.2012, 23:14 |
| plica98, исправь свой пост с кодом оформив сам код в теги [code=cpp] [/code] |
| Автор: tzirechnoy 21.12.2012, 10:09 | ||
Зато, наверняка, есть исходники. Если нет -- ну, даташыт с описанием регистров у тебя вроде есть -- драйвер serial порта -- это в районе тысячи-полутора строк, из которых половину можно взять из существующего обычного. |
| Автор: bsa 21.12.2012, 16:16 |
| Это не про нее? http://www.fccps.cz/download/adv/frr/pci-16xx/README.pci-16xx.html |
| Автор: plica98 24.12.2012, 09:25 | ||
Да, это она. Большое спасибо за участие. Пока сдвигов нет, надо разбираться. |
| Автор: rsm 25.12.2012, 08:30 | ||
| Доводилось работать с разными платами этой серии, их нормальная инициализация действительно проблема Вот кусок из старых исходников (проверки на ошибки убраны для уменьшения кода):
В данном примере порт открывается только для чтения. Для записи нужно: поменять флаги open (строка 7), добавить cfsetospeed(&tio, PORT_SPEED) после строки 10 и всё остальное оставить без изменений. И таки да: использование ioctl(FIONREAD), причём ещё и в цикле - это очень плохая идея. Данная серия плат славится своими глюками в части передачи данных пакетами фиксированной длины, поэтому ioctl лучше оставить в покое и формировать пакеты программно, внутри select'а набивая массив и уже его разбивая по пакетам. Хотя это крайняя мера, лично у меня приведённый выше код делил данные по пакетам без всякого шаманства (см. PACKET_SIZE). И ещё: "очищать" порт попытками вычитать из него все данные - это ещё более худшая идея. Для этого есть вызов http://www.kernel.org/doc/man-pages/online/pages/man3/tcflush.3.html. Общие рекомендации: - настройки портов должны быть полностью идентичны (скорость, разрядность, чётность, контроль потока и пр.); - размеры пакетов желательно делать полностью идентичными (отправляется 16 байт и принимается 16 байт); |
| Автор: plica98 25.12.2012, 10:23 |
| RSM, спасибо за помощь. Но, как я уже говорил, без операционки на физическом уровне я работаю с этой платой нормально. Причем работаю даже на максимальных скоростях и дуплексном режиме. Проблем нет ни с приемом, ни с передачей пакетов любой длины. Плата отлично работает, нареканий никаких нет. Думаю, что проблема не в плате, а в софте. Вот и хотелось бы разобраться. Можно же с ней работать, наверное, и на низком уровне (через IOCTL). Вот и хочу сделать под Linux (у меня Fedora стоит). Плохо что документации никакой нет. |
| Автор: plica98 25.12.2012, 14:59 | ||
RSM. Документации ADVANTECH IOCTL |