科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件Delphi实现远程串口的数据采集

Delphi实现远程串口的数据采集

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文介绍了在Windows平台下串口开发的方法,并给出一个使用Delphi设计的远程数据采集的实例。

作者:YDX 来源:论坛 2007年10月31日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
(4) 创建串口监视线程监视串口事件。首先使用WaitForSingleObject()、WaitForCommEvent()、WaitForMultipleObjects()等等待函数对线程进行控制,当没有数据收发时,将线程阻塞,减少其CPU的资源占用;当有数据收发时,线程自动启动,完成数据的收发。最后调用CreateThread()函数启动线程。

  (5) 串口使用结束,用CloseHandle()函数关闭串口,回收资源。

  由此可见,利用Win32 API函数编写串口通信程序比较复杂,需要掌握大量的系统和通信知识,其优点是实现的功能强大,应用面广泛,适合编写较为复杂的地层次应用程序。

  3. 使用MSComm控件进行串口编程

  Microsoft Communication Control(MSComm)是Microsoft公司提供的Windows下串行通信编程的AcitiveX控件。该控件具有丰富的与串口通信密切相关的属性及事件,提供了一系列标准通信命令接口,可以用它创建全双工、事件驱动、高效实用的通信程序。MSComm控件通过串口传输和接收数据,为应用程序提供串行通信功能。

  MSComm的主要属性及事件:

  (1) CommPort:设置或返回串行端口号,缺省值1;

  (2) Setting:设置或返回串口通信参数,格式为"波特率,奇偶校验位,数据位,停止位";

  (3) PortOpen:打开或关闭串行端口;

  (4) InBufferSize:设置或返回接收缓冲区的大小,缺省值为1024字节;

  (5) InBufferCount:返回接收缓冲区内等待读取的字节数,可通过设置该属性为0来清空接收缓冲区;

  (6) RThreshold:该属性为一阀值,它确定当接收缓冲区内的字节个数达到或超过该值后就产生代码为ComEvReceive的OnComm事件;

  (7) SThreshold:该属性为一阀值,它确定当发送缓冲区内的字节个数少于该值后就产生代码为ComEvSend的OnComm事件;

  (8) InputLen:设置或返回接收缓冲区内用Input读入的字节数,设置该属性为0表示Input读取整个缓冲区的内容;

  (9) Input:从接收缓冲区读取一串字符;

  (10) InputMode:返回从Input中取回的数据类型,可以是ANSI码和二进制数据数组;

  (11) OutBufferSize:设置或返回发送缓冲区的大小,缺省值为512字节;

  (12) OutBufferCount:返回发送缓冲区内等待发送的字节数,可通过设置该属性为0来清空缓冲区;

  (13) OutPut:向发送缓冲区传送一串字符。

  如果在通信过程中发生错误或事件,就会触发OnComm事件,并由CommEvent属性代码反映错误类型,在通信程序的设计中可根据该属性值来执行不同的操作。CommEvent属性值及其含义如下:

  (1) ComEvSend:值为1,发送缓冲区的内容少于SThreshold指定的值;

  (2) ComEvReceive:值为2,接收缓冲区内字符数达到RThreshold指定的值;

  (3) ComEvFrame:值为1004,硬件检测到帧错误;

  (4) ComEvRxOver:值为1008,接收缓冲区溢出;

  (5) ComEvTxFull:值为1010,发送缓冲区溢出;

  (6) ComEvRxParity:值为1009,奇偶校验错误;

  (7) ComEvEOF:值为7,接收数据中出现文件尾(ASCII码为26)字符。

  所以,MSComm控件主要提供下列两种处理通信的方式:

  (1) 事件驱动通信方式。当串口发送或接收到数据时,可以利用MSComm控件OnComm事件捕获并处理这些通信事件。OnComm事件还可以检查和处理通信错误。

  (2) 查询方式。在关键程序之后可以通过检查CommEvent属性来查询事件和错误。

  3 系统功能设计

  本远程数据采集子系统就是利用MSComm控件,通过Moderm同远端的下位机进行通信,发送命令,获得下位机采集的实时数据,通信流程如下:



  当PC机检测到下位机摘机的信号,将控制命令写入MSComm的发送缓冲区,控制命令为定长的数据报,格式如下:



  其中,当命令代码不是向下位机要数据的命令的时候,起始时间和终止时间均为0。下位机上传的数据报也为定长数据报,格式如下:



  数据报标志表明正在传输是数据,为0xFFFF,数据报序号说明当前传输的是第几个数据报,当序号校验码出错时,PC机停止接收数据,并向下位机发重传命令,此时控制命令的起始时间字段填入需要重传的数据报的序号。最后一个数据报将结束标志置为0xFFFF,检测线程检测到该标志时,认为数据接收完毕,向主线程发消息,通知主线程做进一步的处理。

  数据传输模式采用二进制数据流形式即MSComm的InputMode属性设置为ComInputModeBinary,收到数据之后使用如下程序进行转换:

vDataBuffer: oleVariant;
DataBuffer: variant;
vDataBuffer := MSComm1.Input;
DataBuffer := VarArrayCreate([0,2048], varByte);
DataBuffer := vDataBuffer;

  主线程向下位机发要数据命令的同时,生成检测线程,每收到1032个字节,检测线程对收到的数据报的结束标志和数据报序号进行检验,发现数据报序号错误立即向主线程发错误消息,主线程停止从缓冲中取数据,向下位机发重传数据报的命令。检测线程发现数据报接收完毕,向主线程发消息,主线程结束检测线程,回收资源。

  4 结论

  整个系统在远程心电医疗诊断软件上已经得到了应用,实际运行表明,该通信方式简单、可靠、稳定,具有比较高的效率和很好的差错控制功能,可供其他远程通信系统借鉴参考。

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章