ctypes
Gabriel Genellina
gagsl-py2 at yahoo.com.ar
Wed Apr 29 20:29:54 EDT 2009
En Wed, 29 Apr 2009 05:05:52 -0300, luca72 <lucaberto at libero.it> escribió:
> can you explain how to use this function :
> this is the api documentation :
> PREF0 short usb_tc08_get_single (
> short handle,
> float * temp,
> short * overflow_flags,
> short units);
>
> This is the sample made in c:
> int main(void)
> {
> short handle = 0; /* The handle to a TC-08 returned by
> usb_tc08_open_unit() */
> char selection = 0; /* User selection from teh main menu */
> float temp[9]; /* Buffer to store temperature readings
> from
> the TC-08 */
> int channel, reading; /* Loop counters */
> int retVal = 0; /* Return value from driver calls
> indication
> success / error */
> USBTC08_INFO unitInfo;/* Struct to hold unit information */
>
> usb_tc08_get_single(handle, temp, NULL, USBTC08_UNITS_CENTIGRADE);
> i do
> strumento = ctypes.cdll.LoadLibrary('/home/luca/Desktop/luca/
> progetti_eric/Pico/libusbtc08-1.7.2/src/.libs/libusbtc08.so')
> strumento.usb_tc08_get_single.argtypes = [ctypes.c_short,
> ctypes.c_float, ctypes.c_short, ctypes.c_short] is this correct?
That's wrong. Second and third parameters are pointers:
# define a pointer type
c_float_p = ctypes.POINTER(ctypes.c_float)
c_short_p = ctypes.POINTER(ctypes.c_short)
usb_tc08_get_single = strumento.usb_tc08_get_single
usb_tc08_get_single.argtypes = [
ctypes.c_short,
c_float_p,
c_short_p,
ctypes.c_short]
usb_tc08_get_single.restype = ctypes.c_short
> now how i can use the function?
> leggo = strumento.usb_tc08_get_single(0, temp,
> 'NULL','USBTC08_UNITS_CENTIGRADE')
That's wrong too. In the C code, the third parameter is NULL - this
corresponds to None in Python, not the string 'NULL'.
Also, they define a temporary float array of size 9 and use it as the
second argument - we have to do the same in Python. (Note that ctypes
accepts an array in place of a pointer argument, same as C).
Last, you have to search for the value of USBTC08_UNITS_CENTIGRADE, likely
it's a #define in a .h header file. Suppose you find the corresponding
value is 42:
USBTC08_UNITS_CENTIGRADE = 42
temp = (ctypes.c_float * 9)()
handle = 0
leggo = usb_tc08_get_single(handle, temp, None, USBTC08_UNITS_CENTIGRADE)
Hope it helps,
--
Gabriel Genellina
More information about the Python-list
mailing list