《Delphi 串口 通信 编程.doc》由会员分享,可在线阅读,更多相关《Delphi 串口 通信 编程.doc(10页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Delphi 串口 通信 编程.txt爱尔兰一个不离婚的国家,一个一百年的约定。难过了,不要告诉别人,因为别人不在乎。真话假话都要猜,这就是现在的社会。 本文由roxbin2010贡献 ppt文档可能在WAP端浏览体验不佳。建议您优先选择TXT,或下载源文件到本机查看。 Delphi串口通信编程 Delphi串口通信编程 第一章 基本概念 1. 2. 3. 4. 5. 6. 通信 串行通信 硬件基础知识 模式及流量 接线和错误预防 错误排除 1、通信 通信:不同的独立系统通过线路互相交换数据 数据通信:终端与计算机之间的通信或计算机与 计算机之间的通信 网络:构成整个通信的线路 数据传送 通信
2、的类型 字符传输 数据传送 完整的通信系统包括发送端、接收端、转换数据 的接口以及传送数据的实际信道或媒体 DTE(Data Terminal Equipment):发送与接收的节点 DSE(Data Switching Equipment):中间节点,负责数据转送工作 DCE(Data Communication Equipment ):负责数据与电气信号转换 的设备 DTE与DCE间的数据传输线路通常使用RS-232 DTE与DSE间的媒体则包括了双绞线、同轴电缆、光纤或无线电等 传送的方式 并行传送(Parallel ):一次的传输量为8个位(1字节) 通过并行端口,如打印机 串行传送(
3、Serial ):一次只传输1个位 通过串行端口,如RS-232 通信的种类 将数据转换成串行通信有两种方式 同步方式:接收设备能自动与发送计算机同步,接收 字符有规则的分割开来,以块为单位,没有起始位和 停止位,效率高。 异步方式:以字符为传送单位,传送的字符之间有无 规律的间隔,这样可能使接收设备不能正常接收数据, 因为每接收完一个字符都不能确切地知道下一个接收 的字符从何时开始。(通过加开始位和停止位实现) 传输效率低,成本也低。 字符传输 位和字节 文本编码 非文本编码 帧 位和字节 二进制中的每一位0和1,被叫做一个位 每8个位构成一个字节 一个字节中最右面的位被称为第0位,最 左面
4、的位被称为第7位。 文本编码 文本(字符字母、标点符号等)在计算机 中存储时,每个不同的字符都用不同的 数值来表示。这些数值的范围通常在0127或0-255范围。 7位:ASCII码,每个字节留一个备用位 8位:前128个遵循ASCII码规则,其余的 128个用来做扩展字符、数字符号、图形 字符等编码。 非文本编码 某些可执行指令文件和图形图像文件就是 以二进制形式而不是ASCII码形式存储的。 一个数据可用二进制形式存储,可以占多 个字节。 在通信领域,常常把这种类型的资料叫做 二进制数据。 帧 帧:在串行异步通信情况下,构成一个字 节的那些数据单元被称为数据位,在数 据位的前、后要加上起始
5、位、停止位和 奇偶校验位。 一个字符所使用的位数根据协议而不同。 称这些位数为字符位数据长或字长。 通常不是8位就是7位。 2、串行通信 RS-232串行通信 RS-485串行通信 USB接口 IEEE-1394 RS-232串行通信 RS-232串行通信 RS-232的通信端口是每台计算机上的必要配置, 通常含有COM!和COM2两个端口。 计算机上的RS-232均是公头 一般有两种:9引脚和25引脚 RS-485串行通信 RS-485串行通信 RS-485的通信方式可有效地防止噪声信号的干扰。 RS-485的信号将被发送出去时会先分成正负的两条线路, 当到达接收端后,再将信号相减还原来原来
6、的信号; 如果将原始的信号记为(DT),而被分成后的信号分 别记为(D+)及(D-),则原始的信号与离散的信号 在由发送端发送出去时: (DT)= (D+)- (D-) 如果此线路受干扰,则两条传输线上的信号会分别成为 (D+)+Noise及(D-)+Noise (DT)= (D+) +Noise- (D-) +Noise = (D+)- (D-) USB( USB(Universal Serial Bus)接口 Bus)接口 集成一般计算机所使用的外围设备的连接方式, 而且其所采用的信号传输方式也是串行通信。 USB特性:低价位,热连接,单一的连接头方式,连接数 多,线上供电,不占系统资源,
7、错误检测与复原,节省 能源,支持四种传输(巨量、实时、中断及控制4种传输 模式),速度较快(12M bps/RS-232最快115bps) IEEEIEEE-1394 IEEE-1394(也称FireWire,火线)与USB一 样拥有即插即用的功能,也是用于解决 计算机与外围设备复杂的连接问题,并 且也是使用串行通信的传输方式。 IEEE-1394的传输速度是400Mbps,而且速 度还向1000Mbps迈进 USB与IEEE-1394的比较 USB与IEEE-1394的比较 比较项目 USB IEEE-1394 高速设备 100,200,400 应用 低速设备 带宽( Mbps) 1.5,1
8、2 电缆长度 5米 电缆 4线 即插即用 支持 4.5米 6线 支持 3、硬件基础知识 PC机的RS-232接口名称尚未统一,有多个 名称:RS-232口、串口、通信口、COM 口、异步口等。 1 2 3 4 5 6 7 8 9 常用的9 RS-232信号线 常用的9条RS-232信号线 引脚 信号名称 载波检测 接收数据 发送数据 数据终端就绪 信号方向 DCE-DTE DCE-DTE DTE-DCE DTE-DCE DCE-DTE DTE-DCE DCE-DTE DCE-DTE 简称 RxD(Receive) TxD(Transmit) 信号功能 DTE接收串行数据 DTE发送串行数据 1
9、 2 3 4 5 6 7 8 9 DCD(Data Carrier Detect) 数据链路已连接 DTR(Data Terminal Ready) DTE准备准备就绪 SG(Signal Ground) SG Signal Ground 公共信号地 DSR(Data Set Ready) RTS(Request to Send) DCE准备就绪,可以 接收 信号地 数据设备就绪 请求发送 清除发送 振铃指示 DTE通知DCE请求 发送 CTS(Clear to Send)DCE已切换到接收 模式 RI(Ring Indicator) 通知DTE有远程呼 叫 一次应答呼叫过程 Modem从接收
10、到振铃信号开始,到数据传 输结束Modem和DTE恢复到原来的空闲 状态为止的过程。 数据终端DTE的控制软件持续监视振铃指示RI,等待该 信号有效 响铃后, RI信号在ON和OFF状态之间交替变化。 DTE的通信控制软件在检测到振铃指示后,开始通过计 算机振铃指示的ON和OFF状态的变化次数来进行计数。 当达到程序设计的次数时,控制软件发出终端就绪信号 (DTR)有效,使Modem进行摘机状态,开始应答电话 Modem在等待一小段时间后,自动地发送它的应答载波 信号。同时Modem发出数据设备就绪信号(DSR),通 知DTE已经完成所有准备工作,正在等待对方的载波信 号 在DTE发出数据终端
11、就绪信号(DTR)期间,DTE的控 制软件监视数据设备就绪信号(DSR)是否有效,当 DSR为ON状态后,DTE便知道Modem已准备建立数据 链路,于是DTE开始检测载波信号(DCD),以检查 数据链路是否已经建立 当主叫Modem的载波信号出现在电话线上时,被叫 Modem发出载波信号(DCD),以检查数据链路是否 已经建立 在数据链路连接期间,发送数据(TxD)和接收数据 (RxD)线上即开始了全又工通信。同时,DTE仍监视 载波信号(DCD),以确定数据链路是否连接 数据传输结束后,DTE使数据终端就绪信号(DTR)无 效, Modem撤消载波检测(DCD),并且使设备数据 就绪信号(
12、DSR)信号无效。数据候链路释放后, Modem和DTE返回到初始状态。 通信参数 数据的传送速度 数据的传送单位 数据的传送速度 波特率:每秒所能产生的最大电压状态改变率(一秒 钟可以振荡的次数)bps 通信双方必须要取得一样的通信速度。原始信号经过 不一样的波特率取样后,所得的结果完全不一样,如 取样速度只有原来一半时,信号被跳着取样,数据因 此错误。 数据的传送单位 一般串行通信端口所传送的数据是字符类 型,若用来传输文件,则会使用二进制 的数据类型。 起始位及停止位 异步串行传输时需要 当发送端要开始传送数据时,便将传输 线上的电压由低电位提升至高电位,而 当传送结束后,再将电压降至低
13、电压。 接收端会因起始位的触发(因电压由低 电位升至高电位)而开始接收数据;并 因停止位的通知(因电压维持在低电位) 而确节知道数据的字符已经结束。 校验位的检查 用来检查所传送数据正确性的一种核对 码,其中又分成奇校验(Odd)及偶校验 (Even) 串行通信上的字符数据格式 起始位+传送字符+校验位+停止位 4、模式及流量 工作模式 硬件握手 软件握手 工作模式 当计算机在进行数据的传送与接收时,传输线上的数据 流动情况可分为3种: 单工:传输线上的数据流动只有一个方向 半双工:数据流动是双向,但同一时间只能一个方向 行进 全双工:传输线同时具有两个方向的传输能力 RS-485属于半双工,
14、RS-232属于全双工(引脚在设计时 就是接收与传送是分属两个不同的引脚与线路。) 串行数据的流动方式 当数据要由A设备传送至B设备前,数据会 先被送到A设备的数据输出缓冲区,接着 再由此缓冲区将数据由RS-232线路传送到 B设备;同样地,当数据通过硬件线路传送 到B设备时,数据首先会送到接收缓冲区, 而设备B的CPU再到接收缓冲区将数据读取 并进行处理。 握手 握手信号:提供一种控制数据流的方法,即接收设备可 以控制发送设备的数据发送。 如果接收设备速度比发送速度快,握手信号可以略去。 在异步串行通信中,这称之为握手(handshaking)或流 量控制(flow control)。 流量
15、控制:保证传输双方都能正确地传送和接收数据而 不会漏失。 握手控制可以具休分为硬件握手和软件握手。 硬件握手 使用专门的握手电路去控制数据的传输。 当接收设备准备好之后,就通过专用的握手电路传送一 个正电压给发送设备,指示发送设备发送数据。如果接 收设备传送一个负电压给发送设备,则指示发送设备停 止发送数据。 硬件握手用到DSR、CTS、DTR、RTS4条硬件线路,其 中DTR、RTS指的是计算机上的RS-232端;而DSR、 CTS则是指被控制的设备端。 计算机计算机-设备 1. 设备必须将相对于计算机上的DSR引脚降为 低电压 2. 计算机检测到DSR引脚为低电位后,暂停数 据的传输;同时
16、设备继续处理位于缓冲区的 数据 3. 等设备的接收缓冲区数据量下降到一定程度 后,设备将DSR引脚的标准电压升高 4. 计算机一检测到DSR引脚为高电压后,随即 继续传送数据给设备 设备设备-计算机 1. 计算机将DTR引脚降为低电压 2. 设备检测到DTR引脚为低电压后,暂停数据 的传输;同时计算机也会继续处理位于缓冲 区的数据 3. 待计算机的接收缓冲区中数据量下降到一定 程度后,计算机将DTR引脚的标准电压升高 4. 设备一检测到DTR引脚为高电压后,随即继 续传送数据给计算机 软件握手 以数据线上的数据信号来代替实际的硬件线路 最常见的是XON/XOFF协议: 若接收端欲使发送端暂停数
17、据的传送时,它便向发送端 送出ASCII第19号字符(十六进制是13);而欲恢复传送 时,便向发送端送出ASCII第17号字符(十六进制是11), 两个字符的交互使用,便可控制发送端的传送操作了。 其操作流程与硬件握手类似。 5、接线和错误预防 接线方法 错误预防 接线方法 RS-232口特点: 9引脚或25引脚 公头(区别于打印机接头) 1 2 3 4 5 6 7 8 9 5 4 3 2 1 9 8 7 6 计算机上为公头 连线上为公头 当使用RS-232与Modem进行连接时,直 接连接即可 当使用RS-232和其他的设备进行连接时, 有时就必须做必要的跳线 跳线 跳线的实际意义就是一个传
18、送的信号必须到达对方的接 收引脚,如此才能形成一个完整的通路。 跳线:欲将数据从一个地方传送至另一个地方,其实只 要使用第2引脚、第3引脚与第5引脚就可以形成一个最 简单的通信线路。实际制作:将RS-232线的一端接头 拆掉,将里面的第2引脚和第3引脚对调即可。 跳线的意义:甲方传送的数据必定到乙方的接收信道; 而乙方的传送数据则会到达甲方的接收信道,双方的 传送与接收形成一个完整的回路。 错误预防 检测数据在传送过程中发生的错误 CheckSum:将所有要传送字符的ASCII码做加法运算, 计算其总和后将此数目与一数字(通常是255)做除法 运算,再取其余数,将此余数组合成传送字符串的一 部
19、分而传送出去;同样,接收方也以相同的方式对所 传送过来的字符串进行运算操作,以判断数据的正确 性,如果不对,则要求发送方重发。 CRC(yclic Redundancy Check Code循环冗余校验码) 将欲传输的数据块视为一堆连续位所构成的一个整数 值,并将此数值除一个特定的除数。 错误预防原理: 将所传送的数值做相加的操作后与一个固定的除 数进行除法运算,所得的余数即为校验码。传送 与接收的双方只要针对其固定的检查方法分别进 行运算,比较后只要双方均一致,即正确;若不 一致,数据重传。 6、错误排除 波特率失配 检验错误 字长不匹配 停止位错帧错 波特率失配 如果两个设备的波特率设置不
20、同,当接收 设备试图接受数据时,程序将报告校验错 和帧错。 校验错误 指数据在传输中被破坏,至少可以说明设 备在奇偶校验位类型设置不同或者字长不 同。 字长不匹配 发送的是8位字长,接收采用7位字长 发送的是7位字长,接收采用8位字长 停止位错 接收端要求一个停止位,而发送端发送 了两个停止位 接收端要求两个停止位,而发送端发送 了一个停止位 帧错 一般指位数不匹配。 这个类型的错误,通常是在没有接收到要 求的停止位时出现。 第章 串行通信程序及组件建立 1、串行通信的Windows简述 2、通信测试 3、自动与事件 1、串行通信的Windows简述 、串行通信的Windows简述 串行通信相
21、关函数 串口通信流程 Delphi的Windows.pas单元文件中已经将Win32 API均声明进去,因此在Delphi里面使用API时 只要在uses 区段中加入Windows,使其引用该 单元文件即可 串行通信相关函数 CreateFile:建立文件,在此用打开通信端口 CloseHandle:关闭由CreateFile建立的文件,在此用于关闭 通信端口 GetCommState:取得计算机串口的设置参数 SetCommState:设置计算机串口的参数 WriteFile:将数据写入文件,在此用来将数据由串口送出 ReadFile:由文件中读取数据,在此用来取得送到串口的 数据 Clea
22、rCommError:清除串行端口的错误,并取得信息 串行通信相关函数 PurgeComm:清除串口上的缓冲区 EscapeCommFunction:控制串口的硬件状态 SetCommMask:设置事件的掩码,用以触发事件 WaitCommEvent:等待设置事件的发生 GetCommModemStatus:取得串口上的硬件线路状态 HANDLE CreateFile( LPCTSTR lpFileName, /文件名指针 DWORD dwDesiredAccess, /存取(读/写)模式 DWORD dwShareMode,/共享模式 LPSECURITY_ATTRIBUTES lpSecu
23、rityAttribute, /security attribute结构指针 DWORD dwCreationDistribution, /打开文件的方式 DWORD dwAttrsAndFlags, /文件属性 HANDLE hTemplateFile/带属性复制的文件句柄 ); 有关参数说明 lpFileName :欲打开的文件名称。以串口通信来说,就是COM1、 COM2等 dwDesiredAccess :读写模式设备。由于将会对串口进行读写操 作,因此在此给定GENERIC_READ和GENERIC_WRITE常数 dwShareMode :是否共享串行端口。一般不共享,设为0 lp
24、SecurityAttribute:传入一个Security Attribute结构,指明其返 回的Handle是否可以被子程序所继承。在此设置为nil,表示不可继 承 dwCreationDistribution :指定如何打开文件。在打开设备时, 此参数设定为OPEN_EXISTING dwAttrsAndFlags :文件属性及相关标志。此项设置为0 hTemplateFile :此项设置为0 BOOL CloseHandle(HANDLE hObject); hObject:要关闭对象的句柄 当函数返回True时,表示关闭动作完成。 Var Fhandle:THandle; ComNa
25、me:array0.4 of char; / ComName:string; Begin ComName:=COM1; / PCHAR(ComName) FHandle := CreateFile(ComName, GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); if FHandleINVALID_HANDLE_VALUE then showmessage(串口打开成功!) Else showmessage(串口打开失败!); CloseHandle(FHandle); End;
26、GetCommState BOOL GetCommState( HANDLE hFile,/ 通信设备的句柄 LPDCB lpDCB / 设备控制块结构的地址 ); _DCB = packed record DCBlength: DWORD; /DCB结构的长度 BaudRate: DWORD; /当前波特率 Flags: Longint; / wReserved: Word; /保留,未使用 XonLim: Word; /传送XON阈值 XoffLim: Word; /传送XOFF阈值 ByteSize: Byte; /每字节位数(4-8) Parity: Byte; /0-4:no,odd
27、,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; /接收事件字符 wReserved1: Word; /保留,未使用 end; TDCB = _DCB; DCB = _DCB; PDCB = TDCB; SetCommState BOOL SetCommState( HANDLE hFile
28、,/ 通信设备的句柄 LPDCB lpDCB / 设备控制块结构的地址 ); Var FDCB: TDCB; GetCommState(FHandle, FDCB); FDCB.BaudRate := 9600; FDCB.Parity := EVENPARITY; FDCB.Stopbits := ONESTOPBIT; FDCB.Bytesize := 8; SetCommState(FCOMHandle, FDCB); WriteFile BOOL WriteFile( HANDLE hFile, / 要写入文件的句柄 LPCVOID lpBuffer,/ 写入文件中的数据的指针 DWO
29、RD nNumberOfBytesToWrite,/ 写入的字节数 LPDWORD lpNumberOfBytesWritten, / 写入总字节数 的指针 LPOVERLAPPED lpOverlapped / overlapped I/O结构的 指针 ); / lpOverlapped 通常用来作后台工作时同步检查之用,在 串行通信中若不同时使用串行端口,则可不使用,设为 nil var i:byte; strlen:DWord; xx:byte; dat : array0.99of char; begin dat0 := chr($fe); dat1 := chr($1B); dat2
30、:= 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; ReadFile BOOL ReadFile( HANDLE hFile, /要读取文件的句柄 LPVOID lpBuffer, /接收数据的缓冲区地址 DWORD NumberOfBytesToRead, /读取的字节数 LPDWORD lp
31、NumberOfBytesRead,/读取总字节数的 地址 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,nil
32、); length:=ord(dat10); /取长度 readfile(FHandle,dat1,length,flag,nil); end; PurgeComm BOOL PurgeComm( HANDLE hFile, / 通信资源的句柄 DWORD dwFlags / 执行动作 ); dwFlags:指定执行的工作 dwFlags:指定执行的工作 PURGE_TXABORT:终止目前所有的传输工作,立即 返回,不管是否完完成传输的操作 PURGE_RXABORT:终止目前所有的读取工作,立即 返回,不管是否完成读取操作 PURGE_TXCLEAR:清除传送缓冲区中的所有数据 PURGE
33、_RXCLEAR:清除接收缓冲区中的所有数据 EscapeCommFunction BOOL EscapeCommFunction( HANDLE hFile, / 通信设备的句柄 DWORD dwFunc / 指定执行的功能 ); dwFunc:指定串口必须完成的工作 dwFunc:指定串口必须完成的工作 CLRDTR:将DTR线路降成低电压 CLRRTS:将RTS线路降成低电压 SETDTR:将DTR线路升成高电压 SETRTS:将RTS线路升成高电压 SETXOFF:当接收到Xoff字符时激活传输操作 SETXON:当接收到Xon字符时激活传输操作 SETBREAK:设置通信状态为中断(
34、送出BREAK信号) CLRBREAK:清除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
35、_ON:DCD引脚升至高电压 串口通信流程 开始 打开通信端口 打开成功? 通信参数设置 否 其他函数操作 是 继续操作? 关闭串口 显示错误信息 结束 2、通信测试 通信步骤 回路测试 通信步骤 1. 2. 3. 4. 5. 6. 7. 设置通信端口号码 使用CreateFile函数打开通信端口 设置通信协议 设置传输速度等参数 设置其它参数 送出字符串或读入字符串,使用ReadFile及WriteFile 函数 使用完毕后以CloseHandle函数将通信端口关闭 回路测试 硬件设置 软件实现 硬件设置 两台计算机,各使用其上的一个串口, 一条RS-232两边都是母头的线 一台计算机,但拥
36、有两个串行通信口, 一条RS-232两边都是母头的线 一台计算机,一个串行通信口,一条RS232线,至少其中一边是母头 3、自动与事件 自动化的实现 轮询方式:不断地发出询问的信号给设备,要 求设备返回计算机所要的信息 使用定时器(Timer组件),设定时间间隔,当时间 间隔一到,便会执行原先放在定时器中的程序代码 使用WhileDo不断地执行程序代码 线程方式:将串行通信的功能封装在一个线程 中,利用线程的不断执行而达到自动化的目的 建立多线程 工作原理: 操作系统将CPU处理数据的时间切成很多的时间片 (Time Slice),操作系统再将应用程序的代码加载 到CPU中执行,一旦这一小块的
37、时间执行完毕后, 操作系统会将正在执行的程序放一边,然后再取另 外一个应用程序进CPU中执行,一样只执行这一小 块时间片,如此周而复始,所以见到了整个系统中 多任务的情况。 线程的实现 应用程序执行后即产生主线程,而主线程可以衍 生出其他线程。一个应用程序可以依需要而造出 多个线程对象,每一个线程开始执行后即被排入 CPU的执行周期中,这些线程可能被建立后开始 执行,直到应用程序结束;也有可能执行完工作 后在应用程序结束前就结束掉,实际的情况看具 体需求而定。 Tthread类中常用的方法 Tthread类中常用的方法 Create:建立线程。使用此方法可建立线程,有1个参 数,若设成True
38、,表示建立后不立即执行;若设成 False,则表示一建立后马上执行。 constructor Create(CreateSuspended: Boolean); Free:释放线程,线程程序代码将从内存中被删除 procedure Free; Resume:执行程序代码。若线程暂停时,使用此指令 再次激活 procedure Resume; Suspend:暂停线程。将执行中的线程暂停 procedure Suspend; var SecondProcess: TMyThread; TMyThread is a custom descendant of TThread begin Second
39、Process := TMyThread.Create(True); create suspended -secondprocess does not run yet SecondProcess.Priority := tpLower; set the priority to lower than normal SecondProcess.Resume; now run the thread end; 第4章 串行通信中的字符与字节 1、字符与字节 2、字节数据的传送与接收 1、字符与字节 字符和字节的差别 Delphi中的字符串种类及处理函数 中英文字符串长度计算 字符和字节的差别 Wind
40、ows支持的字符集有单字符集、双字 节字符集及UniCode字符集,在西方国家 使用Windows系统基本使用单字符集, 每一个字符都使用一个字节来表示;而 亚洲国家由于字符无法单用一个字节表 示,因此使用双字节字符集,其中每个 字符使用双字节字符集。 UniCode UniCode涵盖了世界上所有国家的字符码, 每个字符用一个唯一的内码来表示,其 特点是所有的字符以两个字节表示,不 仅中文使用两个字节,英文也使用两个 字节 串口通信过程中,如果传送的是一个英文 字节组成,只要一个字节就可以将信息 传送出去;如果传送的是双字节的字符 (如中文),完整的字符传送就必须是 两个字节。 Delphi
41、中的字符串种类及处理函数 Delphi中的字符串种类及处理函数 Chr(x):返回X参数的字符 Ord(x):返回x参数所列的序数,一般用来解读字符在ASCII码中的序数 Pos(substr,str):返回str中,substr出现的位置,若找不到则返回0 StrPos(str1,str2):返回str2在str1出现的第一位置的指针,无则返回nil Copy(str,index,count):返回str参数中,索引index开始的count数目的字串 Delete(str,index,count):删除str字串中,由index所指定的开始位置的 count数目的字串 Length(str
42、):返回字串str的长度 SetLength(str,newlen):设置str的长度 Value(str,value,code):将str转成数值value,code表示发生错误的位置 Str(value,str): Trim(str),TrimRight(str),TrimLeft(str):去空格 StringReplace(str,oldpattern,newpattern):替换 Insert(s1,s2,index):s1插入s2的第index位置 中英文字符串长度计算 Type ShortString AnsiString WideString Maximum length 25
43、5 characters 231 characters 230 characters Memory required 2 to 256 bytes 4 bytes to 2GB 4 bytes to 2GB Used for backward compatibility 8-bit (ANSI) characters Unicode characters; multiuser servers and multi-language applications Var InstrW:WideString; InstrA:ANSIString; Instr:string; Begin Instr:=e
44、dit1.text; InstrW:=edit1.text; InstrA:=edit1.text; edit2.text:=inttostr(length(Instr); edit3.text:=inttostr(length(InstrW); edit4.text:=inttostr(length(InstrA); End; 现象 纯英文字符串使用三种字符串的计算结果相同, 显示出一样的字符串长度 纯中文字符串时,String和ANSIString所呈现的 结果一样,但WideString的字符串长度只有它 WideString 们的一半 中英文混合时,String及ANSIString所
45、呈现的结 果还是一样,中文占两个字符和英文占一个字 符;但WideString类型中英文和中文都只占一 个字符, 结论 Length函数在不同的类型下所作的计算是不一 样的 Delphi的确是以String作为默认的长字符串类型 字符串的长度计算可以用WideString类型来进 行,在这种情况下,一个中英文字符均被计算 为一个字符 实际所占的字节大小需要使用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(ord(instri); memo1.text:=temp; len:=length(instrW); temp:=; for I:=1 to len do temp:=temp+inttostr(ord(instrWi); memo2.text:=temp
限制150内