串口通讯这件事,说简单吧,2 3 5 三根线搞明白了就ok。说复杂吧,这里边的段子就多了。俺刚参加工作时,主要的工作就是搞这个的。那几年,连接了上百种不同型号的设备。
RS232串口通讯程序的开发
基本上常用的IDE工具都有串口通讯控件。C#下有SerialPort,Delphi下用 spcomm、cport、TMS(TMS是一整套控件包),Android 下有很多jar 。每个控件都有自己的特点,例如spcomm有个Wait for more 的功能,这个功能会把收到的数据分成一条一条的消息,而不是一个或几个字节,不过低版本的对于有些USB转串口的线有问题,需要找个高版本的(也可以自己改,反正有源码,这个其实是有些USB转串口的驱动没写好,这种驱动没写好的问题,遇到过几次。有一次有个usb的设备 在win7正常,在win10下就不稳定,也是查了好几天)。cport有个功能是能够直接设置管脚的高低电平,这个可以用来做信号灯。Android 下有些板子自带的SDK的串口通讯的例子是不稳定的,还不如chrome的jar。在开始写代码之前,推荐安装一个“virtual serial port driver”,添加一对互联的串口。这样可以方便在开发中调试(很久以前没有这个软件的时候,那时的台式机一般是有2个串口的。俺们就焊一根2、3交叉连接的线 ,插在机器的两个串口上)。如果有通讯协议,就可以先写个设备模拟器。例如下面这个一个贝克曼生化仪的模拟器。这个模拟器其实包含不少功能,有病人数据、建议结果的模拟。
其实很多项目的开发都是从模拟开始。(例如:开发一个PACS可以从模拟Dicom SCU开始,处理医保可以先写个医保的模拟dll,俺就写过东软医保、上饶医保,铁路医保的模拟。处理物流追踪的可以写个定位的模拟器。开发棋牌游戏可以写一个自动出牌的机器人……)。这样做好处有3点:
- 能更快的熟悉通讯协议
- 为之后的开发提供调试工具
- 便于测试人员进行测试
其中第3点最重要,很多和设备相关的项目在测试中需要这些模拟器。有了这些模拟器才能进行全流程测试、压力测试和稳定性测试。完成了这些测试,才能确保项目的实施和缩短实施的周期。 还可以开发个串口工具给同事用。例如下面这个就是写给同事用的。
比较麻烦的是那些没有通讯协议的开发。遇到过非常多的这样的情况。例如下图中右下角的那个图。
这个设备是法国的。右边那些图的数据没有任何说明。遇到这种情况就只能像解密一样猜来猜去。例如右下的那个彩色的图。那些红色、蓝色、绿色、黑色的点坐标,是来自不同的几个数组。图中的那些线的位置,就非常难找。后来记录了很多很多数据。然后反复的比较数据的不同,才摸索出那几根线的坐标是来自于数据的那一部分。有几个线的位置是来自一个角落里的几个百分比的数据。在没有通讯协议的情况下校验和的计算、正确应答也是要靠摸索。还好,常见的校验和算法就那几种。不过要注意的是:有时候要考虑字节是有符号的还是无符号的。其实C++、Java、C# 下计算出来的 “校验和”不一样,有时也是这个原因。
如果设备的通讯协议是比较完整的。例如有0x02,0x03这样的帧的标记,还有“校验和”的算法,有了这些,在解析通讯数据时还比较容易的。注意拼包和拆包(和socket一样)就可以。另外在处理收到的数据时,尽量不要执行一些耗时的操作(例如数据库操作)。拆包后,先回复应答消息,然后把收到的消息交给其他线程或者进程处理。
RS232串口通讯程序的调试
先说说串口通讯用的工具:
调试工具有很多种,有“串口助手”,“virtual serial port driver”、“Com Spy”这种软件工具,也有“示波器”、“y型线”,“电烙铁”等这种硬件。俺电烙铁的功夫还可以,焊点小而亮。俺用一个文件夹和一块木板改成了一个夹RS232头子的工具,蛮好用的。
首先,说一下串口通讯中最重要的一件事,“静电”。这个一定要注意,在连接设备之前,一定要确定设备、电脑是否正常接地。通讯线是否“接头”和“线的金属网”连接了。手上是否有静电?最好用万用表测一下外壳电压。俺的一个同事曾经造成了一个设备的串口模块烧了。现在还有RS232 的光电隔离器,有时候可以用一下,据说能够防雷。
串口通讯经常遇到的问题:
收不到数据
收不到数据有的原因有很多种,常用的处理方法如下。
- 查看通讯参数和连接线:先对比两边的通讯测试是否一致。查看线的接法是不是符合要求。“串口通讯不就是2、3、5”吗?真不是,如果“流控制”是“硬件控制”就需要连接更多的管脚,另外就是头子的外壳可以和线的金属网连起来。另外一些设备不是标准接法(或者通过各种跳针控制,设备可以通过跳针,更改管脚的使用)。俺曾经遇到过一个匈牙利的设备,是用1号管脚发送数据的。
- 如果确认第一步是正确的,那么就用其他的串口调试工具,用不同的通讯参数试试,例如改改“波特率”和“流控制”啥的试试(因为,有时候设备那边的设置不可信,例如说明书和设备不一致或者出厂就焊错了)。说起“串口调试工具”,常用的有“WinXP的超级终端”,“串口调试助手”,“Easy Com”等。超级终端的兼容性比较好,哪怕是波特率设置的不正确,它也能收到正确的数据,而其他的工具收到的可能是乱码。“Easy Com”的帮助最好,里面还有“y型线”的焊接法。
- 如果还是没有收到数据,问问同事有没有遇到过这种设备的。问问客户有没有更多的说明书,有没有设备配套的软件。有没有设备自带的串口线。如果有配套的软件,运行一下,可以用Com Spy监听一下通讯。Com Spy 是一个通过拦截API的来监听其他进程串口通讯的工具。
串口通讯的API 就那几个。其实就是文件操作的API。有些windows系统,在D盘新建一个文件名是“COM1”的文件,然后这个D盘就无法访问了(windows的一个bug)。 “拦截API”这个比较简单, Delphi的有这样的控件。控件这么一拖,就ok了。如果想多了解一下些这方面的知识,可以看看微软Detours的例子。Detours的早期版本的例子比较好玩(那时写Detours的那2个程序员还没有被微软收编)。有个例子就是通过拦截DirectX在魔兽世界里画三角形。看着魔兽世界里的人物头顶一个大大的彩色倒三角形走来走去,比较萌。
通讯不稳定
查查代码,看看日志。结合通讯协议分析日志。这里讲几个以前遇到事:
- 有一次省肿瘤医院反馈说有个仪器会丢数据。俺们就去调试,用笔记本调试,数据很正常,不会丢。但是在台式机上确实偶尔丢数据。然后,就只好用示波器进行调试。收发数据时,可以在示波器上看到一系列的方波。用了示波器之后发现通讯时电平有点偏低。可能笔记本上的串口比较敏感,所以不丢数据。然后把这个情况告诉给客户,客户联系了仪器厂商的工程师,后来换了个电容,通讯就不再丢数据了。
- 还有一次是做一个户外的广告牌的处理,这个广告牌还采集温度、噪声等一些数据。这个数据是通过串口采集的。一开始用的这个Android板子的厂家给的SDK中的例子进行串口通讯。总是会丢数据,然后用了y型线,做了一个旁路,连接到PC上。发现PC上不会丢数据,用了示波器查,电平也正常。后来就不用厂家的SDK换了其他的jar,数据就不会丢失了。
没有通讯协议
这是俺以前遇到最多问题。这个没有啥办法,就是靠摸索了。秘诀就一个:“耐心”。最怕的就是那些加密的数据,还要自己解密。
连接过的一些设备
生化类的一般是这个样子
血液分析的一般是这个样子
凝血的一般是这个样子
全自动酶免一般是这个样子
生化仪 7020,7060,7150,7170,7600,ADVI1650,AEROSET,AU640,AU800,BT2000,BT2245,BT2245A,CX3,CX4,CX5,CX7,CX9,COBAS,DIMENSION全系列,DT60,DT60 II,ENCORE,ENCORE II,LX20,M560,MIRA,RA1000,RA2000,RAXT,SABA18,SP4410,SP4430,SPRINT,TBA-40FR,TBA120FR,VTTROS250
血球仪 ABX-OT16,AC920,ACT-DIFF,ActDiff-2,ACTDIFF5,ADVIA60,BC3000,BT2100,CA570,CD1500,CD1600,CD1700,CD3000,CD3200,CD3500,CELLY,DANNO,DAMO,F800,F820,HC3180,HMX,JT/JT_IR,K1000,K4500,KX21,KX-21N,LH750,MAXM,MDCA530,MEK6108,MEK6308,MEK6318,MS9,MEK8118K,Micros60,ONYX,PENTRA60,SE9000,SF3000,SPIRIT,STKS,T540,XE2000,XE2000I,XT1800,XT2000,XT2000I
尿分仪 AJ4270,AM4290,AX4280,Clinitek100,Clinitek200,Clinitek500,CRYSTRON,FA150,H100,H300,Junior,Junior II,Miditron M,Miditron J,MS720,PROS300,UR200,UR300,URI2400,UriLuxs,USPro
血凝仪 ABL520,ACL100,ACL100A,ACL200,ACL300,ACL300A,ACL6000,Stago,ACL ADVANCE,BE_THR,CA1500,CA50,CA500,CA530,CA620,CA6000
血气仪 ABL5,ANL505,AVL COMPACT3,BG,CIBA288,Chiron850,IL508,IL620,IL MONARCH 1000,IL MONARCH 1500,IL MONARCH 2000,M850,Nova Synthis 15
酶标仪 550,960,3350,R680,CINIBIO 128,EL312E,BR680,M680,Elx800,MD2,MK2,MK3,MULTISKAN MS,SK318,STATFAC-1200
电解质 672PC,AC900,AVL9130,CIBA644,DSI全系列,EL-ISE,HC9886,NUCLEUS,XD683,XD685,XD687
化学发光 Access,ASC80,ACS180SE,ES1010,ES2010,DPC,IMMULITE
尿沉渣 DIASYS,UF50,UF100
特定蛋白 Array360,BN100,BN PRO,Immage,QuikRead
电泳仪 Elfo696,HEL QS,Hyrys,REP,REP II,HYRYS,SPIFE2000
酶免仪 Alisei,AXSYM,BEP2000,Evolis,Triturus
血流变 Easco-3010B,PLSH,N6A,N6B,R80
细菌仪 ATB,BT900,MicroScan WALKAWY系列,Vitek,Vitek32
放免仪 GC911,GC1200,SN695,SN695B,GMJ
糖化蛋白 DCA2000,Nycocard-Reader,Nycocard-Reader II,HLC-723-G7
病毒分析仪 DIESSE
PCR分析仪 LightCycler PCR
C反应蛋白 CRP,Quikread
荧光仪 Wallac
血小板凝集 Helena