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);
这样应该可以吧?