前言
实践中正好遇到了GPIO的调试问题,驱动为DMCI,调试目标是通道正常读写。其实不管什么驱动其读写方式都只是函数调用的问题,这里算是给个Demo。
配置与声明
需要引用一个DMCI.dll的动态链接库,如果你的驱动也是这个,下面开始复制粘贴大差不差了。
using DMCI;
然后声明一下线程
//创建IO线程
Thread WriteGPIO; //写IO
Thread ReadGPIO; //读IO
在Load中创建对象
//创建GPIO动态库对象
string path = @"./DMCI.dll";
IDIO = new DMCIDLLInvoke(path);
if (!IDIO.InitDIO(GroupIndex))
{
MessageBox.Show("GPIO初始化失败!!");
}
同时在Load中可以添加一个自启动接口,触发下面的Click
启动线程接口
ReadGPIO = new Thread(ReadIO); //读IO
ReadGPIO.Start();
读写IO
//读取IO
private void ReadIO()
{
int sum=0;
byte GPIODATA = 0;
while (true)
{
IDIO.GetDI(GroupIndex, ref GPIODATA); //读取IO状态,Index为下标
string StrDO = "";
StrDO = ByteToString(GPIODATA);//这里用Convert.ToString()就行
int x = Convert.ToInt32(StrDO, 2);//收取IO接口的二进制转十进制数据。
}
}
如下代码可写入button触发
//点亮IO通道(输出)
HexDONum |= 0x01;
HexDONum &= ~(0x01);//自行根据通道号切换DONum
IDIO.SetDO(GroupIndex, Convert.ToByte(HexDONum));
附上GetDI的函数说明
// Get iDIO group input pins.
// Call EkDMCiGetDI1, EkDMCiGetDI2,... by setting GroupIndex 0, 1, ...
// Read Connect value for getting input status in iDIO setting.
// (API in DMCI.dll). (see DMCI_User_Manual_ENU.pdf)
// 获取 iDIO 组输入引脚.
// 通过 GroupIndex 设置 0, 1, .., 分别调用 EkDMCiGetDI1, EkDMCiGetDI2, ...
// 读取 Connect 值 获取 iDIO 设置中的输入状态.
// (DMCI.dll 中的 API). (参见 DMCI_User_Manual_ENU.pdf (英文版))
// 取得 iDIO 群組輸入腳位.
// 透過 GroupIndex 設定為 0, 1, .., 分別呼叫 EkDMCiGetDI1, EkDMCiGetDI2, ...
// 取得 Connect 值 得知 iDIO 設定中的輸入狀態.
// (DMCI.dll 中的 API). (參詳 DMCI_User_Manual_ENU.pdf (英文版))
public bool GetDI(byte GroupIndex, ref byte Connect)
{
if (GroupIndex >= DMCiMax.DIOGroupCount) return false;
if (pEkDMCiGetDI[GroupIndex] == IntPtr.Zero) return false;
fixed (byte *pb = &Connect)
{
return EkDMCiGetDI[GroupIndex](pb) == 1;
}
}