《[电子书][e书]Delphi 串口 通信 编程38127.pptx》由会员分享,可在线阅读,更多相关《[电子书][e书]Delphi 串口 通信 编程38127.pptx(96页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Delphi 串口通信编程第一章 基本概念1.通信2.串行通信3.硬件基础知识4.模式及流量5.接线和错误预防6.错误排除1、通信通信:不同的独立系统通过线路互相交换数据数据通信:终端与计算机之间的通信或计算机与计算机之间的通信网络:构成整个通信的线路l 数据传送l 通信的类型l 字符传输数据传送完整的通信系统包括发送端、接收端、转换数据的接口以及传送数据的实际信道或媒体DTE(Data Terminal Equipment):发送与接收的节点DSE(Data Switching Equipment):中间节点,负责数据转送工作DCE(Data Communication Equipment)
2、:负责数据与电气信号转换的设备DTE 与DCE 间的数据传输线路通常使用RS-232DTE 与DSE 间的媒体则包括了双绞线、同轴电缆、光纤或无线电等传送的方式l 并行传送(Parallel):一次的传输量为8个位(1字节)通过并行端口,如打印机l 串行传送(Serial):一次只传输1个位 通过串行端口,如RS-232通信的种类将数据转换成串行通信有两种方式l 同步方式:接收设备能自动与发送计算机同步,接收字符有规则的分割开来,以块为单位,没有起始位和停止位,效率高。l 异步方式:以字符为传送单位,传送的字符之间有无规律的间隔,这样可能使接收设备不能正常接收数据,因为每接收完一个字符都不能确
3、切地知道下一个接收的字符从何时开始。(通过加开始位和停止位实现)传输效率低,成本也低。字符传输l 位和字节l 文本编码l 非文本编码l 帧位和字节l 二进制中的每一位0和1,被叫做一个位l 每8个位构成一个字节l 一个字节中最右面的位被称为第0位,最左面的位被称为第7位。文本编码文本(字符字母、标点符号等)在计算机中存储时,每个不同的字符都用不同的数值来表示。这些数值的范围通常在0-127或0-255 范围。7位:ASCII 码,每个字节留一个备用位8位:前128个遵循ASCII 码规则,其余的128个用来做扩展字符、数字符号、图形字符等编码。非文本编码某些可执行指令文件和图形图像文件就是以二
4、进制形式而不是ASCII 码形式存储的。一个数据可用二进制形式存储,可以占多个字节。在通信领域,常常把这种类型的资料叫做二进制数据。帧帧:在串行异步通信情况下,构成一个字节的那些数据单元被称为数据位,在数据位的前、后要加上起始位、停止位和奇偶校验位。一个字符所使用的位数根据协议而不同。称这些位数为字符位数据长或字长。通常不是8位就是7位。2、串行通信l RS-232 串行通信l RS-485 串行通信l USB 接口l IEEE-1394RS-232 串行通信RS-232 的通信端口是每台计算机上的必要配置,通常含有COM!和COM2 两个端口。计算机上的RS-232 均是公头一般有两种:9引
5、脚和25引脚RS-485 串行通信RS-485 的通信方式可有效地防止噪声信号的干扰。RS-485 的信号将被发送出去时会先分成正负的两条线路,当到达接收端后,再将信号相减还原来原来的信号;如果将原始的信号记为(DT),而被分成后的信号分别记为(D+)及(D-),则原始的信号与离散的信号在由发送端发送出去时:(DT)=(D+)-(D-)如果此线路受干扰,则两条传输线上的信号会分别成为(D+)+Noise 及(D-)+Noise(DT)=(D+)+Noise-(D-)+Noise=(D+)-(D-)USB(Universal Serial Bus)接口集成一般计算机所使用的外围设备的连接方式,而
6、且其所采用的信号传输方式也是串行通信。USB 特性:低价位,热连接,单一的连接头方式,连接数多,线上供电,不占系统资源,错误检测与复原,节省能源,支持四种传输(巨量、实时、中断及控制4种传输模式),速度较快(12M bps/RS-232 最快115bps)IEEE-1394IEEE-1394(也称FireWire,火线)与USB 一样拥有即插即用的功能,也是用于解决计算机与外围设备复杂的连接问题,并且也是使用串行通信的传输方式。IEEE-1394 的传输速度是400Mbps,而且速度还向1000Mbps 迈进USB 与IEEE-1394 的比较比较项目 USB IEEE-1394 应用 低速设
7、备 高速设备带宽(Mbps)1.5,12 100,200,400电缆长度 5米 4.5米电缆 4线 6线即插即用 支持 支持3、硬件基础知识PC 机的RS-232 接口名称尚未统一,有多个名称:RS-232 口、串口、通信口、COM口、异步口等。1 2 3 4 56 7 89常用的9 条RS-232 信号线引脚信号名称 信号方向 简称 信号功能1载波检测DCE-DTE DCD(Data Carrier Detect)数据链路已连接2接收数据DCE-DTE RxD(Receive)DTE 接收串行数据3发送数据DTE-DCE TxD(Transmit)DTE 发送串行数据4数据终端就绪DTE-D
8、CE DTR(Data Terminal Ready)DTE 准备准备就绪5信号地-SG(Signal Ground)公共信号地6数据设备就绪DCE-DTE DSR(Data Set Ready)DCE准备就绪,可以接收7请求发送DTE-DCE RTS(Request to Send)DTE 通知DCE 请求发送8清除发送DCE-DTE CTS(Clear to Send)DCE 已切换到接收模式9振铃指示DCE-DTE RI(Ring Indicator)通知DTE 有远程呼叫一次应答呼叫过程Modem 从接收到振铃信号开始,到数据传输结束Modem 和DTE 恢复到原来的空闲状态为止的过程
9、。数据终端DTE 的控制软件持续监视振铃指示RI,等待该 信号有效 响铃后,RI信号在ON 和OFF 状态之间交替变化。DTE 的通信控制软件在检测到振铃指示后,开始通过计 算机振铃指示的ON 和OFF 状态的变化次数来进行计数。当达到程序设计的次数时,控制软件发出终端就绪信号(DTR)有效,使Modem 进行摘机状态,开始应答电话 Modem 在等待一小段时间后,自动地发送它的应答载波 信号。同时Modem 发出数据设备就绪信号(DSR),通 知DTE 已经完成所有准备工作,正在等待对方的载波信 号 在DTE 发出数据终端就绪信号(DTR)期间,DTE 的控制软件监视数据设备就绪信号(DSR
10、)是否有效,当DSR 为ON 状态后,DTE 便知道Modem 已准备建立数据链路,于是DTE 开始检测载波信号(DCD),以检查数据链路是否已经建立 当主叫Modem 的载波信号出现在电话线上时,被叫Modem 发出载波信号(DCD),以检查数据链路是否已经建立 在数据链路连接期间,发送数据(TxD)和接收数据(RxD)线上即开始了全又工通信。同时,DTE 仍监视载波信号(DCD),以确定数据链路是否连接 数据传输结束后,DTE 使数据终端就绪信号(DTR)无效,Modem 撤消载波检测(DCD),并且使设备数据就绪信号(DSR)信号无效。数据候链路释放后,Modem 和DTE 返回到初始状
11、态。通信参数l 数据的传送速度l 数据的传送单位数据的传送速度l 波特率:每秒所能产生的最大电压状态改变率(一秒钟可以振荡的次数)bpsl 通信双方必须要取得一样的通信速度。原始信号经过不一样的波特率取样后,所得的结果完全不一样,如取样速度只有原来一半时,信号被跳着取样,数据因此错误。数据的传送单位一般串行通信端口所传送的数据是字符类型,若用来传输文件,则会使用二进制的数据类型。起始位及停止位l 异步串行传输时需要l 当发送端要开始传送数据时,便将传输线上的电压由低电位提升至高电位,而当传送结束后,再将电压降至低电压。接收端会因起始位的触发(因电压由低电位升至高电位)而开始接收数据;并因停止位
12、的通知(因电压维持在低电位)而确节知道数据的字符已经结束。校验位的检查l 用来检查所传送数据正确性的一种核对码,其中又分成奇校验(Odd)及偶校验(Even)l 串行通信上的字符数据格式 起始位+传送字符+校验位+停止位4、模式及流量l 工作模式l 硬件握手l 软件握手工作模式当计算机在进行数据的传送与接收时,传输线上的数据流动情况可分为3种:l 单工:传输线上的数据流动只有一个方向l 半双工:数据流动是双向,但同一时间只能一个方向行进l 全双工:传输线同时具有两个方向的传输能力RS-485 属于半双工,RS-232 属于全双工(引脚在设计时就是接收与传送是分属两个不同的引脚与线路。)串行数据
13、的流动方式当数据要由A 设备传送至B 设备前,数据会先被送到A 设备的数据输出缓冲区,接着再由此缓冲区将数据由RS-232 线路传送到B 设备;同样地,当数据通过硬件线路传送到B 设备时,数据首先会送到接收缓冲区,而设备B 的CPU 再到接收缓冲区将数据读取并进行处理。握手握手信号:提供一种控制数据流的方法,即接收设备可以控制发送设备的数据发送。如果接收设备速度比发送速度快,握手信号可以略去。在异步串行通信中,这称之为握手(handshaking)或流量控制(flow control)。流量控制:保证传输双方都能正确地传送和接收数据而不会漏失。握手控制可以具休分为硬件握手和软件握手。硬件握手使
14、用专门的握手电路去控制数据的传输。当接收设备准备好之后,就通过专用的握手电路传送一个正电压给发送设备,指示发送设备发送数据。如果接收设备传送一个负电压给发送设备,则指示发送设备停止发送数据。硬件握手用到DSR、CTS、DTR、RTS4 条硬件线路,其中DTR、RTS 指的是计算机上的RS-232 端;而DSR、CTS 则是指被控制的设备端。计算机-设备1.设备必须将相对于计算机上的DSR 引脚降为低电压2.计算机检测到DSR 引脚为低电位后,暂停数据的传输;同时设备继续处理位于缓冲区的数据3.等设备的接收缓冲区数据量下降到一定程度后,设备将DSR 引脚的标准电压升高4.计算机一检测到DSR 引
15、脚为高电压后,随即继续传送数据给设备设备-计算机1.计算机将DTR引脚降为低电压2.设备检测到DTR引脚为低电压后,暂停数据的传输;同时计算机也会继续处理位于缓冲区的数据3.待计算机的接收缓冲区中数据量下降到一定程度后,计算机将DTR引脚的标准电压升高4.设备一检测到DTR引脚为高电压后,随即继续传送数据给计算机软件握手以数据线上的数据信号来代替实际的硬件线路最常见的是XON/XOFF 协议:若接收端欲使发送端暂停数据的传送时,它便向发送端送出ASCII 第19号字符(十六进制是13);而欲恢复传送时,便向发送端送出ASCII 第17号字符(十六进制是11),两个字符的交互使用,便可控制发送端
16、的传送操作了。其操作流程与硬件握手类似。5、接线和错误预防l 接线方法l 错误预防接线方法RS-232 口特点:9引脚或25引脚 公头(区别于打印机接头)1 2 3 4 56 7 895 4 3 2 19 8 76计算机上为公头 连线上为公头l 当使用RS-232 与Modem 进行连接时,直接连接即可l 当使用RS-232 和其他的设备进行连接时,有时就必须做必要的跳线跳线跳线的实际意义就是一个传送的信号必须到达对方的接收引脚,如此才能形成一个完整的通路。跳线:欲将数据从一个地方传送至另一个地方,其实只要使用第2引脚、第3引脚与第5引脚就可以形成一个最简单的通信线路。实际制作:将RS-232
17、 线的一端接头拆掉,将里面的第2引脚和第3引脚对调即可。跳线的意义:甲方传送的数据必定到乙方的接收信道;而乙方的传送数据则会到达甲方的接收信道,双方的传送与接收形成一个完整的回路。错误预防检测数据在传送过程中发生的错误l CheckSum:将所有要传送字符的ASCII 码做加法运算,计算其总和后将此数目与一数字(通常是255)做除法运算,再取其余数,将此余数组合成传送字符串的一部分而传送出去;同样,接收方也以相同的方式对所传送过来的字符串进行运算操作,以判断数据的正确性,如果不对,则要求发送方重发。l CRC(yclic Redundancy Check Code 循环冗余校验码)将欲传输的数
18、据块视为一堆连续位所构成的一个整数值,并将此数值除一个特定的除数。错误预防原理:将所传送的数值做相加的操作后与一个固定的除数进行除法运算,所得的余数即为校验码。传送与接收的双方只要针对其固定的检查方法分别进行运算,比较后只要双方均一致,即正确;若不一致,数据重传。6、错误排除l 波特率失配l 检验错误l 字长不匹配l 停止位错l 帧错波特率失配如果两个设备的波特率设置不同,当接收设备试图接受数据时,程序将报告校验错和帧错。校验错误指数据在传输中被破坏,至少可以说明设备在奇偶校验位类型设置不同或者字长不同。字长不匹配l 发送的是8位字长,接收采用7位字长l 发送的是7位字长,接收采用8位字长停止
19、位错l 接收端要求一个停止位,而发送端发送了两个停止位l 接收端要求两个停止位,而发送端发送了一个停止位帧错一般指位数不匹配。这个类型的错误,通常是在没有接收到要求的停止位时出现。第章串行通信程序及组件建立1、串行通信的Windows 简述2、通信测试3、自动与事件1、串行通信的Windows 简述l 串行通信相关函数l 串口通信流程Delphi 的Windows.pas 单元文件中已经将Win32 API 均声明进去,因此在Delphi 里面使用API 时只要在uses 区段中加入Windows,使其引用该单元文件即可串行通信相关函数l CreateFile:建立文件,在此用打开通信端口l
20、CloseHandle:关闭由CreateFile 建立的文件,在此用于关闭通信端口l GetCommState:取得计算机串口的设置参数l SetCommState:设置计算机串口的参数l WriteFile:将数据写入文件,在此用来将数据由串口送出l ReadFile:由文件中读取数据,在此用来取得送到串口的数据l ClearCommError:清除串行端口的错误,并取得信息串行通信相关函数l PurgeComm:清除串口上的缓冲区l EscapeCommFunction:控制串口的硬件状态l SetCommMask:设置事件的掩码,用以触发事件l WaitCommEvent:等待设置事件
21、的发生l GetCommModemStatus:取得串口上的硬件线路状态HANDLE CreateFile(LPCTSTR lpFileName,/文件名指针DWORD dwDesiredAccess,/存取(读/写)模式DWORD dwShareMode,/共享模式 LPSECURITY_ATTRIBUTES lpSecurityAttribute,/security attribute 结构指针DWORD dwCreationDistribution,/打开文件的方式DWORD dwAttrsAndFlags,/文件属性HANDLE hTemplateFile/带属性复制的文件句柄);有关
22、参数说明l lpFileName:欲打开的文件名称。以串口通信来说,就是COM1、COM2 等l dwDesiredAccess:读写模式设备。由于将会对串口进行读写操作,因此在此给定GENERIC_READ 和GENERIC_WRITE 常数l dwShareMode:是否共享串行端口。一般不共享,设为0l lpSecurityAttribute:传入一个Security Attribute 结构,指明其返回的Handle 是否可以被子程序所继承。在此设置为nil,表示不可继承l dwCreationDistribution:指定如何打开文件。在打开设备时,此参数设定为OPEN_EXISTI
23、NGl dwAttrsAndFlags:文件属性及相关标志。此项设置为0l hTemplateFile:此项设置为0BOOL CloseHandle(HANDLE hObject);hObject:要关闭对象的句柄当函数返回True 时,表示关闭动作完成。Var Fhandle:THandle;ComName:array0.4 of char;/ComName:string;Begin ComName:=COM1;/PCHAR(ComName)FHandle:=CreateFile(ComName,GENERIC_READ or GENERIC_WRITE,0,nil,OPEN_EXISTIN
24、G,FILE_ATTRIBUTE_NORMAL,0);if FHandleINV ALID_HANDLE_V ALUE then showmessage(串口打开成功!)Else showmessage(串口打开失败!);CloseHandle(FHandle);End;GetCommStateBOOL GetCommState(HANDLE hFile,/通信设备的句柄 LPDCB lpDCB/设备控制块结构的地址);_DCB=packed record DCBlength:DWORD;/DCB 结构的长度 BaudRate:DWORD;/当前波特率 Flags:Longint;/wRese
25、rved:Word;/保留,未使用 XonLim:Word;/传送XON 阈值 XoffLim:Word;/传送XOFF 阈值 ByteSize:Byte;/每字节位数(4-8)Parity:Byte;/0-4:no,odd,even,mark,space StopBits:Byte;/0,1,2:1,1.5,2 XonChar:CHAR;/设置Tx 和Rx 的XON 字符 XoffChar:CHAR;/设置Tx 和Rx 的XOFF 字符 ErrorChar:CHAR;/有错误时的替换字符 EofChar:CHAR;/表示输入结束的字符 EvtChar:CHAR;/接收事件字符 wReserv
26、ed1:Word;/保留,未使用 end;TDCB=_DCB;DCB=_DCB;PDCB=TDCB;SetCommStateBOOL SetCommState(HANDLE hFile,/通信设备的句柄 LPDCB lpDCB/设备控制块结构的地址);VarFDCB:TDCB;GetCommState(FHandle,FDCB);FDCB.BaudRate:=9600;FDCB.Parity:=EVENPARITY;FDCB.Stopbits:=ONESTOPBIT;FDCB.Bytesize:=8;SetCommState(FCOMHandle,FDCB);WriteFileBOOL Wri
27、teFile(HANDLE hFile,/要写入文件的句柄 LPCVOID lpBuffer,/写入文件中的数据的指针 DWORD nNumberOfBytesToWrite,/写入的字节数 LPDWORD lpNumberOfBytesWritten,/写入总字节数的指针 LPOVERLAPPED lpOverlapped/overlapped I/O 结构的指针);/lpOverlapped 通常用来作后台工作时同步检查之用,在串行通信中若不同时使用串行端口,则可不使用,设为nilvar i:byte;strlen:DWord;xx:byte;dat:array0.99of char;be
28、gin dat0:=chr($fe);dat1:=chr($1B);dat2:=chr($44);dat3:=chr($03);dat4:=chr($02);xx:=0;for i:=1 to 4 do xx:=xx xor ord(dati);dat5:=chr(xx);/异或校验 strlen:=6;WriteFile(FHandle,dat,strlen,strlen,nil);end;ReadFileBOOL ReadFile(HANDLE hFile,/要读取文件的句柄 LPVOID lpBuffer,/接收数据的缓冲区地址 DWORD NumberOfBytesToRead,/读取
29、的字节数 LPDWORD lpNumberOfBytesRead,/读取总字节数的地址 LPOVERLAPPED lpOverlapped/OverLapped I/O 结构的地址);Var dat:array0.99of char;flag:dword;stepno:integer;begin stepno:=0;repeat Readfile(FHandle,dat,1,flag,nil);if flag0 then if dat10=chr($fe)then stepno:=1;until(stepno=1)or(flag=0);Readfile(FHandle,dat,1,flag,n
30、il);length:=ord(dat10);/取长度 readfile(FHandle,dat1,length,flag,nil);end;PurgeCommBOOL PurgeComm(HANDLE hFile,/通信资源的句柄 DWORD dwFlags/执行动作);dwFlags:指定执行的工作l PURGE_TXABORT:终止目前所有的传输工作,立即返回,不管是否完完成传输的操作l PURGE_RXABORT:终止目前所有的读取工作,立即返回,不管是否完成读取操作l PURGE_TXCLEAR:清除传送缓冲区中的所有数据l PURGE_RXCLEAR:清除接收缓冲区中的所有数据Es
31、capeCommFunctionBOOL EscapeCommFunction(HANDLE hFile,/通信设备的句柄 DWORD dwFunc/指定执行的功能);dwFuncdwFunc:指定串口必须完成的工作:指定串口必须完成的工作l CLRDTR:将DTR线路降成低电压l CLRRTS:将RTS 线路降成低电压l SETDTR:将DTR线路升成高电压l SETRTS:将RTS 线路升成高电压l SETXOFF:当接收到Xoff 字符时激活传输操作l SETXON:当接收到Xon 字符时激活传输操作l SETBREAK:设置通信状态为中断(送出BREAK 信号)l CLRBREAK:清
32、除BREAK 信号,使传输动作继续GetCommModemStatus取得串口数字输入线路电压状态可用该函数BOOL GetCommModemStatus(HANDLE hFile,/通讯设备的句柄 LPDWORD lpModemStat/控制寄存器中数值的地址);lpModemStat:指向检测到的状态的参数地址,32位长度MS_CTS_ON:CTS(clear-to-send)引脚升至高电压MS_DSR_ON:DSR(data-set-ready)引脚升至高电压MS_RING_ON:RI引脚升至高电压MS_RLSD_ON:DCD 引脚升至高电压串口通信流程打开通信端口打开成功?通信参数设置
33、其他函数操作显示错误信息关闭串口结束开始继续操作?否是2、通信测试l 通信步骤l 回路测试通信步骤1.设置通信端口号码2.使用CreateFile 函数打开通信端口3.设置通信协议4.设置传输速度等参数5.设置其它参数6.送出字符串或读入字符串,使用ReadFile 及WriteFile函数7.使用完毕后以CloseHandle 函数将通信端口关闭回路测试l 硬件设置l 软件实现硬件设置l 两台计算机,各使用其上的一个串口,一条RS-232 两边都是母头的线l 一台计算机,但拥有两个串行通信口,一条RS-232 两边都是母头的线l 一台计算机,一个串行通信口,一条RS-232线,至少其中一边是
34、母头3、自动与事件自动化的实现l 轮询方式:不断地发出询问的信号给设备,要求设备返回计算机所要的信息 使用定时器(Timer 组件),设定时间间隔,当时间间隔一到,便会执行原先放在定时器中的程序代码 使用WhileDo 不断地执行程序代码l 线程方式:将串行通信的功能封装在一个线程中,利用线程的不断执行而达到自动化的目的建立多线程工作原理:操作系统将CPU 处理数据的时间切成很多的时间片(Time Slice),操作系统再将应用程序的代码加载到CPU 中执行,一旦这一小块的时间执行完毕后,操作系统会将正在执行的程序放一边,然后再取另外一个应用程序进CPU 中执行,一样只执行这一小块时间片,如此
35、周而复始,所以见到了整个系统中多任务的情况。线程的实现应用程序执行后即产生主线程,而主线程可以衍生出其他线程。一个应用程序可以依需要而造出多个线程对象,每一个线程开始执行后即被排入CPU 的执行周期中,这些线程可能被建立后开始执行,直到应用程序结束;也有可能执行完工作后在应用程序结束前就结束掉,实际的情况看具体需求而定。Tthread 类中常用的方法l Create:建立线程。使用此方法可建立线程,有1个参数,若设成True,表示建立后不立即执行;若设成False,则表示一建立后马上执行。constructor Create(CreateSuspended:Boolean);l Free:释放
36、线程,线程程序代码将从内存中被删除 procedure Free;l Resume:执行程序代码。若线程暂停时,使用此指令再次激活 procedure Resume;l Suspend:暂停线程。将执行中的线程暂停 procedure Suspend;var SecondProcess:TMyThread;TMyThread is a custom descendant of TThread begin SecondProcess:=TMyThread.Create(True);create suspended-secondprocess does not run yet SecondProc
37、ess.Priority:=tpLower;set the priority to lower than normal SecondProcess.Resume;now run the thread end;第4 章 串行通信中的字符与字节1、字符与字节2、字节数据的传送与接收1、字符与字节l 字符和字节的差别l Delphi 中的字符串种类及处理函数l 中英文字符串长度计算字符和字节的差别Windows 支持的字符集有单字符集、双字节字符集及UniCode 字符集,在西方国家使用Windows 系统基本使用单字符集,每一个字符都使用一个字节来表示;而亚洲国家由于字符无法单用一个字节表示,因此
38、使用双字节字符集,其中每个字符使用双字节字符集。UniCodeUniCode 涵盖了世界上所有国家的字符码,每个字符用一个唯一的内码来表示,其特点是所有的字符以两个字节表示,不仅中文使用两个字节,英文也使用两个字节串口通信过程中,如果传送的是一个英文字节组成,只要一个字节就可以将信息传送出去;如果传送的是双字节的字符(如中文),完整的字符传送就必须是两个字节。Delphi 中的字符串种类及处理函数Chr(x):返回X 参数的字符Ord(x):返回x参数所列的序数,一般用来解读字符在ASCII 码中的序数Pos(substr,str):返回str 中,substr 出现的位置,若找不到则返回0S
39、trPos(str1,str2):返回str2 在str1 出现的第一位置的指针,无则返回nilCopy(str,index,count):返回str 参数中,索引index 开始的count 数目的字串Delete(str,index,count):删除str 字串中,由index 所指定的开始位置的count 数目的字串Length(str):返回字串str 的长度SetLength(str,newlen):设置str 的长度Value(str,value,code):将str 转成数值value,code 表示发生错误的位置Str(value,str):Trim(str),TrimRig
40、ht(str),TrimLeft(str):去空格StringReplace(str,oldpattern,newpattern):替换Insert(s1,s2,index):s1 插入s2 的第index 位置中英文字符串长度计算Type Maximum lengthMemory requiredUsed forShortString 255 characters 2 to 256 bytes backward compatibilityAnsiString 231 characters 4 bytes to 2GB 8-bit(ANSI)charactersWideString 230 c
41、haracters 4 bytes to 2GB Unicode characters;multiuser servers and multi-language applicationsVar InstrW:WideString;InstrA:ANSIString;Instr:string;Begin Instr:=edit1.text;InstrW:=edit1.text;InstrA:=edit1.text;edit2.text:=inttostr(length(Instr);edit3.text:=inttostr(length(InstrW);edit4.text:=inttostr(
42、length(InstrA);End;现象l 纯英文字符串使用三种字符串的计算结果相同,显示出一样的字符串长度l 纯中文字符串时,String 和ANSIString 所呈现的结果一样,但WideString 的字符串长度只有它们的一半l 中英文混合时,String 及ANSIString 所呈现的结果还是一样,中文占两个字符和英文占一个字符;但WideString 类型中英文和中文都只占一个字符,结论l Length 函数在不同的类型下所作的计算是不一样的l Delphi 的确是以String 作为默认的长字符串类型l 字符串的长度计算可以用WideString 类型来进行,在这种情况下,一
43、个中英文字符均被计算为一个字符l 实际所占的字节大小需要使用String 的类型来计算字符编码一般的英文字符,可以使用Ord 取得其在ASCII 表中的代表号码;反过来说,如果想以一个号码而得知其所代表的ASCII 字符是什么,则可以使用chr 函数来实现。Var instr:string;instrW:Widestring;i,len:integer;temp:string;Begin instr:=edit1.text;instrW:=edit1.text;len:=length(instr);temp:=;for i:=1 to len do temp:=temp+inttostr(or
44、d(instri);memo1.text:=temp;len:=length(instrW);temp:=;for I:=1 to len do temp:=temp+inttostr(ord(instrWi);memo2.text:=temp;End;2、字节数据的传送与接收l 字节类型、声明与传送/接收l 动态数组数组名:ArraystartIndex.EndIndex of 类型 ByteSend:Array0.9 of Byte;ByteSend0:=123;ByteSend1:=46;动态数组动态数组:声明时不指定数组的大小,而在需要使用数组之前再指定该数组的大小Delphi 中对于
45、动态数组的声明方式如下:ByteReceive:array of Byte;./其他代码SetLength(ByteReceive,count)var ByteSend:array of byte;ByteReceive:array of byte;count,i:dword;FHandle:THandle;begin FHandle:=CreateFile(pchar(COM1),GENERIC_READ or GENERIC_WRITE,0,nil,PEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);SetLength(ByteSend,mSend.Lines.Co
46、unt);for i:=0 to mSend.Lines.Count-1 do ByteSendi:=StrtoInt(mSend.Linesi);count:=0;WriteFile(FHandle,bytesend,mSend.Lines.Count,count,nil);showmessage(inttostr(count);closehandle(FHandle);end;谢谢观看/欢迎下载BY FAITH I MEAN A VISION OF GOOD ONE CHERISHES AND THE ENTHUSIASM THAT PUSHES ONE TO SEEK ITS FULFILLMENT REGARDLESS OF OBSTACLES.BY FAITH I BY FAITH