Передать структуру в dll (freepie) в ctypes - PullRequest
0 голосов
/ 20 декабря 2018

Freepie имеет файл dll, который вы можете использовать для передачи данных в программу.Вот мой сценарий для этого:

import time
import ctypes
from ctypes import byref, c_int, POINTER


class freepie_io_6dof_data(ctypes.Structure):
    __fields__ = [
        ("Yaw", ctypes.c_float()),
        ("Pitch", ctypes.c_float()),
        ("Roll", ctypes.c_float()),
        ("X", ctypes.c_float()),
        ("Y", ctypes.c_float()),
        ("Z", ctypes.c_float())]

q = ctypes.CDLL("E:\\Program Files (x86)\\FreePIE\\freepie_io.dll")  # Load DLL
slots = q.freepie_io_6dof_slots()
data = freepie_io_6dof_data()
data.Y = ctypes.c_float(0)
q.freepie_io_6dof_write.argtypes = [c_int, c_int, POINTER(freepie_io_6dof_data)]
while True:
    q.freepie_io_6dof_write(0, 1, byref(data))
    print(data)
    time.sleep(0.5)

Однако, когда freepie получает данные, он показывает их как другое число каждый раз, когда я запускаю программу, и обычно что-то вроде 6.34523234E-36.Ожидаемый результат будет 0, где я иду не так?

1 Ответ

0 голосов
/ 20 декабря 2018

Опечатки в основном коде привели к ошибочной производительности.После изменения __fields__ на _fields_ и снятия скобок с ctypes.c_float код работает нормально!

Вот окончательный код:

import time
import ctypes
from ctypes import byref, c_int, POINTER


class freepie_io_6dof_data(ctypes.Structure):
    _fields_ = [
        ("Yaw", ctypes.c_float),
        ("Pitch", ctypes.c_float),
        ("Roll", ctypes.c_float),
        ("X", ctypes.c_float),
        ("Y", ctypes.c_float),
        ("Z", ctypes.c_float)]

q = ctypes.CDLL("E:\\Program Files (x86)\\FreePIE\\freepie_io.dll")  # Load DLL
slots = q.freepie_io_6dof_slots()
data = freepie_io_6dof_data()
data.Y = ctypes.c_float(0)
q.freepie_io_6dof_write.argtypes = [c_int, c_int, POINTER(freepie_io_6dof_data)]
while True:
    q.freepie_io_6dof_write(0, 1, byref(data))
    print(data)
    time.sleep(0.5)
...