在Turbo C ++ 3.0上的16Bit Dos 5上使用inp()

问题描述 投票:0回答:4

首先,我想说的是,我知道这是一个非常过时的问题。那就是为什么我无法通过Google找到任何信息的原因。 (或者我的搜索能力比我想承认的还要糟糕!哈哈。)所有结果几乎都告诉我inp()outp()在现代系统上是无用的,因为内核会处理所有输入和输出,而不是内核该程序。我正在486机上运行16位Dos,并且能够将outp()与并行端口完美配合使用。我喜欢16位Dos,并且对在NT时代或更高版本的系统上学习“新的和改进的”方式不感兴趣(至少现在还不行)。

已清除-

我的问题是关于inp()。我有一本旧的硬拷贝手册,说您将单个变量(端口地址)传递给inp()。在这种情况下,我假设由于将0x378用作outp()的端口,因此我也将其用于inp()。由于我之前没有编程过接受外部输入的程序,因此我不确定从简单的开/关开关可以得到哪种类型的值,因此我编写了此快速代码以获取所有新值-

#include <iostream.h>
#include <stdio.h>
#include <conio.h>
#include <time.h>
#include <dos.h>

int main(void){
    clrscr();

    int input;
    int buff = 0;

    restart:

    input = inp(0x378);

        if(input != buff){
        cout<<input;
        buff = input;
        }

    goto restart;

}

我只是使用了'buff',所以当输入引脚通电时,它不会一遍又一遍地吐出'255'并可能掩盖一个不同的值。不用说,唯一打印出的值是'255'。

[当我编写程序以将数据输出到并行端口上的“ D”引脚时,我将十六进制代码发送到与所需输出相对应的端口...现在,我正在处理并行端口上的“ S”引脚。输入的并行端口。我应该将十六进制代码返回到程序中吗?

而且,我进入BIOS并确保并行端口的模式是in / out,而不只是out。在发现我有两种模式后,我的兴奋之波很快就被同样糟糕的“ 255”输出所粉碎。

任何向我指出正确方向的信息都会有所帮助。

谢谢!

c++ io dos
4个回答
2
投票

这看起来很透彻:http://www.beyondlogic.org/spp/parallel.htm

此外,请确保在BIOS中将并行端口配置为双向模式。其他可能性包括“仅输出”,“ EPP”和“ ECP”模式,但是“双向”将最适合您尝试做的事情。您将需要0x37a中的位5来控制端口的方向。另外,您正在使用的端口的基地址可能不是0x378 ...内存中有一些位置可获取LPT1-LPT4的基地址(BIOS设置页面也可能告诉您。)


1
投票

在这种情况下,由于我使用0x378作为outp()的端口

不要。端口可能是单向的(尽管对于LPT而言,这并不是我最好的记忆)。

无论如何,不​​知道端口连接了什么就很难知道问题出在哪里。通常,应该使用一个控制寄存器(端口+ 2)和状态寄存器(端口+1)来控制实际的控制器并读取其状态。我确实已经多年没有处理实模式PC编程了,但是对于我工作的嵌入式设备,输入/输出端口必须与控制/状态寄存器一起使用,而不是盲目地使用。


0
投票

您首先要完成什么?并行端口不是一个好的双向通道。如果要在计算机之间(或计算机之间的任意设备)进行点对点通信,则调制解调器电缆为空的串行端口是更好的选择。或USB。或者,嗯,网络。您知道,以太网种类。


0
投票

我假设您的意思是如何通过LPT1输入信号?首先,您应该阅读接口教程。LPT1 interfacing sample您会发现销11与输入有关。那么引脚11与寄存器0x378 + 1相关。

© www.soinside.com 2019 - 2024. All rights reserved.