typeError in Python when defining a input chanel of NI-DAQ


Python code for Data Aqusition using NI-DAQ.
Had downloaded NI-driver


Traceback (most recent call last):
    File "C:UsersiconDesktopDAQ 1.0.py", line 68, in <module>
     chan = ctypes.create_string_buffer('Dev1/ai0')
    File "C:Python34libctypes__init__.py", line 63, in 
     raise TypeError(init)
    TypeError: Dev1/ai0

I am a student. I was trying to code a program in Python to acquire data from NI-DAQ it raised the above error.

this is the code

imported all libraries required

nidaq = ctypes.windll.nicaiu  
int32 = ctypes.c_long
uInt32 = ctypes.c_ulong
uInt64 = ctypes.c_ulonglong
float64 = ctypes.c_double
TaskHandle = uInt32
written = int32()
pointsRead = uInt32()    
DAQmx_Val_Volts = 10348
DAQmx_Val_Rising = 10280
DAQmx_Val_Cfg_Default = int32(-1)
DAQmx_Val_ContSamps = 10123
DAQmx_Val_ChanForAllLines = 1
DAQmx_Val_RSE = 10083
DAQmx_Val_Volts = 10348
DAQmx_Val_GroupByScanNumber = 1
DAQmx_Val_FiniteSamps = 10178
DAQmx_Val_GroupByChannel = 0
taskHandle = TaskHandle(0)
min1 = float64(-10.0) 
max1 = float64(10.0)
timeout = float64(10.0)
bufferSize = uInt32(10)
pointsToRead = bufferSize
pointsRead = uInt32()
sampleRate = float64(200.0)
samplesPerChan = uInt64(100)
#specifiy the channels
chan = ctypes.create_string_buffer('Dev1/ai0')
clockSource = ctypes.create_string_buffer('OnboardClock')
Asked By: akshay biradar



According to [Python.Docs]: ctypes.create_string_buffer(init_or_size, size=None) (emphasis is mine):

init_or_size must be an integer which specifies the size of the array, or a bytes object which will be used to initialize the array items.

So, for your case, the simplest way to bypass this error would be to pass the bytes object to create_string_buffer. Note that passing a string doesn’t work in Python3, because the "string" semantics have changed from Python2 (where it works).


>>> import sys, ctypes
>>> print("Python {:s} on {:s}".format(sys.version, sys.platform))
Python 3.4.4 (v3.4.4:737efcadf5a6, Dec 20 2015, 20:20:57) [MSC v.1600 64 bit (AMD64)] on win32
>>> device_str = "Dev1/ai0"
>>> chan = ctypes.create_string_buffer(device_str)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "c:Installx64PythonPython3.4Libctypes__init__.py", line 63, in create_string_buffer
    raise TypeError(init)
TypeError: Dev1/ai0
>>> device_bytes = b"Dev1/ai0"  # Use bytes literal directly
>>> chan = ctypes.create_string_buffer(device_bytes)
>>> chan, chan.value
(<ctypes.c_char_Array_9 object at 0x00000000058E0DC8>, b'Dev1/ai0')
>>> chan = ctypes.create_string_buffer(device_str.encode())  # Use string's encode to convert it to bytes
>>> chan, chan.value
(<ctypes.c_char_Array_9 object at 0x00000000058E0E48>, b'Dev1/ai0')
Answered By: CristiFati
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.