c - 将一个简单的 c 程序从 linux 移植到 windows

标签 c windows parallel-port

我想编写一个简单的 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 执行此操作(使用相同的头文件)?

最佳答案

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

使用 _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

关于c - 将一个简单的 c 程序从 linux 移植到 windows,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10682407/

相关文章:

linux - 如何用汇编语言(linux)写入/读取并行端口?

c - 从函数中的 argv 分配指针

c - switch语句和递增

c - "faked subtraction"曾经在现实世界中使用过吗?

c - 使用 CUDA C 的大型矩阵加法

C++ 词汇表;在 vector/ map 中找到完整的描述

c - 用于创建我自己的 certmgr.exe 的 API

C# 应用程序记录器

python - 使用inpout32 windows7(64bit)访问并口控制寄存器

缺少 Linux 模块文件