<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 12 (filtered medium)">
<!--[if !mso]><style>v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
w\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
</style><![endif]--><style><!--
/* Font Definitions */
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p.MsoAcetate, li.MsoAcetate, div.MsoAcetate
        {mso-style-priority:99;
        mso-style-link:"Balloon Text Char";
        margin:0in;
        margin-bottom:.0001pt;
        font-size:8.0pt;
        font-family:"Tahoma","sans-serif";}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
span.BalloonTextChar
        {mso-style-name:"Balloon Text Char";
        mso-style-priority:99;
        mso-style-link:"Balloon Text";
        font-family:"Tahoma","sans-serif";}
.MsoChpDefault
        {mso-style-type:export-only;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="2050" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal">I am having problems passing a pointer and uint8 to a .DLL. I have been successful registering call –backs with this .DLL. So it is all 32-bit and ctypes are working. Everything is working up to the line #set-up ProcessingIncomingSerialData.
 I tried the direct approach and then morphing the call-back style but yummy_thing is not so yummy… The python code is below..<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">The definition from the .DLL header is<o:p></o:p></p>
<p class="MsoNormal"><img width="527" height="532" id="Picture_x0020_1" src="cid:image002.png@01CFED51.0C6D7E70"><o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"># Python code starts here…..<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">''' read_bat.py<o:p></o:p></p>
<p class="MsoNormal">'''<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">from serial import *<o:p></o:p></p>
<p class="MsoNormal">from string import *<o:p></o:p></p>
<p class="MsoNormal">from time import *<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">system_state = "G2G"<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">''' --- REMOVED Set-up the COMM port ----<o:p></o:p></p>
<p class="MsoNormal">print("Enter COM port number")<o:p></o:p></p>
<p class="MsoNormal">user_comm_port = raw_input()<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">try:<o:p></o:p></p>
<p class="MsoNormal">    dut_serial_port = Serial(port="COM"+user_comm_port, baudrate=115200, timeout=1)<o:p></o:p></p>
<p class="MsoNormal">except:<o:p></o:p></p>
<p class="MsoNormal">    system_state = "FUBAR"<o:p></o:p></p>
<p class="MsoNormal">    print "Serial Port Problem"<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">try:<o:p></o:p></p>
<p class="MsoNormal">    dut_serial_port.isOpen()<o:p></o:p></p>
<p class="MsoNormal">    print("COM" + user_comm_port + " is open")<o:p></o:p></p>
<p class="MsoNormal">except:<o:p></o:p></p>
<p class="MsoNormal">    print "Serial Port Problem"<o:p></o:p></p>
<p class="MsoNormal">    system_state = "FUBAR"<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">-------------------------------------------'''<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">#Set-up and register cb_send_serial_data<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">from ctypes import *<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">pt_dll = CDLL("c:/py_stuff/ProductionTest.dll")<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">SendSerialData_t = CFUNCTYPE(None, POINTER(c_uint8), c_uint8)<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">reg_send_serial_data = pt_dll.RegSendSerialData<o:p></o:p></p>
<p class="MsoNormal">reg_send_serial_data.argtypes = [SendSerialData_t]<o:p></o:p></p>
<p class="MsoNormal">reg_send_serial_data.restype = None<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">global new_serial_tx_data<o:p></o:p></p>
<p class="MsoNormal">global new_serial_size<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">def send_serial_data(tx_data, size):<o:p></o:p></p>
<p class="MsoNormal">    # testing<o:p></o:p></p>
<p class="MsoNormal">    print "tx_data = ", tx_data<o:p></o:p></p>
<p class="MsoNormal">    print "size = ", size<o:p></o:p></p>
<p class="MsoNormal">    print "tx_data[:size] = ", tx_data[:size]<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">    global new_serial_tx_data<o:p></o:p></p>
<p class="MsoNormal">    new_serial_tx_data = tx_data[:size]<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">    global new_serial_size<o:p></o:p></p>
<p class="MsoNormal">    new_serial_size = size<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">cb_send_serial_data = SendSerialData_t(send_serial_data)<o:p></o:p></p>
<p class="MsoNormal">global cb_send_serial_data<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">reg_send_serial_data(cb_send_serial_data)<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">print "reg_send_serial_data done"<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">#Set-up and register cb_bat_vol_read<o:p></o:p></p>
<p class="MsoNormal">#this triggers send_serial_data when it is registered. <o:p>
</o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">BatVolReadRequest_t = CFUNCTYPE(None, c_uint16, c_uint8)<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">prod_bat_vol_read_request = pt_dll.ProdBatVolReadRequest<o:p></o:p></p>
<p class="MsoNormal">prod_bat_vol_read_request.argtypes = [BatVolReadRequest_t]<o:p></o:p></p>
<p class="MsoNormal">prod_bat_vol_read_request.restype = None<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">def bat_vol_read(bat_vol, status):<o:p></o:p></p>
<p class="MsoNormal">    print "bat_vol_read()"<o:p></o:p></p>
<p class="MsoNormal">    # testing<o:p></o:p></p>
<p class="MsoNormal">    print bat_vol, status<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">cb_bat_vol_read = BatVolReadRequest_t(bat_vol_read)<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">prod_bat_vol_read_request(cb_bat_vol_read)<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">print "prod_bat_vol_read_request done"<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">''' ------------REMOVED serial access for example -----<o:p></o:p></p>
<p class="MsoNormal">#push new_serial_tx_data  out the serial port to the DUT.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">print new_serial_tx_data<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">dut_serial_port.write(new_serial_tx_data)<o:p></o:p></p>
<p class="MsoNormal">dut_serial_port.write("\r \n")<o:p></o:p></p>
<p class="MsoNormal">sleep(1)<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">#and check to see the DUT's reply...<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">global new_serial_rx_data<o:p></o:p></p>
<p class="MsoNormal">#new_serial_rx_data =""<o:p></o:p></p>
<p class="MsoNormal">global rx_buf<o:p></o:p></p>
<p class="MsoNormal">rx_buf = []<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">try:<o:p></o:p></p>
<p class="MsoNormal">    string_buf = dut_serial_port.readline()    <o:p></o:p></p>
<p class="MsoNormal">except:<o:p></o:p></p>
<p class="MsoNormal">    system_state = "FUBAR"<o:p></o:p></p>
<p class="MsoNormal">    print "serial read problem"<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">rx_buf = list(string_buf)<o:p></o:p></p>
<p class="MsoNormal">print "string_buf = ", string_buf<o:p></o:p></p>
<p class="MsoNormal">print "rx_buf = ", rx_buf<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">-----------------------------------------------'''<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">#set-up ProcessingIncomingSerialData<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">print "breakpoint"<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">class rx_data_t:<o:p></o:p></p>
<p class="MsoNormal">    def _init_(self):<o:p></o:p></p>
<p class="MsoNormal">        #self.ret = None<o:p></o:p></p>
<p class="MsoNormal">        self.data = []<o:p></o:p></p>
<p class="MsoNormal">        self.size = ''<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">fake_rx_data = rx_data_t()<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">fake_rx_data.data = ['\x01', '\x05', '\x00', '\x1c', '\x00', '\x99', '\x0c', '\x04']<o:p></o:p></p>
<p class="MsoNormal">fake_rx_data.size = 8<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">print "fake_rx_data.data = ", fake_rx_data.data<o:p></o:p></p>
<p class="MsoNormal">print "fake_rx_data.size = ", fake_rx_data.size<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">ProcessIncomingSerialData_t = CFUNCTYPE(None, POINTER(c_uint8), c_uint16)<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">process_incoming_serial_data = pt_dll.ProcessIncomingSerialData<o:p></o:p></p>
<p class="MsoNormal">process_incoming_serial_data.argtypes = [ProcessIncomingSerialData_t]<o:p></o:p></p>
<p class="MsoNormal">#process_incoming_serial_data.argtypes = [POINTER(c_uint8), c_uint16]<o:p></o:p></p>
<p class="MsoNormal">process_incoming_serial_data.restype = None<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">yummy_thing = ProcessIncomingSerialData_t(fake_rx_data)passing pointers to
<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">process_incoming_serial_data(yummy_thing)<o:p></o:p></p>
<p class="MsoNormal">#process_incoming_serial_data(fake_rx_data)<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">print "Done."<o:p></o:p></p>
<p class="MsoNormal">print "system_state = ", system_state<o:p></o:p></p>
<p class="MsoNormal">#print "Closing COM port", user_comm_port<o:p></o:p></p>
<p class="MsoNormal">#dut_serial_port.close()<o:p></o:p></p>
</div>
</body>
</html>