Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 26, 2014 13:44:30

saw_tooth
Зарегистрирован: 2014-09-08
Сообщения: 32
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблемы с COM девайсами (pyserial)

Всем доброго

Есть задача определять на концах COM портов определенного вида девайсы (3 вида).
Написал 3 функции, последовательно вызвал - не профит.
Один из девайсов, отвечает единожды, апри повторном запуске присылает код ошибки “неверная команда”
Оставляю в списке функций только этот девайс, запускаю несколько раз - все работает.
Добавляю в список хотя бы еще один - опять ошибка команды.

Сделал очистку фуберов I/O перед всеми записями и после чтений - ничего не изменилось.
Открыл модуль pyserial, добавил принтов метод записи в COM порт, ничего не обнаружил.

Что может быть? Излазил уже все что можно.
Документацию на протокол общения с девайсом прочитал от и до.Перепробовал массу вариантов - все тщетно.

Протокол девайса:
http://electric.lqela.ru/index.php/option/content/task/view/id/154/catid/48/Itemid/43
Код (говнокод):
http://clip2net.com/s/iYMJdf

Офлайн

#2 Сен. 26, 2014 14:16:45

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Проблемы с COM девайсами (pyserial)

Из документации :

write(data)
Parameters: data – Data to send.
Returns: Number of bytes written.
Raises SerialTimeoutException:
In case a write timeout is configured for the port and the time is exceeded.
Write the string data to the port.
строка, вы же отправляете список значений. Используйте модуль struct и функцию pack что бы упаковать ваши значения в строку



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#3 Сен. 26, 2014 14:35:44

saw_tooth
Зарегистрирован: 2014-09-08
Сообщения: 32
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблемы с COM девайсами (pyserial)

JOHN_16
Из документации :
Но если бы запрос, который я отсылаю был постоянно не верным, то ваш метод бы был правильным, но он доходит, и устройство отзывается, вот только когда ты повторно его опрашиваешь оно молчит.

ЗЫ. Под “ошибкойкоманды” я имел ввиду стандартно описанную ошибку, для протокола работы с девайсом, тоесть мне не СОМ библиотека говорит, а сам девайс. Но вопрос в другом - я то точно знаю что запрос верный!

Но попробую однозначно)

Офлайн

#4 Сен. 26, 2014 14:45:55

saw_tooth
Зарегистрирован: 2014-09-08
Сообщения: 32
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблемы с COM девайсами (pyserial)

JOHN_16
Из документации :

насчет байт-преобразования

Мне казкалось этого достаточно (из файла serialutil.py)

http://clip2net.com/s/iYOoiL

Офлайн

#5 Сен. 26, 2014 17:06:34

saw_tooth
Зарегистрирован: 2014-09-08
Сообщения: 32
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблемы с COM девайсами (pyserial)

Проблема решена.
Ответ:

По спецификации, нужно 3 раза “переспрашивать” девайсину, если она не поняла с первого.
Этот момент я упустил, так как был уверен в полностью рабочем запросе.
Но когда я добавил цикл все стало на свои места. железка без проблем определяется со второй итерации. Видимо это связано с какими то переходными процессами или особенностями регистров и буферов самой железки, ибо общается она чесно говоря странно. Особенно если учитываться что, на содержимое бкфера влияет время ожидания его заполнения, а именно, если нужная информация заполняется за Х время, то за 2Х ее там будет больше (не пропорционально) - она просто будет дублироваться.

У меня все. Всем Спасибо)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version