读书人

windows 下 怎么向 PS2 口发送数据

发布时间: 2012-03-05 11:54:02 作者: rapoo

windows 下 如何向 PS2 口发送数据
问题:
1. 在 dos 下,我知道,可以通过 outportb 向键盘口发送数据,如代码 outportb( 0x61,'a' ); ,使用示波器检测 ps2 的 data 线及 clock 线,会有波形变化, 并且我也已经
用一台单片机成功收到电脑通过 ps2 口发送来的数据

2. 在 windows 下,当主板通电时,会发送一个 0xff 到 ps2 口,然后 windows 自检ps2键盘时时,会发送 0xf2 给 ps2 口,ps2 键盘要回送 0xfa,0xab,0x83 给主板 ps2 口,
样,windows 才会认为键盘是存在的,并且会驱动 ps2 键盘 . 这些数据我的单片机已经收到,并且已经可以向 windows 回送信号

3. 但进入 windows 系统后,所以底层硬件已经让 windows 抽像处理,无法直接控制端口(即控制主板上的 8042 蕊片 ),我现在找到唯一的办法,是通过 winio, 通过 winio,
看下述文章,http://www.360doc.com/content/10/0705/10/2034962_36998894.shtml 可向 键盘缓冲区写数据,但注意,只是 "键盘缓冲区" 而非直接写到 ps2 的口上,
所以使用 winio 写端口,只能实现键盘模拟(即写放一个键值后,只能让 windows 收到),而无法真正写放到 ps2 口 ,我用 波器检测 到,使用下述函数

Delphi(Pascal) code
function InitializeWinIo(): BOOL; stdcall; external 'WinIo.dll' name 'InitializeWinIo';procedure ShutdownWinIo(); stdcall; external 'WinIo.dll' name 'ShutdownWinIo';{使用 Sendbyte 前,要初始化 winio , 即调用 InitializeWinIo  }procedure SendByte(Por,Cod : Byte);begin  Sleep(1);  asm    PUSH EAX    PUSH EDX    //等待状态寄存器标志位OBF置0    @Loop:    IN  AL,$64    AND AL,01b    JNZ @Loop    //写入数据    MOV AL,Cod    MOV DL,Por    MOV DH,0    OUT DX,AL    POP EDX    POP EAX  end;end;{向键盘缓冲写 a 键}begin SendByte($64,$D2);  SendByte($60,$1E);  SendByte($64,$D2);  SendByte($60,$9E);end;


上述代码,是可以向 windows 成功发送 a 键,而无法让外接 ps2 设备收到


有没有高手,知道如何在 windows 下,真正与 ps2 进行通讯的方法

[解决办法]
function SetPortVal(PortAddr:Word;PortVal:DWord;bSize:Byte):Boolean;stdcall;external 'WinIo.dll' name 'SetPortVal';

SetPortVal($61,ord('a'),1);

这样应该可以吧?

读书人网 >.NET

热点推荐