Python/torch/深度学习——WinRing0,工控机GPIO控制
Windows 10 x64环境下,使用Python通过WinRing0库控制工控机GPIO的采坑记录
·
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()
更多推荐
所有评论(0)