![]() |
|
|
#1 |
|
Junior Member
Регистрация: 17.11.2015
Сообщений: 3
Вес репутации: 0 ![]() |
Пытаюсь наковырять скрипт на Python для работы с Arduino.
PySerial не работает, потому как на OpenWrt 14.07 (на котором у меня нормально подключилась Ардуинка через USB) - не портирован один из пакетов в зависимостях. Поэтому поставил pyusb, который работает через libusb и больше ничего не требует. Вот мой скрипт, который худо-бедно что-то шлет и получает. Код:
#!/usr/bin/env python
import usb, time
ftdi = None
busses = usb.busses()
for bus in busses:
devices = bus.devices
for dev in devices:
# Ищем FTDI
if dev.idVendor == 0x0403 or dev.idProduct == 0x6001:
ftdi = dev
# Нашли FTDI и работаем
if ftdi is not None:
device = ftdi
print "FTDI 0x%04x : 0x%04x" % ( device.idVendor, device.idProduct)
h = device.open()
# Вырубаем драйвер ядра, иначе будет Device busy
print "Try to detachKernelDriver..."
try:
h.detachKernelDriver(0)
except usb.USBError as e:
print "Kernel driver apparently is not attached."
h.setConfiguration(1)
h.claimInterface(0)
i=0
# Такой пакет отправляем в Ардуинку. Там стоит обычный
# повторитель, который вернет эту же строку, но с '>' в начале
msg = '+1234567890123456789012345678901234567890123-\n'
msglen = len(msg)
# Отправляем пакет
print h.bulkWrite(0x02, msg, msglen)
#time.sleep(1)
# Пытаемся прочитать данные из Ардуинки
while i<msglen:
# FIX!
#print h.bulkWrite(0x02, msg, msglen)
ret = h.bulkRead(0x81, 64)
print ''.join([chr(x) for x in ret])
i = i+len(ret)
h.releaseInterface()
![]() Версия pyusb 0.4 - такая уж в репозитории у OpenWrt 14.07, но вроде работает. Проблема вся в том, что не могу никак понять, какой длины должны быть пакеты. Если отправить только один раз команду, то из Ардуинки прочитается только один раз, а в последующие запуски этого же скрипта из usb читается какая-то белиберда из одного символа. Если раскомментировать строку после #FIX!, то bulkRead начинает более-менее нормально читать ответ обрывками, но это получается, что мы "вышибаем" ответ от Ардуинки путем многократной посылки одной и той же команды, а нам это совсем не нужно, потому как бред! В описании устройства FTDI максимальный размер пакета = 64. Если в bulkRead поставить маньше, то появляется ошибка! Можно только больше. В общем, никак не пойму с размерами пакетов... Как послать .bulkWrite() один раз, а потом вычитать ответ целиком и без ошибок с .bulkRead() - вот в чем основной вопрос. Последний раз редактировалось Dimanjy; 19.11.2015 в 12:54. |
|
|
|
| Здесь присутствуют: 1 (пользователей: 0 , гостей: 1) | |
| Опции темы | Поиск в этой теме |
| Опции просмотра | |
|
|