一天调俩硬件,都是jna的功劳啊 哈哈
上代码
JNA代理类(代理kpci800.dll)
package xingyang.meam.kpci;
import java.io.File;
import com.sun.jna.Native;
import com.sun.jna.win32.StdCallLibrary;
public interface KPCIDevice extends StdCallLibrary {
File f = new File("");
KPCIDevice INSTANCE = (KPCIDevice) Native.loadLibrary(f.getAbsolutePath()
+ "\\kpci800", KPCIDevice.class);
/**
* 该函数负责打开板卡的设备对象
*
* @param iIndex
* 指定KPCI板卡的设备序号,0对应第一个设备
* @return
*/
boolean OpenDevice(long iIndex);
/**
* 功能: 该函数负责关闭板卡的设备对象 参数:
*
* @param iIndex
* 与OpenDevice中的相同
*/
void CloseDevice(long iIndex);
/**
* 从端口读入一个字节
*
* @param iIndex
* 与OpenDevice中的相同
* @param dich
* 为开关量输入的地址
* @return 读取的单字节数据
*/
int ReadByte(long iIndex, int dich);
/**
* 该函数负责打开指定板卡型号的设备对象
*
* @param iIndex
* 指定KPCI板卡的设备序号,0对应第一个设备
* @param boardtype
* 指定KPCI板卡的型号,这里只能是840、843、844、845、846、847、848。
* @return
*/
boolean OpenmDevice(long iIndex, long boardtype);
}
运行类
package xingyang.meam.kpci;
public class KPCIMain {
public static void main(String[] args) {
System.out.println("open:" + KPCIDevice.INSTANCE.OpenDevice(0));
for (int i = 0; i < 1; i++) {
int value = KPCIDevice.INSTANCE.ReadByte(0, i);
if (value != 0) {
System.out.println(i + "->" + Integer.toBinaryString(value) + ";");
}
}
KPCIDevice.INSTANCE.CloseDevice(0);
System.out.println("over!");
}
}
这里没啥注意的
大家看KPCIMain里for循环那段,发没发现只循环一次? 哈哈 ,我试了一下,不管 ReadByte的第二个参数传啥,返回值都一样
Integer.toBinaryString(value)
结果是个8位2进制,每位代表一个继电器状态,大家自己看吧
附件是直接可运行的java工程
导入eclipse就行