. 使用MSComm控件进行串口编程
Microsoft Communication Control(MSComm)是Microsoft公司提供的Windows下串行通信编程的AcitiveX控件该控件具有丰富的与串口通信密切相关的属性及事件提供了一系列标准通信命令接口可以用它创建全双工事件驱动高效实用的通信程序MSComm控件通过串口传输和接收数据为应用程序提供串行通信功能
MSComm的主要属性及事件
() CommPort设置或返回串行端口号缺省值
() Setting设置或返回串口通信参数格式为波特率奇偶校验位数据位停止位
() PortOpen打开或关闭串行端口
() InBufferSize设置或返回接收缓沖区的大小缺省值为字节
() InBufferCount返回接收缓沖区内等待读取的字节数可通过设置该属性为来清空接收缓沖区
() RThreshold该属性为一阀值它确定当接收缓沖区内的字节个数达到或超过该值后就产生代码为ComEvReceive的OnComm事件
() SThreshold该属性为一阀值它确定当发送缓沖区内的字节个数少于该值后就产生代码为ComEvSend的OnComm事件
() InputLen设置或返回接收缓沖区内用Input读入的字节数设置该属性为表示Input读取整个缓沖区的内容
() Input从接收缓沖区读取一串字符
() InputMode返回从Input中取回的数据类型可以是ANSI码和二进制数据数组
() OutBufferSize设置或返回发送缓沖区的大小缺省值为字节
() OutBufferCount返回发送缓沖区内等待发送的字节数可通过设置该属性为来清空缓沖区
() OutPut向发送缓沖区传送一串字符
如果在通信过程中发生错误或事件就会触发OnComm事件并由CommEvent属性代码反映错误类型在通信程序的设计中可根据该属性值来执行不同的操作CommEvent属性值及其含义如下
() ComEvSend值为发送缓沖区的内容少于SThreshold指定的值
() ComEvReceive值为接收缓沖区内字符数达到RThreshold指定的值
() ComEvFrame值为硬件检测到帧错误
() ComEvRxOver值为接收缓沖区溢出
() ComEvTxFull值为发送缓沖区溢出
() ComEvRxParity值为奇偶校验错误
() ComEvEOF值为接收数据中出现文件尾(ASCII码为)字符
所以MSComm控件主要提供下列两种处理通信的方式
() 事件驱动通信方式当串口发送或接收到数据时可以利用MSComm控件OnComm事件捕获并处理这些通信事件OnComm事件还可以检查和处理通信错误
() 查询方式在关键程序之后可以通过检查CommEvent属性来查询事件和错误
系统功能设计
本远程数据采集子系统就是利用MSComm控件通过Moderm同远端的下位机进行通信发送命令获得下位机采集的实时数据通信流程如下
当PC机检测到下位机摘机的信号将控制命令写入MSComm的发送缓沖区控制命令为定长的数据报格式如下
其中当命令代码不是向下位机要数据的命令的时候起始时间和终止时间均为下位机上传的数据报也为定长数据报格式如下
数据报标志表明正在传输是数据为xFFFF数据报序号说明当前传输的是第几个数据报当序号校验码出错时PC机停止接收数据并向下位机发重传命令此时控制命令的起始时间字段填入需要重传的数据报的序号最后一个数据报将结束标志置为xFFFF检测线程检测到该标志时认为数据接收完毕向主线程发消息通知主线程做进一步的处理
数据传输模式采用二进制数据流形式即MSComm的InputMode属性设置为ComInputModeBinary收到数据之后使用如下程序进行转换
vDataBuffer: oleVariant;
DataBuffer: variant;
vDataBuffer := MSCommInput;
DataBuffer := VarArrayCreate([] varByte);
DataBuffer := vDataBuffer;
主线程向下位机发要数据命令的同时生成检测线程每收到个字节检测线程对收到的数据报的结束标志和数据报序号进行检验发现数据报序号错误立即向主线程发错误消息主线程停止从缓沖中取数据向下位机发重传数据报的命令检测线程发现数据报接收完毕向主线程发消息主线程结束检测线程回收资源
结论
整个系统在远程心电医疗诊断软件上已经得到了应用实际运行表明该通信方式简单可靠稳定具有比较高的效率和很好的差错控制功能可供其他远程通信系统借鑒参考
[] []