Найти - Пользователи
Полная версия: Проблемы с COM девайсами (pyserial)
Начало » Python для новичков » Проблемы с COM девайсами (pyserial)
1
saw_tooth
Всем доброго

Есть задача определять на концах 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
JOHN_16
Из документации :
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 что бы упаковать ваши значения в строку
saw_tooth
JOHN_16
Из документации :
Но если бы запрос, который я отсылаю был постоянно не верным, то ваш метод бы был правильным, но он доходит, и устройство отзывается, вот только когда ты повторно его опрашиваешь оно молчит.

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

Но попробую однозначно)
saw_tooth
JOHN_16
Из документации :

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

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

http://clip2net.com/s/iYOoiL
saw_tooth
Проблема решена.
Ответ:

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

У меня все. Всем Спасибо)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB