Python/torch/深度学习——WinRing0,工控机GPIO控制



前言

工控机的GPIO控制采坑记录

  • 源码是C语言写的,基于WinRing0的GPIO控制,含WinRing0x64.sys文件和libsiogpio.dll文件(都是厂家的)
  • 要用python调用dll文件,控制工控机GPIO

系统软件环境

  • win10,x64
  • miniconda + VS code

一、下载对应的WinRing0文件

光使用厂家给的文件会一直报初始化失败,需要去下载对应的WinRing0x64.dll文件:
WinRing0x64.dll文件相关文件下载网址

二、文件位置

  • 厂家给的动态库的整个文件夹放进工程里(自己单独创了个dll文件夹,以下称dll文件夹),路径不重要,能引用到就行,原始文件夹路径:SIOGPIO\prebuild\libsiogpio\x64\Release\dll
  • WinRing0.dll、WinRing0x64.dll、WinRing0x64.sys和WinRing0x86.sys目前在dll文件夹和工程文件夹总路径里各一份(还没清理)
  • WinRing0x64.dll需要在python.exe所在文件夹下放一份!!!(据说如果导出exe,要在.exe文件同文件夹下放一份,还没到这一步)
    • 例如miniconda/env/test/python.exe,那就要在miniconda/env/test下放对应的.dll
  • 引用libsiogpio.dll
    • 对应的io地址为uint8类型,不需要转16进制
    • ctypes.CDLL和ctypes.cdll.LoadLibrary相同
    • win_dll读取出来的函数需要引用一次地址,再去调用,并且输入输出参数需要转成ctypes.xxx类型,否则为随机乱码(盲猜是函数地址)
  • 测试代码如下
import ctypes

dll_path = r'dll/libsiogpio.dll'
win_dll = ctypes.CDLL(dll_path)

libsiogpio_Init = win_dll.libsiogpio_Init
libsiogpio_Init.restype = ctypes.c_bool
libsiogpio_GPIO_SetOutput = win_dll.libsiogpio_GPIO_SetOutput
libsiogpio_GPIO_SetOutput.argtypes = [ctypes.c_uint8, ctypes.c_uint8]
libsiogpio_GPIO_GetInput = win_dll.libsiogpio_GPIO_GetInput
libsiogpio_GPIO_GetInput.argtypes = [ctypes.c_uint8]
libsiogpio_GPIO_GetInput.restype = ctypes.c_uint8
libsiogpio_Deinit = win_dll.libsiogpio_Deinit


def gpio_init():
    if libsiogpio_Init():
        print('GPIO初始化')
        return True
    else:
        print('GPIO初始化失败')
        return False


def gpio_write(addr, level):
    libsiogpio_GPIO_SetOutput(addr, level)  # 地址,电平高低


def gpio_read(addr):
    # 读取指定io点评
    # level = win_dll.libsiogpio_GPIO_GetInput(36)  # 读取指定io电平
    level = libsiogpio_GPIO_GetInput(addr)
    return level


def gpio_close():
    libsiogpio_Deinit()

if __name__ == '__main__':
    import keyboard
    import time
    import os
    print('user:', os.getlogin())
    io_address_list = [81, 80, 23, 10, 87, 86, 37, 36]  # 8->1
    # 87:out4, 5.11v
    # 86:out3, 5.11v
    # 37:out2, 3.36v
    # 36:out1, 3.36v
    gpio_init()

    for io_addr in io_address_list:
        print(io_addr, gpio_read(io_addr))
    gpio_write(37, 1)
    print('\n')
    print(37, gpio_read(37))
    while True:
        if keyboard.is_pressed('esc'):
            break
        # time.sleep(0.5)
    gpio_close()
Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐