![]() |
![]() |
#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. |
![]() |
![]() |
![]() |
#2 | |
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9824 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]() Цитата:
|
|
![]() |
![]() |
![]() |
#3 |
Junior Member
Регистрация: 17.11.2015
Сообщений: 3
Вес репутации: 0 ![]() |
![]() |
![]() |
![]() |
![]() |
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1) | |
Опции темы | Поиск в этой теме |
Опции просмотра | |
|
|