2012-05-21 46 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