我想编写一个简单的c程序来执行以下操作。打开与并行端口的连接,使引脚2变为高电平,使引脚2变为低电平并关闭连接。我正在使用JNI,所以我的Java源文件如下。
package meas;
public class Meas {
public static native boolean open();
public static native boolean on();
public static native boolean off();
public static native boolean close();
}
请注意,Java文件应控制并行端口,即确定何时应该为高或低。 然后,我使用javah提取了一个c头文件。
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class meas_Meas */
#ifndef _Included_meas_Meas
#define _Included_meas_Meas
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: meas_Meas
* Method: open
* Signature: ()Z
*/
JNIEXPORT jboolean JNICALL Java_meas_Meas_open
(JNIEnv *, jclass);
/*
* Class: meas_Meas
* Method: on
* Signature: ()Z
*/
JNIEXPORT jboolean JNICALL Java_meas_Meas_on
(JNIEnv *, jclass);
/*
* Class: meas_Meas
* Method: off
* Signature: ()Z
*/
JNIEXPORT jboolean JNICALL Java_meas_Meas_off
(JNIEnv *, jclass);
/*
* Class: meas_Meas
* Method: close
* Signature: ()Z
*/
JNIEXPORT jboolean JNICALL Java_meas_Meas_close
(JNIEnv *, jclass);
#ifdef __cplusplus
}
#endif
#endif
然后我为Linux实现了这个:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/io.h>
#include <sys/types.h>
#include <fcntl.h>
#include <meas_Meas.h>
#define BASEPORT 0x378 /* lp1 */
int tem;
/*
* Class: meas_Meas
* Method: open
* Signature: ()Z
*/
JNIEXPORT jboolean JNICALL Java_meas_Meas_open(JNIEnv *env, jclass clz) {
//set permissions to access port
if (ioperm(BASEPORT, 3, 1)) {
perror("ioperm");
exit(1);
}
tem = fcntl(0, F_GETFL, 0);
fcntl(0, F_SETFL, (tem | O_ASYNC));
}
/*
* Class: meas_Meas
* Method: on
* Signature: ()Z
*/
JNIEXPORT jboolean JNICALL Java_meas_Meas_on(JNIEnv *env, jclass clz) {
outb(255, BASEPORT);
}
/*
* Class: meas_Meas
* Method: off
* Signature: ()Z
*/
JNIEXPORT jboolean JNICALL Java_meas_Meas_off(JNIEnv *env, jclass clz) {
outb(0, BASEPORT);
}
/*
* Class: meas_Meas
* Method: close
* Signature: ()Z
*/
JNIEXPORT jboolean JNICALL Java_meas_Meas_close(JNIEnv *env, jclass clz) {
fcntl(0, F_SETFL, tem);
outb(0, BASEPORT);
//take away permissions to access port
if (ioperm(BASEPORT, 3, 0)) {
perror("ioperm");
exit(1);
}
}
我不是C导出,所以上面的代码可能看起来很奇怪。但这并不重要。重要的是我也想为Windows实现这个。目标是得到一个DLL,就像我已经有一个Linux的libMeas.so。我已经有MinGW工作,但问题是在Windows上你不能使用sys / io.h。在谷歌上搜索有关如何执行此操作的文档会产生有关如何在并行端口上写入数据的教程。我不想要这个,我只想让引脚2高或低。我猜这应该是相当简单的。任何人都可以指出我正确的方向如何为Windows做这个(使用相同的头文件)?
答案 0 :(得分:2)
要在Windows上编译C代码,您应该在所有细节(outb,fcntl)周围添加#ifdefs。
使用_inp / _outp内在函数直接访问端口。有关这些内容,请参阅MSDN。
http://msdn.microsoft.com/en-us/library/y7ae61bc(v=vs.80).aspx
要使用MinGW(gcc / win32)获取.dll文件,只需使用“-shared”命令行开关。
gcc -o libMeas.dll -shared source.c <your_libraries_for_win32>
i586-mingw32msvc-gcc也适用于linux(交叉编译)
x64版本也存在问题。
看起来你必须使用驱动程序来处理那种东西,因为_inp / _outp可以在DDK(Driver DevKit)中访问,而不是“开箱即用”。
在这里查看http://www.highrez.co.uk/downloads/inpout32/default.htm 对于32/64位驱动程序。
在托管环境中读取并行端口有一个完整的线程(在这种情况下是.NET,但JNI也会这样做,我猜):http://www.vbforums.com/showthread.php?t=643913
答案 1 :(得分:0)
这有一个并行端口的JNI接口 http://www.hytherion.com/beattidp/comput/pport.htm
答案 2 :(得分:0)
我使用从http://logix4u.net/parallel-port/16-inpout32dll-for-windows-982000ntxp获得的dll。有了这个DLL,还有一个只有两个函数的c头文件。 Inp32()和Out32()。这可以用来直接读取和写入并行端口的单词,与conio.h中不推荐使用的_inp()和_out()函数完全相同。所以它基本上意味着我可以在用户模式下直接访问并行端口。
顺便说一下。你必须在logix4u.net上挖一点才能找到二进制文件;它可以在这里找到:http://logix4u.net/parallel-port/parallel-port/index.php?option=com_content&task=view&id=26&Itemid=1它似乎也存在这个dll的64位版本,它支持windows vista,并且希望是Windows 7。