1

次のような簡単な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を使用してacヘッダーファイルを抽出しました。

/* 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にも実装したいということです。目標は、Linux用のlibMeas.soをすでに持っているのと同じように、dllを取得することです。私はすでにMinGWを動作させていますが、問題はWindowsではsys/io.hを使用できないことです。これを行う方法に関するドキュメントをGoogleで検索すると、パラレルポートにデータを書き込む方法に関するチュートリアルが表示されます。これは必要ありません。ピン2をハイまたはローにしたいだけです。私の推測では、これはかなり単純なはずです。(同じヘッダーファイルを使用して)Windowsでこれを行う方法について誰かが私を正しい方向に向けることができますか?

4

3 に答える 3

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)でアクセスできるため、そのようなものにはドライバーを使用する必要があるようです。

32/64ビットドライバーについては、http: //www.highrez.co.uk/downloads/inpout32/default.htmを参照してください。

管理対象環境(この場合は.NETですが、JNIもそうだと思います)でパラレルポートを読み取ることについてのスレッド全体があります:http ://www.vbforums.com/showthread.php?t = 643913

于 2012-05-21T09:17:58.137 に答える
0

http://logix4u.net/parallel-port/16-inpout32dll-for-windows-982000ntxpから取得したdllで動作するようになりました。このdllには、2つの機能しかないacヘッダーファイルもあります。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ビットバージョンも存在するようですビスタとうまくいけばウィンドウズ7。

于 2012-05-22T08:14:58.803 に答える
0

これには、パラレルポートhttp://www.hytherion.com/beattidp/comput/pport.htmへのJNIインターフェースがあります 。

于 2012-05-21T21:29:20.473 に答える