导问
给你导线若干,以及一个小灯泡,你能否让计算机将其点亮?
通讯中如何保障数据的位的丢失?
(本文技术主要还是几年前做的,细节之处所记之处可能不甚准确)
文
对于接口, 不同系统不同平台有不同接口,不同的虚拟方式,我们先以RS232举例,由于硬件参数相同,无论Linux还是Windows这块是一致的。
对于RS232程序者来说,往往只关心数据,因此往往只关注2,3口。(其实有的做硬件也他么的只接了235,具体定义可以去查寻MSDN文档或者RS232定义)
众所周知这个参数非常显眼——频率,为什么是频率 —— 注意标题哈,我们常用9600不是。目前计算的体系的基础就是频率,都还记得高中的物理吧,有个震荡体来着,技术的发展了,那个比较大,现在是半导体结构的晶振(鄙人不是搞硬件,硬件名称大概对号)。我们用的计算32位的不是,芯片都处理了,通过类似移位寄存器的东西,弄成一排一排的。
串口串口,意思就是说数据是串行的,我们举个例——学生排队,大家通过串口(门口)串行出来,现在32个人一排(移位寄存器处理),现在可以看成32位的并行数了。32位计算的含义,是说逻辑单元一次运算的字节宽度,现在数据可以扔去计算了。现在我们看成并行的,你可以联想一下异或操作,通过基本的异或门能够组成一个特定的开关(指令),这个感谢一下布尔的NB(搞数学的大师——膜拜一下,不只是高深的图形图像需要数学,计算机基础也是有数学理论才有它的诞生,至于其他多元方程,积分...虽然高数没有学怎么样,搞明白了学了有什么用)。
刚刚提到频率,为什么要设置频率?
——顺便回答一下导问的第二个问题 —— 这个问题是个伪命题,原则上位是不会丢失的。
你不告诉计算机是9600,它便不知道那边发数据的速率,那假设你设置了9600*2,它以9600*2的速率读取会怎么样?其实从理论上说你是可以获取到数据的,如果原来是2个字节,那么你将会得到4个字节不是?那么按道理偶数位和奇数位会相同(时序准确的前提),要得到数据你只需要把数据取所有的奇数位便可以得到。哦哦,是不是想到什么?是不是有个叫倍频的东西?!为什么有倍频,为什么内存要买固定频率的?是不是一个道理。(可以随便试试一个频率,都是可以收到数据的,只是...)
点亮灯泡其实很容易,大多数接口都有控制信号线一类的东西,将其抬高,连上灯泡和底线就OK。第一个问题我们也解决了,当然用数据线原则上也是可以的,使劲刷高位数据即可(即使它内部消耗点什么肉眼也看不出来不是,我们的用的交流电才50hz)。
呃,聊一下代码。通讯里面个人感觉难点在于逻辑上的,为了保障数据的有效性我们往往会有重发机制,稍不慎则很容易坠入死循环的陷阱中。这点的确是需要清晰的逻辑。在“游戏”文中就提过,因为一个解密的原因当时就搞的我们程序蛋疼。至于像TCP这种,都叫协议族,那个真不是一般难,但原理原则是相同的,不同处就要看需求了,它要解决些什么问题(它要解决的问题也真不是一般多)。
串行并行有了概念了。
——来个并口也就不是什么问题了。
——既然叫并口,那数据就不是写串行流(软件编程里屏蔽底层,封装了stream,当然很高级,Linux反正是写文件,也都帅气)了。这个玩意儿我们每个口挨个耍,就像一排一排的感觉。哦哦,那边怎么收数据,下次怎么办?它也有控制线不是 —— 把控制线看成事件通知一样:“有数据来了”,“好的,知道了,我马上收”,“我收完了”。
——控制电机肿么办?灯泡都点亮了,大功率的也不是问题,初中物理介绍了继电器。换个并口来试试怎么样,还可以接多个,这个当开关倒是很方便。
“游戏”中我们提到程序文件的安全问题,老板拿出一个“神秘”的芯片——“有协议的,禁止卖给朝鲜或伊朗的”。什么叫安全,只有相对,从硬盘考虑不到,难道就不运行了,难道就没有手段考内存了,高手无处不在啊,破解满天飞,Windows真的比linux那么不堪?国产软件为什么没什么破解版?还不是取决用户群体,而不是技术上的问题。因此我们未有选择加密狗,狗名气大了,反而更不安全。这块芯片是硬件级的安全,我们的CPU为什么能出低端的,高端的就弄不出来,不是理论的破解能力问题,制造工艺太弱了。这些芯片的破解 —— 抠开盖子,显微,只要制造技术能OK,本朝立马能山寨。这个“神秘”的芯片就不行了,抠开自毁。精密制造对于本朝来说,还是痛楚的。
硅的提存,切片,刻板 —— 硬件程序(各种指令,当然可能还要有寄存器)就这么出来的。
硬件程序留了编程接口,这就是我们通用CPU了,最最低端的比如一个加法器,或者自己用些二级管组合(没有参数可以写,这就是不可编程芯片了)。
硬件进一步进化,为了提高安全,又有了多模式;就像现在的防盗门也升级了,装修一个模式,使用一个模式。切换到使用模式,装修模式的权限变没有了。
跑操作系统了,它也得留接口啊,不留接口怎么跑我们的程序。然后各种虚拟机又提供各种奇葩入口点 —— 当时弄一个flash,弄到flash builder,没找到入口点,问一个开发了一年多的 —— 竟然不知,最后他终于找出来了,右键设置启动项...至于android这种 —— 不友好,个人还是喜欢代码式main。
先闲吹到此。