Форум сайта python.su
Есть проект в котором используется плата АЦП. Под неё есть драйвера windows.
Инициализация и получение версии, адресного пространства происходит нормально, но когда доходим до получения информации с платы - всегда возвращается 128(int) или редко 65535(int)
Функции должны возвращать float или hex, а приходит int
Код не будет работать без платы и драйверов, которые не встанут без платы =)
но всё же может кто подскажет в чём может быть проблема?
# -*- coding: utf-8 -*-
'''
Created on 15.10.2009
@author: Sinopteek
'''
from ctypes import *
from array import *
class PISO(object):
u'''
класс определяющий плату АЦП PISO-813
'''
debug =0
def __init__(self):
u'''
инициализируем драйвер
и ищем платы
'''
self.PISO_dll = windll.Piso813
#u'ID'
self.PISO813id = 0x800A00
#u"инициализируем драйвер"
if (self.PISO_dll.PISO813_DriverInit()):
print u"Driver init"
else:
print u"Can not initial Driver!!! PISO813 Card Error"
self.wBoard = c_int(0) #u"всего плат найдено"
self.wBoardNo = c_int(0) #u"используемая плата"
#u'ищем платы'
if self.PISO_dll.PISO813_SearchCard(byref(self.wBoard),self.PISO813id):
print u"Search Card Error!!! PIODIO card Error"
else:
print u"Searched"
print u"Всего плат найдено :", str(self.wBoard)[7:-1]
AddrBase = c_int(0)
IrqNo = c_int(0)
SubVendor = c_int(0)
SubDevice = c_int(0)
SubAux = c_int(0)
SlotBus = c_int(0)
SlotDevice = c_int(0)
def get_Address_Space(self, BoardNo):
#u'получаем адрессное пространство платы c номером BoardNo'
Return_Code = {
0 : 'No Error',
1 : 'Driver Open Error',
2 : 'Driver No Open',
3 : 'Get Driver Vesion Error',
4 : 'Call Driver Error',
5 : 'Find Board Error',
6 : 'Exceed Board Number',
0xFFFF : 'Time Out Error',
-100.0 : 'Ad Error 2'
}
answer = self.PISO_dll.PISO813_GetConfigAddressSpace(BoardNo,byref(self.AddrBase),
byref(self.IrqNo),byref(self.SubVendor),byref(self.SubDevice),
byref(self.SubAux),byref(self.SlotBus),byref(self.SlotDevice))
if answer == 0:
#u'выводим адресное полученное пространство'
if self.debug:
print "AddrBase = ",self.AddrBase
print "IrqNo = ",self.IrqNo
print "SubVendor = ",self.SubVendor
print "SubDevice = ",self.SubDevice
print "SubAux = ",self.SubAux
print "SlotBus = ",self.SlotBus
print "SlotDevice = ",self.SlotDevice
else:
print Return_Code[answer]
self.Jmp20v = c_int(1) #u"размах 20 В(1) 10В(0)"
self.BiUni = c_int(1) #u"Одно(0) и Двуполярное(1) напряжение"
#ADChNo = 0 #u'номер канала /0-31/'
#CfgCode = 0 #u'степень усиления 2**wCfgCode /0-4/'
def Set_Ch_Gain(self,ch=0,gain=1):
u"устанавливаем для канала ch усиление gain"
u"определяем степень двойки"
for i in range(5):
if 2**i == gain:
CfgCode = i
break
if self.debug:
if self.PISO_dll.PISO813_SetChGain(self.AddrBase, ch, CfgCode) == 0:
print u"Gain for channel",ch,"set to",2**CfgCode
else:
print u"Set Gain for channel",ch," Error"
def get_hex(self):
u"возвращаем в формате HEX 12 бит"
answer = self.PISO_dll.PISO813_AD_Hex(self.AddrBase)
if self.debug:
print "HEX =", hex(answer)
return answer
#def get_bin(self):
# print "bin =", bin(self.PISO_dll.PISO813_AD_Hex(self.wAddrBase))
def get_float(self):
u"преобразуем в формат float 12 бит"
answer = (self.PISO_dll.PISO813_AD_Float(self.AddrBase, self.Jmp20v, self.BiUni)-2047.)*10/2048
if self.debug:
print "Float = ", answer
return answer
def close(self):
u"закрываем драйвер"
if self.PISO_dll.PISO813_DriverClose():
print u"driver closed"
else:
print u"Can not access Driver!!! PISO813 Card Error"
u'just 4 debug'
a = PISO()
a.get_Address_Space(0)
a.Set_Ch_Gain(ch=0,gain=1)
a.get_hex()
a.get_float()
a.close()
Отредактировано (Май 7, 2010 19:18:58)
Офлайн
Офлайн
Андрей Светловспасибо, теперь можно c_float вернуть
посмотрите http://docs.python.org/library/ctypes.html#return-types
Офлайн