当按下键盘上的键时,发送到CPU的信号是二进制的吗?

当按下键盘上的键时,发送到CPU的信号是二进制的吗?

当我们按下键盘上的某个键时,它会按下圆顶形橡胶按钮,进而在该点电连接顶层和底层,并将信号发送到 COB IC。该 IC 处理信号并通过PS2端口或者USB发送到计算机。“-工程车库(按 ctrl + f 查找)

是个信号发送到 CPU 二进制?(例如字母“a”= 00000001)?

答案1

发送到 CPU 的所有内容都是二进制的。它也是十六进制、十进制和八进制的。二进制只是在 CPU 和集成电路中执行操作时最容易的表示形式。这些位可以并排排列,如并行总线,也可以一次一个地输入(串行),但是当作为一个组时,它们所表示的数据可以以任何你喜欢的方式显示。CPU 使用二进制表示、算术和逻辑,但它处理的实际数据要么是一组位,从一种角度看“只是”一系列 1 和 0,从另一种角度看则是字母“a”。

如果您在给定时刻查看 CPU 上的任何给定数据线,那么它将是 1 或 0,但为了获得任何有用的信息,您需要组成一个字节或一系列字节的组或一系列位。

当您按下一个键时,正如您所说的那样,信号会通过各种集成电路发送,直到 CPU 处的信号有效地表明a key was pressed, can you run some code to find out what?此时处理器将通知操作系统,操作系统将找到负责读取键盘设备的驱动程序,然后该驱动程序将消失并将(通过处理器和其他 IC)查询设备,询问按下了什么键码。

至于返回的“按键”信息,它只不过是数据而已。它同时是十六进制、十进制、二进制和“字符 A”。

答案2

一般来说答案是是的,但当然更深入的答案不可能像“是”那么简单,不是吗!

首先,通常(除了全键翻转键盘)按下一个键和一个“信号”之间没有直接的关联。通常,至少有信号。出于成本原因,大多数键盘都采用某种(取决于实现)线路矩阵,按下任何一个键都会产生两个信号,然后 IC 会以某种特定方式解码该信号。通常,键盘的设计使得通常一起按下(或彼此靠近)的键具有足够不同的线路,以便 IC 确实能够正确识别,以供正常使用。
每个键都单独布线的键盘确实存在,但这是例外,而不是常态。

现在,按下一个或多个键的信息(“信号”)被编码为键盘 IC 上的几个数字。当然,这是一个二进制数字(不可能是其他数字!)。并且...沒有任何物品被發送!等什么?是的,没错。

时不时地,USB 主设备(计算机中的控制器 IC,通常在主板上)会询问从设备(键盘中的 USB 控制器)是否有事情要告诉。USB 标准规定从设备只能在主设备请求(“轮询”)时发送。键盘通常以中断传输模式运行,因此键盘有机会告诉计算机理想的更新请求频率(但它仍然需要仅响应请求,而不是自行采取行动),并且应答帧的大小有些受限(USB2 上为 64 字节,对于几个键来说这通常已经足够了)。
通常,在 USB2 键盘上,可以获得的最佳轮询间隔是 1ms,但 USB3 允许 0.125ms [1]

现在,键盘中的控制器将数字(或多个数字)封装在一个有限大小的特定知名格式的数据包中,该数据包包含标识符、校验和(CRC)以及其他一些信息,并将所有这些信息逐位“传输”。
此传输是严格当然是二进制的,因为只有一根数据线(每个方向)可以任何一个有电压,或者没有电压。但是信号看起来不再像原始信号,而且只有查看完整的数据包才有意义,而不是查看单个位。

如果计算机检测到 CRC 错误,键盘将发送并重新传输最多三次,因此传输不仅仅是发射后不管,而是一个有些更复杂协议

一旦收到数据,并且 CRC 正确,控制器就会生成一个中断,设备驱动程序就会执行某物从收到的消息中提取扫描码。然后,它会经过操作系统中一些或多或少复杂的过滤和分析机制(可能维护一组“当前按下的键”,也可能调用钩子,等等),直到最后某物(取决于操作系统)进入具有“焦点”的程序的消息队列(通常被翻译成一个字符)。这某物通常是“按下按键”类型的通知,与相应的“松开按键”消息配对,并且可能由操作系统根据某个计时器生成“重复”消息。
当然,“信号”仍然是二进制的,因为这是 CPU 唯一能理解的东西。但现在它看起来又完全不同了。而且可以肯定的是,它比通过线路发送的简单小数字要复杂得多。

当按键信息被转换成字符时,多次按键可能会进一步组合成一个字符(或者反过来,或者一些可变长度编码,或者其他有趣的东西)。
同样,“信号”仍然必须是二进制的,但——同样——它看起来与以前大不相同。


[1]对于那些担心每一毫秒的延迟的超级硬核游戏玩家来说,这可能很有趣。投票最多USB2 键盘上每毫秒一次意味着平均延迟增加 0.5 毫秒(不考虑处理按键或发送网络数据包所需的时间)。在表面上“完全相同”的旧 USB 键盘上,最低可能的轮询间隔为 10 毫秒!

相关内容