2012-05-21 49 views
1

我想编写一个简单的c程序来执行以下操作。打开并行端口的连接,使引脚2变高,使引脚2变低并关闭连接。我为此使用JNI,所以我的Java源文件如下。从linux移植一个简单​​的c程序到windows

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 

然后,我实现了这个版:

#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,就像我已经有一个libMeas.so for Linux一样。我已经有MinGW的工作和所有,但问题是,在Windows上,你不能使用sys/io.h。在google上搜索关于如何做到这一点的文档可以得到关于如何在并行端口上写数据的教程。我不想要这个,我只是想让针脚2高或低。我的猜测是这应该相当简单。任何人都可以在正确的方向指向我如何做到这一点的Windows(使用相同的头文件)?

+0

用Dev-C++编译c代码,它具有所有的linux c头文件。无论如何,如果你正在编译linux上的代码,我不知道 – jondinham

回答

0

我得到它使用从http://logix4u.net/parallel-port/16-inpout32dll-for-windows-982000ntxp获得的dll。有了这个DLL,还有一个只有两个函数的c头文件。 Inp32()和Out32()。它可以用来直接读取和写入并行端口,与conio.h中不推荐使用的_inp()和_out()函数非常相似。所以它基本上意味着我可以在用户模式下直接访问并行端口。

Btw。你必须挖掘一点才能在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。

2

要在Windows上编译C代码,您应该在所有细节(outb,fcntl)中添加#ifdefs。

使用_inp/_outp内在函数直接访问端口。有关这些,请参阅MSDN。

http://msdn.microsoft.com/en-us/library/y7ae61bc(v=vs.80).aspx

要获得使用的MinGW(GCC/win32)中只使用 “-shared” 命令行开关.dll文件。

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

+0

显然,_outp只能在windows xp之前的windows版本中使用。该代码应该在Windows XP和更高版本上工作。在windows xp和更高版本的并行端口上简单写入255的最简单方法是什么? – meijuh

+0

你说得对。还有x64版本的问题。想不到还有写这些字节的方法。 –

+1

目前我正在寻找http://logix4u.net/parallel-port/16-inpout32dll-for-windows-982000ntxp。让我们看看这是怎么回事。 – meijuh