Delphi教程-Delphi串口通信编程_第1页
Delphi教程-Delphi串口通信编程_第2页
Delphi教程-Delphi串口通信编程_第3页
Delphi教程-Delphi串口通信编程_第4页
Delphi教程-Delphi串口通信编程_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Delphi教程第12章Delphi串口通信编程用Delphi实现串口通信,最常用的几种方法为:使用API函数、使用组件(如MSComm等)或者在Delphi中调用其他串口通信程序。12.1

RS-232C标准所谓串行通信接口标准,是指串行通信接口与外设的信号连接标准。实际中常用的串行通信接口标准有3种:

RS-232C,RS-422A/423A和20mA电流环。常用的PC机都配置了RS-232C标准接口。RS-232C标准常简称为RS-232。RS-232C的定义包括电气特性(如电压

值)、机械特性(如接头形状)及功能特性(如脚位信号)等。串行通信接口基本功能是:在发送时,把

CPU送来的并行码转换成串行码,逐位地依

次发送出去;在接收时,把发送过来的串行码逐位地接收,组装成并行码,并行地发送给CPU去处理。这种串行到并行转换的功能,常用硬件电路来实现,这种硬件电路叫做串行通信接口。普通的Modem通常都是通过RS-232C串行口信号线与计算机连接。根据RS-232C标准规定,接口电路采用一对物理D型连接器:DTE设备应该有一个D型插头接口,DCE设备应该有一个D型插座接口。D型连接可以是25芯(简称为DB25),也可以是9芯(简称为DB9)。RS-232C引脚分配如图12-1所示。图12-1

DB25与DB9引脚分配图12.1.1信号连接RS-232C规定使用一种DB25连接器,其中20个脚作了定义,9、10、11、18、25未作定义。RS-232C串行口信号分为3类:传送信号、联络信号和信号地。1.传送信号(TxD和RxD)传送信号是经由(发送数据信号线,引脚2)传送和(接收数据信号线,引脚3)接收的信

息格式即一个传送单位(字节)由起始位、数据位、奇偶校验和停止位组成。2.联络信号(RTS、CTS、DTR、DSR、DCD和RI等6个信号)RTS(请求传送,引脚4),是PC向Modem发出的联络信号。高电压表不PC机请求向

Modem传送数据。CTS(清除发送,引脚5),是Modem向PC机发出的联络信号。高电压表示Modem响应

PC发出的RTS信号,且准备向远端Modem

发送数据。DTR(数据终端就绪,引脚),是PC向Modem发出的联络信号。高电压表示PC机

处于就绪状态,本地Modem和远端Modem之间可以建立通信信道。若为低电平,则强迫

Modem终止通信。DSR(数据装置就绪,引脚),是Modem向PC发出的联络信号。它指出本地Modem的工作状态,高电压表示Modem没有处于测试通话状态,可以和远端Modem建立通道。DCD(传送检测,引脚),是Modem向PC

发出的状态信号,高电压表示本地DCE接收远端Modem发来的载波信号。RI(铃指示,引脚),Modem向PC发出的状态信号。高电压表示本地Modem收到远端

Modem发来的振铃信号。3.SG(信号地)SG(信号地,引脚)为相连的PC和Modem提供同一电势参考点。12.1.2握手DTE和DCE之间要实现双向通信,至少需要3条信号线:TxD使数据从DTE到ECE。RxD使数据从ECE到ETE,SG为信号地。必须使用握手信号,它提供了一种控制数据流的方法,即接收设备可以控制发送设备的数据发送。在异步串行通信中,这称之为握手(handshaking)或流量控制(flowcontrol)。握手控制可以具体分为硬件握手(硬件流控)和软件握手(软件流控)。1.硬件握手硬件握手是使用专门的握手电路去控制数据的传输。当接收设备准备好之后,就通过专用的握手电路传送一个正电压给发送设备,指示发送设备数据。如果接收传送一个负电压给发送设备,则指示发送设备停止发送数据。为了完成数据通信需要有3类电路:数据线、信号线和握手线。(1)DTE到DCE为了控制DTE的发送数据,DCE使用DSR信号作为主握手信号去通知DTE已做好接收数据库的准备。当通知DTE暂停发送数据时,置DSR无效。DCE到DTE为了控制DCE的数据发送,DTE使用DTR信号作为主握手信号去通知DCE已做好接收数据的准备。当通知DCE暂停发送数据时,置DTR无效。DTE还使用RTS信号作为第二握手信号控制DCE设备。仅当这两条握手线都有效时,

DCE才发送数据。双向通信双向通信中只使用主握手线,则共需要5条信号线:TxD、RxD、DSR、DTR和SG。如果还使用第二握手线,则共需要7条信号线。为了使DCE能向DTE提供更多信息,通常还使用RI和DCE两条信号线。这样一个完整的异步串行通信必需的就是这9条信号线。2.软件握手软件握手的原理机制与硬件握手基本相同,不同的握手信号是在数据线(TxD和RxD)上进行传送的,而不是在专门握手线上传送。这是因为软件握手信号是由特殊字符组成的,所以传送这些字符必须使用数据电路,而不

是使用专门握手电路。这种方法常用在直接

连接或通过Modem连接的两台计算机之间进

行双向通信的场合。RIDTRDCTSGDSRRTSCTSRxDTxD2345678202223456782022图12-2有握手功能的双向通信软件握手最常用的协议是XON/XOFF协议。该协议主要解决通信双方处理速度不区配的问题,协议规定发送XOFF表示暂停发送数据,发送XON表示继续发送数据。3.硬件与软件相结合的握手为了综合硬件握手和软件握手的好处,可以采用硬件和软件相结合的握手控制。假设

DTE设备为计算机,DCE设备为Modem,两台计算机之间通过Modem经电话线连接,则此时计算机与Modem之间可采用硬件握手方法,而两台计算机之间可以使用软件握手方法进行联系。12.1.3微机的RS-232C接口个人计算机的RS-232C接口名称有多个:

RS-232C口、串口、通信口、COM口、异步口等。目前DOS3.3以上版本和Windows

3.2/98/NT最多支持4个串口:COM1、COM2、COM3和COM4。它们所占用的I/O口地址和中断号见表:为一更好地说明RS-232C接口电路的实际工作情况,下面以应答呼叫过程为例,具体分析其信号间的交互关系。所谓应答呼叫过程,即指Modem从接收到振铃信号开始,到数据传输结束后Modem和DTE恢复到原来的空闲状态为止的过程。(1)数据终端DTE的控制软件持续监视振铃指示(RI),等待该信号有效。引脚连线如图:CTS,清除发送DSR,DCE准备就绪SG,信号地DCT,载波检测DTR,DTE准备就绪RI,振铃指示RTS,请求反送RxD,接收数据TxD,发送数据2345678202223456782022图12-3DTE和Modem的引脚边线响铃后,Modem在振铃脉冲期间发出振铃指示信号(RI有效),在振铃脉冲间隔期间,振铃指示信号有效。即随着振铃脉冲的有无,

RI信号ON/OFF交替变化。DTE的通信控制软件在检测到振铃指示后,开始通过计算机振铃指示ON/OFF变化的次

数对振铃进行计数。当达到程序预置好的振铃数时,控制软件发出数据终端就绪信号(DTR有效),迫使Modem进入摘机状态,开始应答电话。Modem在等待一小段时间后,自动地发送它的应答载波信号。同时Modem发出数据设备就绪信号(DSR信号有效),通知DTE已完

成所有准备工作,正在等待对方载波信号。在DTE发出数据终端就绪信号(DTR有效)期间,DTE的控制软件监视数据设备就绪信号(DSR是否有效)。当DSR变为ON状态后,DTE便知道了Modem已准备建立数据链路,于是DTE开始监视载波检测(DCD)信号,以检查数据链路是否已建立。当主叫Modem的载波信号出现在电话线上时,被叫Modem就发出载波检测信号(DCD),通知DTE已建立数据链路。在数据链路连接期间,发送数据(TxD)和接收数据(RxD)线上即开始了全双工通信。同时,DTE仍监视着载波检测(DCD)信号,以确定数据链路是否连接。(8)数据传输结束后,DTE使数据终端就绪信号(DTE无效),Modem撤消载波信号并以载波检测(DCD)和数据设备就绪(DSR)信号无效给予响应。数据链路释放后,Modem和DTE准备下一次接收或作另一次呼叫。12.2串行口API函数12.2.1常用的串行通信操作函数

1.CreateFileCreateFile创建或打开一下的对象并返回句柄完整定义:Handle

CreateFile(LPCTSTR

lpFileName,//文件名DWORD

dwDesireAccess,//访问模式(读/写)DWORD

dwShareMode,

//共享模式LPSECURITY_ATTRIBUTES

lpSecurityAttributes,//安全属性DWORD

dwCreationDistribution,//文件已经存在或不存在时的处理方法DWORD

dwFlagsAndAttributes,//文件属性,对于串口来说有意义的属性只有FILE_FLAG_OVERLAPPED,表示端口的I/O可以在后台进行(后台IO也叫异步IO)HANDLE

hDemplateFile//复制制定文件的扩展属性);2.CloseHandleCloseHandle函数关闭一个已打开的对象句柄,完整定义:BOOL

CloseHandle(HANDLE

hObject

//句柄);3.SetupCommSetupComm为通信设备初始化参数(设置通信缓冲区的大小),完整定义;BOOL

SetupComm(HANDLE

hFile,//句柄DWORD

dwInQueue,//输入缓冲区的大小DWORD

dwOutQueue//输出缓冲区的大小);4.ReadFileReadFile同步或异步从文件读取数据,在读之前可能要调整文件指针的位置,完整定义:BOOL

ReadFile(HANDLE

hFile,//句柄LPVOID

lpBuffer,//接收数据的缓冲区地址DWORD

nNumberOfBytesToRead,//读取的字节数LPDWORD

lpNumberOfBytesRead,//读取字节数的地址LPOVERLAPPED

lpOverlapped//当打开文件制定dwFlagsAndAttributes参数为FILE_FLAG_OVERLAPPED时,这个参数就必须应用一个特殊的结构,结构中定义一次异步读操作。否则,该参数应置为空。);5.WriteFileWriteFile同步或异步写数据到文件中,在写之前可能要调整文件指针的位置,完整定义:BOOL

WriteFile(HANDLE

hFile,//句柄LPCVIOD

lpBuffer,//指向缓冲区的数据DWORD

nNumberOfBytesToWrite,//要写的字节数LPDWORD

lpNumberOfBuffersWritten,//返回实际写的字节数LPOVERLAPPED

lpOverlapped//当打开文件指定dwFlagsAndAttributes参数为FILE_FLAG_OVERLAPPED时,这个参数就必须引用一个特殊的结构,结构中定义一次异步写操作。否则,该参数应置为空。);6.Set

CommStateSetCommState用制定的DCB结构设置通信参

数,将重新初始化硬件和控制设置,但不会清空输入输出缓冲区。DCB结构中包含波特率、数据位、校验位、停止位和流控制方式等信息。完整定义:BOOL

SetCommState(HANDLE

hFile,//句柄LPDCB

lpDCB//指向硬件控制块);7.GetCommStateGetCommState返回当前通信参数的DCB结构。

DCB结构中包含波特率、数据位、校验位、停止位和流控制方式等信息,完整定义:BOOL

GetCommState(HANDLE

hFile,//句柄LPDCB

lpDCB//指向硬件控制块);ClearCommErrorClearCommError清除串口错误并获取当前状态(可以返回接收缓冲区中处于等待状态的字节数)。完整定义:BOOL

ClearCommError(HANDLE

hFile,//句柄LPDWORD

lpErrors,//接收错误代码LPCOMSTAT

lpStat//指向通信设备的状态缓冲区);BuildCommDCBBuildCommDCB函数用制定的设备控制串填充DCB结构,设备控制串可用相应的模式控制命令得到。要使设置生效,还需调用SetCommState。完整定义:BOOL

BuildCommDCB(LPCTSTR

lpDef,//指向设备控制串LPDCB

lpDCB//指向设备控制块);10.BuildCommDCBAndTimeoutsBuildCommDCBAndTimeouts函数用指定的设备控制串填充DCB结构,并设置超时值、未超时值。设备控制串可用相应的模式控制命令得到。这个函数综合了BuildCommDCB和SetCommTimeouts两个函数,完整定义:BOOL

BuildCommDCBAndTimeouts(LPCTSTR

lpDef,//设备控制串LPDCB

lpDCB,//设备控制块LPCOMMTIMEOUTS

lpCommTimeouts//超时结构);11.ClearCommBreakClearCommBreak函数恢复发送缓冲区中的数据传送,并把线路置为nonbreak状态(可参阅SetCommBreak和TransmitCommChar)。完整定义:BOOL

ClearCommBreak(HANDLE

hFile//句柄);12.CommConfigDialogCommConfigDialog函数显示配置端口的对话框,完整定义:BOOL

CommConfigDialog(LPTSTR

lpszName,//设备名字字符串HWND

hWnd,//窗口句柄LPCOMMCONFIG

lpCC//Comm配置结构);13.DeviceIoControlDeviceIoControl函数直接发送控制指令到指定的设备,让设备执行特定的操作。完整定义:BOOL

DeviceIoControl(HANDLE

hDevice,//句柄DWORD

dwIoControlCode,//控制指令LPVOID

lpInBuffer,//指定指令所需的数据缓冲区DWORD

nInBufferSize,//lpInBuffer缓冲区的大小LPVOID

lpOutBuffer,//指定指令返回的数据缓冲区DWORD

nOutBufferSize,//lpOutBuffer缓冲区的大小LPDWORD

lpBytesReturned,//lpOutBuffer缓冲区返回数据的实际大小LPOVERLAPPED

lpOverlapped//指向Overlapped结构);14.EscapeCommFunctionEscapeCommFunction函数直接让设备执行指定的扩展操作,用于完全控制端口。完整定义:BOOL

EscapeCommFunction(HANDLE

hFile,//句柄DWORD

dwFunc//要执行的扩展功能);GetCommConfigGetCommConfig函数获得当前设备的设置,王政定义:Bool

GetCommConfig(HANDLE

hCommDev,//句柄LPCOMMCONFIG

lpCC,//Comm配置结构地址LPDWORD

lpdwSize//缓冲区大小);GetCommMaskGetCommMask函数返回指定的设备的事件掩码,完整定义:BOOL

GetCommMask(HANDLE

hFile,//句柄LPDWORD

lpEvtMask//返回的事件掩码);GetCommModemStatusGetCommModemStatus函数返回Modem的控制寄存器的值,完整定义:BOOL

GetCommModemStatus(HANDLE

hFile,//句柄LPWORD

lpModemStat//控制寄存器的值);GetCommPropertiesGetCommProperties函数返回指定设备的属性。在调用SetCommState之前常用此函数判断是否支持指定的设置值,例如,是否支持的波特率等。完整定义:BOOL

GetCommProperties(HANDLE

hFile,//句柄LPCOMMPROP

lpCommProp//属性结构);19.GetCommStateGetCommState函数返回指定设备当前设置的设备控制块,完整定义:BOOL

GetCommState(HANDLE

hFile,//句柄

LPDCB

lpDCB//设备控制块);20.GetCommTimeoutsGetCommTimeouts函数返回指定设备的所有读写操作超时值,完整定义:BOOL

GetCommTimeouts(HANDLE

hFile,//句柄LPCOMMTIMEOUTS

lpCommTimeouts//超时结构);21.GetDefaultCommConfigGetDefaultCommConfig函数返回通信设备的默认值配置,完整定义:BOOL

GetDefaultCommConfig(LPCSTR

lpszName,//设备名字符串LPCOMMCONFIG

lpCC,//配置结构LPDWORD

lpdwSize

//结构的大小);22.PurgeCommPurgeComm函数取消输入或输出缓冲区的所有字符,并中止悬而未决的读或写操作,完整定义:BOOL

PurgeComm(HANDLE

hFile,//句柄DWORD

dwFlags//取消操作的参数);SetCommBreakSetCommBreak函数暂停发送缓冲区的数据传送,并把线路为break状态,直到调用ClearCommBreak时才恢复。完整定义:BOOL

SetCommBreak(HANDLE

hFile//句柄);SetCommConfigSetCommConfig函数设置通信设备的当前配置,完整定义:BOOL

SetCommConfig(HANDLE

hCommDev,//句柄

LPCOMMCONFIG

lpCC,//配置结构DWORD

dwSize

//结构的大小);25.SetCommMaskSetCommMask函数设置指定设备的事件掩码。调用此函数后,需要再调用WaitCommEvent来等待事件的产生。完整定义:BOOL

SetCommMask(HANDLE

hFile,//句柄

DWORD

dwEvtMask//事件掩码);SetCommTimeoutsSetCommTimeouts函数设置读和写操作的超时值,完整定义:BOOL

SetCommTimeouts(HANDLE

hFile,//通信设备句柄LPCOMMTIMEOUTS

lpCommTimeouts//超时结构);SetDefaultCommConfigSetDefaultCommConfig函数设置通信设备的默认配置,完整定义:BOOL

SetDefaultCommConfig(LPCSTR

lpszName,//设备名字符串LPCOMMCONFIG

lpCC,//配置结构DWORD

dwSize//结构的大小);28.TransmitCommCharTransmitCommChar函数向指定设备发送字符,该字符将优先于输出缓冲区中的数据。一般情况下,先调用SetCommBreak,再调用此函数,最后调用ClearCommChar,用于优先反送指定字符。完整定义:BOOL

TransmitCommChar(HANDLE

hFile,//句柄

Char

cChar//发送的字符);29.WaitCommEventWaitCommEvent函数等待指定设备的事件发生。一系列的事件被此函数监视,包括设备相关的事件掩码,可以同步或异步方式进行。完整定义:BOOL

WaitCommEvent(HANDLE

hFile,//句柄LPDWORD

lpEvtMask,//要处理的事件LPOVERLAPPED

lpOverlapped,//Overlapped结构,用于异步方式);12.3

MSComm控件12.3.1

MSCom安装MSCcomm组件是Microsoft

Visual

Studio配带的ActiveX组件,一般安装MicrosoftVisual

Studio后这些文件会自动生成,然后在Delphi中安装MSComm控件。步骤如下:先打开Delphi7.0集成开发环境,选择菜单

“Component”中的“Import

ActiveXControl”命令,在“Import

AcitiveX”选项卡内选择“Microsoft

Comm

Control

6.0”项。单击“Install”按钮安装MSComm控件,安装后在“ActiveX”组件板中出现

MSComm图标,即可被使用。MSCOMM32.OCX可以按如下两种方式注册:第一种方式:点击【开始】|【运行】,在运行命令栏中填入如下命令:Regsvr32

c:\windows\system\mscomm32.ocx第二种方式:打开记事本输入以下内容,并且保存未REG的扩展名,双击此文件也可以进行注册,REGEDIT4[HKEY_CLASSES_ROOT\Licenses\4250E830-6AC2-11cf-8ADB-00AA00C00905]@=”

kjljvjjjoquqmjjjvpqqkqmqykypoqjquoun”12.3.2

MSComm控件方法MSComm控件提供下列两种处理通信的方式:事件驱动通信是处理串行端口交互作用的一种非常有效的方法。在许多情况下,在事件发生时需要得到通知。在程序的每个关键功能之后,可以通过检查

CommEvent属性的值来查询事件和错误。如

果应用程序较少,并且是自保持的,这种方法可能是更可取的。每个MSComm控件对应着一个串行端口。如果应用程序需要访问多个串行端口,必须使用多个MSComm控件。可以在Windows“控制面板”中改变端口地址和中断地址。尽管MSComm控件有很多重要的属性,但首先必须熟悉几个属性。CommPortSettings设置并返回通信端口号。以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位。PortOpen

设置并返回通信端口的状态,也可以打开和关闭端口。InputOutput从接收缓冲区返回和删除字符。向传输缓冲区写一个字符串。12.3.3

MSComm控件属性通信MSComm控件提供了27个关于通信控制方面的属性和5个标准属性。1.Break属性描述:设置或清除中断信号的状态。该属性在设计时无效。语法:[form

.]

MSComm.Break[:={True|False}]设置为:TrueFalse设置中断信号状态清除中断信号状态2.CDHolding属性通过查询Carrier

Detect

(CD)信号线的状态确定当前是否有传输。语法:[form.]MSComm.CDHolding[:={True|False}]CDHolding属性的设置值为:TrueFalseCarrier

Detect信号线为高电平

Carrier

Detect信号线为低电平CommID属性返回一个说明通信设备的句柄。该属性在设计时无效,在运行时为只读。语法:[form.]MSComm.CommIDCommEvent属性返回最近的通信事件或错误。该属性在设计时无效,在运行时为只读。语法:[form.]MSComm.CommEvent5.CommPort属性设置并返回通信端口号。语法:[form

.]

MSComm.CommPort[:=value]6.CTSHolding属性确定是否可通过查询Clear

To

Send

(CTS)信号线的状态发送数据。语法:[form

.]

MSComm.CTSHolding[:={True|False}]CTSHolding属性的设置值为:TrueFalseClear

To

Send信号线为高电平

Clear

To

Send信号线为低电平7.DSRHolding属性确定Data

Set

Ready

(DSR)信号线的状态。语法:[form.]MSComm.CSRHolding[:={True|False}]

CSRHolding属性返回以下值:TrueFalseData

Set

Ready信号线为高电平

Data

Set

Ready信号线为低电平8.DTREnable属性确定在通信时是否使Data

Terminal

Ready(DTR)信号线有效。语法:[form.]MSComm.DTREnable[:={True|False}]DTREnable属性设置值:True

Data

Terminal

Ready信号线有效False

Data

Terminal

Ready信号线无效(缺省)9.EOFEnable属性EOFEnable属性确定在输入过程中MSComm控件是否寻找文件结尾(EOF)字符。语法:[form.]MSComm.EOFEnable[:={True|False}]value的设置值:当EOF字符找到时OnComm事件被激True活。False

当EOF字符找到时OnComm事件不被激活(缺省)。10.Handshaking属性设置并返回硬件握手协议。语法:[form.]MSComm.Handshaking[:=value]11.InBufferCount属性返回接收缓冲区中等待的字符数。该属性在设计时无效。语法:[form

.]

MSComm.

InBufferCount[:=value]12.InBufferSize属性设置并返回接收缓冲区的字节数。语法:[form.]MSComm.InBufferSize[:=value]13.Input属性返回并删除接收缓冲区中的数据流。该属性在设计时无效,在运行时为只读。语法:[form.]

MSComm.Input14.InputLen属性设置并返回Input属性确定被Input属性读取的字符数。语法:[form.]MSComm.InputLen

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论