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

2016-01-29 14:27 48 1 收藏

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

【 tulaoshi.com - Delphi 】

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

  关键词:远程数据采集 AcitiveX MSComm控件

  1 引言

  在工业生产实践中,使用PC机对Inprise公司推出的Delphi是一种功能强大的高级编程语言,其具有可视化面向对象的特征,特别适合Windows平台下的图形界面和用户程序的编制。本文就介绍在Windows平台下用Delphi开发串口的方法和使用Delphi设计的一个实现远程串行数据采集的实例。

  2 串口工作原理及软件实现方法

  串口进行通信的方式有两种:同步通信方式和异步通信方式。同步通信方式要求通信双方以相同的时钟频率进行,而且准确协调,通过共享一个单个时钟或定时脉冲源保证发送方和接收方的准确同步,效率较高;异步通信方式不要求双方同步,收发方可采用各自的时钟源,双方遵循异步的通信协议,以字符为数据传输单位,发送方传送字符的时间间隔不确定,发送效率比同步传送效率低。

  在Windows平台下,Win32 API支持同步和异步两种I/O操作。同步操作的方式的程序设计相对比较简单,但是I/O操作函数在I/O操作结束前不能返回,这将挂起调用线程,直到I/O操作结束;异步操作方式要相对复杂一些,但是可以让I/O操作在后台运行,而不会挂起调用线程,这在大数据量通信情况下对改善调用线程的响应速度是相当有效的。同时由于Win9x和WinNT下对串行通信的处理不同,这就导致了在Win9x下开发的同步方式串行通信程序在NT下会发生工作线程之间的协作阻塞,即当读线程在等待WaitCommEvent的时候,写线程不能正常工作,停在那里,整个程序处于瘫痪状态。这个问题是Windows的API函数处理串行通信的一个BUG,所以对于适应性强的程序都是选择异步方式。下面,本文对在Windows平台下对串口进行开发的方法进行介绍:

  1. 汇编程序直接读写串口

  汇编语言的编译效率和执行效率都很高,使用汇编语言直接对串口进行操作可以部分弥补串行通信速度较慢的缺陷,具体做法是:用汇编语言编写读、写串口的函数,在通信程序中直接调用,或者在Delphi中直接内嵌汇编程序进行对端口的读写。

  例如:

asm
mov dx,0001h
mov ax,005eh
int 14h
end;

  这样可以达到直接读到端口的效果。但是在WinNT和Win2000下,系统使用了保护机制,不允许用户态的程序直接读取端口,所以在WinNT和Win2000下,这种方法不能被允许执行。Ring3的用户态的程序要进入Ring0去读写端口必须先提供一个驱动(sys)程序,然后通过DLL导出函数供用户程序调用,显然,这种方法比较不容易实现。

  2. 使用API函数进行串口编程

  Windows系统通信一般都以WOSA(Windows Open Service Architecture,即Windows开放式服务体系)模型为基础,在此模型中位于上层的应用程序通过调用各种通信API(Application Programming Interfaces,即应用程序接口)与位于下层的设备驱动程序进行数据交换。

  在Windows平台下,Windows将设备看作是文件进行管理,对设备的操作也可以看作是对文件的操作。Win32 API提供了CreateFile(),WriteFile(),ReadFile(),WaitForSingleObject(),WaitForMultipleObjects(),CreateEvent(),CreateMutex(),CreateSemaphore(),CreateThread()等函数,其基本步骤如下:

  (1) 利用CreateFile()函数打开串口。该函数有七个参数,其中dwCreationDistribution参数取OPEN_EXISTING,表明打开的串口对应于实际的物理串口;lpFileName参数是要打开的串口名称,如"COM1";DwFlagsAndAttributes参数决定对串口的操作是同步操作还是异步操作;DwDesiredAccess参数是访问方式,可取GENERIC_READ或GENERIC_WRITE;DwShareMode参数是共享模式,对串口物理设备必须取0;LpSecurityAttributes参数是安全属性,取值为NULL;DwFlagsAndAttributes是文件属性和标识,一般取值为FILE_ATTRIBUTE_NORMAL。该函数返回串口操作的句柄。

  (2) 对该串口句柄对应的设备进行配置,如波特率、数据位、停止位、是否奇偶校验等。这部分首先使用GetCommState()函数得到当前的串口配置信息,将这些信息存放在一个DCB结构中,然后对该DCB结构里面的内容进行重新按要求设置,最后调用SetCommState()函数使修改的设置生效。

  (3) 配置串口事件。SetCommMask()函数可以设置多个串口信息事件,其串口的信息事件可以是以下任意的组合:

EV_BREAK:在输入时Windows检测到中断;
EV_CTS :CTS信号改变状态;
EV_DSR :DSR信号改变状态;
EV_ERR :发生线状态错误;
EV_RING

来源:https://www.tulaoshi.com/n/20160129/1493383.html

延伸阅读
单例模式用于限制进程中只有一个某个类的对象,本例的Singleton是一个线程实例,在每一个时钟到达时检测是否到达某个时刻(本例的时刻存于Ini文件中),如果到达则产生一个线程,但是如果在这个线程完成其任务前又到达一个时钟,则有可能会产生多个线程执行任务,以致出现混乱,所以考虑使用Singleton模式解决这个问题(当然还有其他解决方案,...
控制WINDOWS的开关:如关闭WINDOWS,重新启动WINDOWS等, ExitWindowsEx(UINT uFlags,DWORD dwReserved);是实现这一功能的API函数 首先定义常数 const EWX_FORCE=4; //关闭所有程序并以其他用户身份登录 EWX_LogoFF=0; //重新启动计算机并切换到MS-DOS方式 EWX_REBOOT=2; //重新启动计算机 EWX_SHUTDOWN=1;//...
孩子听觉信息采集的重要性 听觉信息采集 听觉信息在孩子成长过程中会起到什么样的作用呢? 听觉采集信息的重要性 在所有的采集信息方式中,听觉采集是人类逻辑思维最为依赖的两种采集方式之一(另一种是视觉采集),尤其是对于处在逻辑思维创建和丰富成长初期的孩子。 我们说,因为生存遗传性逻辑思维的存在,人类逻辑思维的外在的表现形态...
标签: Delphi
在数据库管理系统中,数据录入是数据处理的基本功能,录入操作方便与否是衡量数据库应用程序交互良莠的指标之一。录入中除了应要对录入数据进行合法检验外,还应为用户提供更多的方便操作,即对于“规范性”数据,如:性别、职称等字段的数据,应尽可能供用户“选择”录入,而非直接文字输入,另外,如:出生年月、联系电话、邮编等类似...
在Windows95/98中,都是使用注册表对系统数据进行管理,有关壁纸的设置数据保存在Hkey_Current_UserControl PanelDesktop的Wallpaper和TileWallpaper 等键值中,只要成功修改了这两个键值,然后发消息给Windows即可更换壁纸。在本例的程序中,使用了一个Tform;两个Tspeedbutton(Speedbutton1用于接受用户的浏览命令,Speedbutton2用于接受用户的...

经验教程

485

收藏

81
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部