终端窗口里的光标一闪一闪的,跟喘不上气似的。我死盯着满屏滚动的十六进制数据,心里跟明镜似的:就差一个参数没对上,全变乱码了。以前总觉得这玩意儿玄乎。后来硬着头皮啃完李现勇的《Visual C++串口通信技术与工程实践》,才咂摸过味儿来。什么底层通信啊,说白了,就是机器在笨拙地学怎么跟人“打招呼”。
刚到手那阵子,我是真抗拒。翻开书,好家伙,RS-232C、RS-485、IEEE 1284,外加一大坨AT指令集和传真协议,冷冰冰的,像极了摊在桌上的工业图纸。妥妥的API字典。我本来指望速查速用,结果耐着性子往下读,味儿不对。作者不直接把代码糊你脸上。他拎着你逛厂房。这根线咋走的,那个寄存器凭啥置位,连调试精灵的封装步骤,都拆成零件摆你眼前。翻到MSComm控件和底层API对比那节,我手指头在屏幕上悬了半天。以前写代码,我专挑捷径。拖控件,绝不碰API。书里说得直白:控件是拐杖,API才是你自己的腿。这话放现在,未必全对。现在封装库多如牛毛,真去搓CommState结构体、抠OnComm事件的,估计只剩我们这些死磕底层的老骨头了。可你非要深究下去,才算摸到门道。听见电流顺着端口往里钻的动静。
想起去年冬天。为了调一个老设备的采集程序,我在机房连熬三个大夜。那台破机器掉线跟闹脾气似的,屏幕上的数据断断续续,抽筋一样。翻手册。拔插线。换驱动。手边的冷咖啡都结出厚厚一层膜,头发快薅秃了。那时候光觉得是技术墙撞得脑仁疼。现在再琢磨,其实就是场死磕的“对齐”。书里一遍遍敲黑板:波特率、数据位、停止位、校验位,必须严丝合缝。机器不认人情。它只认规则。你发115200,它收9600,算法再牛也得歇菜。这死规矩刚看的时候,憋屈。翻多了,心里反倒踏实。至少这儿不玩虚的。参数对上,回音肯定在那儿。不敷衍。不扯皮。更不会冷不丁断线。跟这破硬件打交道,你越较真,它越老实。
书的后半截,聊到PLC、单片机,还有串并口在工程里的落地。我本来以为又是些不痛不痒的通用案例。结果呢?数据封装的字节对齐,异常时的重传机制,作者掰开揉碎,全给你摊平了。最带劲的是,他单开一章讲怎么搭“串口编程调试精灵”。写工具的人,大多图个“能跑就行”。他倒好,把这小软件当正经项目死磕。界面格子怎么排,日志级别怎么切,参数怎么存本地。看到这儿,我直拍大腿。咱们搞技术的,往往就贪那“跑通”一瞬间的爽。光顾着往前跑,忘了工具本身,也是给人用的。你敲下的每一行封装代码,说白了,就是在给未来的自己,或者将来接盘的人,提前填坑。不过话说回来,书里的C++写法确实有点年头了。现在玩Win32 API的少了。但那种“把工具当产品做”的较真劲儿,放哪儿都管用。
书合上的时候,外头天早黑透了。低头瞅了眼桌角那根落灰的DB9串口线,金属头氧化得发暗。以前总觉着,串口是上个世纪的破烂,早该被USB和以太网拍在沙滩上。但书里那些实打实的工程底子,给我上了一课。有些连接,越往下挖,越得端着点敬畏心。咱们天天在代码里写协议、建握手、扔数据。表面上是指使机器。实际上,干的活儿跟过日子没啥两样。人跟人打交道,不也像跑串口吗?大家都带着各自的波特率和校验位撞见。节奏对不上,就乱码。没完成握手,就断连。可只要你肯停下手里的活儿,慢慢调参数,耐着性子等那个ACK信号弹回来。话,总能说透。这道理听着有点矫情。但干咱们这行的,都懂。端口还哑着。但我心里有数。线没接岔,它准会吭声。