版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Delphi串口通信编程第一章 根本概念通信串行通信硬件根底知识模式及流量接线和错误预防错误排除1、通信通信:不同的独立系统通过线路互相交换数据数据通信:终端与计算机之间的通信或计算机与计算机之间的通信网络:构成整个通信的线路数据传送通信的类型字符传输数据传送完整的通信系统包括发送端、接收端、转换数据的接口以及传送数据的实际信道或媒体DTEData Terminal Equipment:发送与接收的节点DSEData Switching Equipment:中间节点,负责数据转送工作DCEData Communication Equipment :负责数据与电气信号转换的设备DTE与DCE间的
2、数据传输线路通常使用RS-232DTE与DSE间的媒体那么包括了双绞线、同轴电缆、光纤或无线电等传送的方式并行传送Parallel :一次的传输量为8个位1字节 通过并行端口,如打印机串行传送Serial :一次只传输1个位 通过串行端口,如RS-232通信的种类将数据转换成串行通信有两种方式同步方式:接收设备能自动与发送计算机同步,接收字符有规那么的分割开来,以块为单位,没有起始位和停顿位,效率高。异步方式:以字符为传送单位,传送的字符之间有无规律的间隔,这样可能使接收设备不能正常接收数据,因为每接收完一个字符都不能确切地知道下一个接收的字符从何时开场。通过加开场位和停顿位实现传输效率低,本
3、钱也低。字符传输位和字节文本编码非文本编码帧位和字节二进制中的每一位0和1,被叫做一个位每8个位构成一个字节一个字节中最右面的位被称为第0位,最左面的位被称为第7位。文本编码文本字符字母、标点符号等在计算机中存储时,每个不同的字符都用不同的数值来表示。这些数值的范围通常在0-127或0-255范围。7位:ASCII码,每个字节留一个备用位8位:前128个遵循ASCII码规那么,其余的128个用来做扩展字符、数字符号、图形字符等编码。非文本编码某些可执行指令文件和图形图像文件就是以二进制形式而不是ASCII码形式存储的。一个数据可用二进制形式存储,可以占多个字节。在通信领域,常常把这种类型的资料
4、叫做二进制数据。帧帧:在串行异步通信情况下,构成一个字节的那些数据单元被称为数据位,在数据位的前、后要加上起始位、停顿位和奇偶校验位。一个字符所使用的位数根据协议而不同。称这些位数为字符位数据长或字长。通常不是8位就是7位。2、串行通信RS-232串行通信RS-485串行通信USB接口IEEE-1394RS-232串行通信RS-232的通信端口是每台计算机上的必要配置,通常含有COM!和COM2两个端口。计算机上的RS-232均是公头一般有两种:9引脚和25引脚RS-485串行通信RS-485的通信方式可有效地防止噪声信号的干扰。RS-485的信号将被发送出去时会先分成正负的两条线路,当到达接
5、收端后,再将信号相减复原来原来的信号;如果将原始的信号记为DT,而被分成后的信号分别记为D+及D-,那么原始的信号与离散的信号在由发送端发送出去时: DT= D+- D-如果此线路受干扰,那么两条传输线上的信号会分别成为D+Noise及D-+Noise DT= D+ +Noise- D- +Noise = D+- D-USBUniversal Serial Bus接口集成一般计算机所使用的外围设备的连接方式,而且其所采用的信号传输方式也是串行通信。USB特性:低价位,热连接,单一的连接头方式,连接数多,线上供电,不占系统资源,错误检测与复原,节省能源,支持四种传输巨量、实时、中断及控制4种传输
6、模式,速度较快12M bps/RS-232最快115bpsIEEE-1394IEEE-1394(也称FireWire,火线)与USB一样拥有即插即用的功能,也是用于解决计算机与外围设备复杂的连接问题,并且也是使用串行通信的传输方式。IEEE-1394的传输速度是400Mbps,而且速度还向1000Mbps迈进USB与IEEE-1394的比较比较工程 USB IEEE-1394 应用 低速设备 高速设备带宽 Mbps 1.5,12 100,200,400电缆 4线 6线即插即用 支持 支持3、硬件根底知识PC机的RS-232接口名称尚未统一,有多个名称:RS-232口、串口、通信口、COM口、异
7、步口等。123456789常用的9条RS-232信号线引脚信号名称信号方向简称信号功能1载波检测DCE-DTEDCD(Data Carrier Detect)数据链路已连接2接收数据DCE-DTERxD(Receive)DTE接收串行数据3发送数据DTE-DCETxD(Transmit)DTE发送串行数据4数据终端就绪DTE-DCEDTR(Data Terminal Ready)DTE准备准备就绪5信号地-SG(Signal Ground)公共信号地6数据设备就绪DCE-DTEDSR(Data Set Ready)DCE准备就绪,可以接收7请求发送DTE-DCERTS(Request to S
8、end)DTE通知DCE请求发送8清除发送DCE-DTECTS(Clear to Send)DCE已切换到接收模式9振铃指示DCE-DTERI(Ring Indicator)通知DTE有远程呼叫一次应答呼叫过程Modem从接收到振铃信号开场,到数据传输完毕Modem和DTE恢复到原来的空闲状态为止的过程。数据终端DTE的控制软件持续监视振铃指示RI,等待该 信号有效响铃后, RI信号在ON和OFF状态之间交替变化。DTE的通信控制软件在检测到振铃指示后,开场通过计 算机振铃指示的ON和OFF状态的变化次数来进展计数。 当到达程序设计的次数时,控制软件发出终端就绪信号DTR有效,使Modem进展
9、摘机状态,开场应答 Modem在等待一小段时间后,自动地发送它的应答载波 信号。同时Modem发出数据设备就绪信号DSR,通 知DTE已经完成所有准备工作,正在等待对方的载波信 号在DTE发出数据终端就绪信号DTR期间,DTE的控制软件监视数据设备就绪信号DSR是否有效,当DSR为ON状态后,DTE便知道Modem已准备建立数据链路,于是DTE开场检测载波信号DCD,以检查数据链路是否已经建立当主叫Modem的载波信号出现在 线上时,被叫Modem发出载波信号DCD,以检查数据链路是否已经建立在数据链路连接期间,发送数据TxD和接收数据RxD线上即开场了全又工通信。同时,DTE仍监视载波信号D
10、CD,以确定数据链路是否连接数据传输完毕后,DTE使数据终端就绪信号DTR无效, Modem撤消载波检测DCD,并且使设备数据就绪信号DSR信号无效。数据候链路释放后, Modem和DTE返回到初始状态。通信参数数据的传送速度数据的传送单位数据的传送速度波特率:每秒所能产生的最大电压状态改变率一秒钟可以振荡的次数bps通信双方必须要取得一样的通信速度。原始信号经过不一样的波特率取样后,所得的结果完全不一样,如取样速度只有原来一半时,信号被跳着取样,数据因此错误。数据的传送单位一般串行通信端口所传送的数据是字符类型,假设用来传输文件,那么会使用二进制的数据类型。起始位及停顿位异步串行传输时需要当
11、发送端要开场传送数据时,便将传输线上的电压由低电位提升至高电位,而当传送完毕后,再将电压降至低电压。接收端会因起始位的触发因电压由低电位升至高电位而开场接收数据;并因停顿位的通知因电压维持在低电位而确节知道数据的字符已经完毕。校验位的检查用来检查所传送数据正确性的一种核对码,其中又分成奇校验Odd及偶校验Even串行通信上的字符数据格式 起始位+传送字符+校验位+停顿位4、模式及流量工作模式硬件握手软件握手工作模式当计算机在进展数据的传送与接收时,传输线上的数据流动情况可分为3种:单工:传输线上的数据流动只有一个方向半双工:数据流动是双向,但同一时间只能一个方向行进全双工:传输线同时具有两个方
12、向的传输能力RS-485属于半双工,RS-232属于全双工引脚在设计时就是接收与传送是分属两个不同的引脚与线路。串行数据的流动方式当数据要由A设备传送至B设备前,数据会先被送到A设备的数据输出缓冲区,接着再由此缓冲区将数据由RS-232线路传送到B设备;同样地,当数据通过硬件线路传送到B设备时,数据首先会送到接收缓冲区,而设备B的CPU再到接收缓冲区将数据读取并进展处理。握手握手信号:提供一种控制数据流的方法,即接收设备可以控制发送设备的数据发送。如果接收设备速度比发送速度快,握手信号可以略去。在异步串行通信中,这称之为握手handshaking或流量控制flow control。流量控制:保
13、证传输双方都能正确地传送和接收数据而不会漏失。握手控制可以具休分为硬件握手和软件握手。硬件握手使用专门的握手电路去控制数据的传输。当接收设备准备好之后,就通过专用的握手电路传送一个正电压给发送设备,指示发送设备发送数据。如果接收设备传送一个负电压给发送设备,那么指示发送设备停止发送数据。硬件握手用到DSR、CTS、DTR、RTS4条硬件线路,其中DTR、RTS指的是计算机上的RS-232端;而DSR、CTS那么是指被控制的设备端。计算机-设备设备必须将相对于计算机上的DSR引脚降为低电压计算机检测到DSR引脚为低电位后,暂停数据的传输;同时设备继续处理位于缓冲区的数据等设备的接收缓冲区数据量下
14、降到一定程度后,设备将DSR引脚的标准电压升高计算机一检测到DSR引脚为高电压后,随即继续传送数据给设备设备-计算机计算机将DTR引脚降为低电压设备检测到DTR引脚为低电压后,暂停数据的传输;同时计算机也会继续处理位于缓冲区的数据待计算机的接收缓冲区中数据量下降到一定程度后,计算机将DTR引脚的标准电压升高设备一检测到DTR引脚为高电压后,随即继续传送数据给计算机软件握手以数据线上的数据信号来代替实际的硬件线路最常见的是XON/XOFF协议:假设接收端欲使发送端暂停数据的传送时,它便向发送端送出ASCII第19号字符十六进制是13;而欲恢复传送时,便向发送端送出ASCII第17号字符十六进制是
15、11,两个字符的交互使用,便可控制发送端的传送操作了。其操作流程与硬件握手类似。5、接线和错误预防接线方法错误预防接线方法RS-232口特点:9引脚或25引脚公头区别于打印机接头123456789543219876计算机上为公头连线上为公头当使用RS-232与Modem进展连接时,直接连接即可当使用RS-232和其他的设备进展连接时,有时就必须做必要的跳线跳线跳线的实际意义就是一个传送的信号必须到达对方的接收引脚,如此才能形成一个完整的通路。跳线:欲将数据从一个地方传送至另一个地方,其实只要使用第2引脚、第3引脚与第5引脚就可以形成一个最简单的通信线路。实际制作:将RS-232线的一端接头拆掉
16、,将里面的第2引脚和第3引脚对调即可。跳线的意义:甲方传送的数据必定到乙方的接收信道;而乙方的传送数据那么会到达甲方的接收信道,双方的传送与接收形成一个完整的回路。错误预防检测数据在传送过程中发生的错误CheckSum:将所有要传送字符的ASCII码做加法运算,计算其总和后将此数目与一数字通常是255做除法运算,再取其余数,将此余数组合成传送字符串的一局部而传送出去;同样,接收方也以一样的方式对所传送过来的字符串进展运算操作,以判断数据的正确性,如果不对,那么要求发送方重发。CRCyclic Redundancy Check Code循环冗余校验码将欲传输的数据块视为一堆连续位所构成的一个整数
17、值,并将此数值除一个特定的除数。错误预防原理:将所传送的数值做相加的操作后与一个固定的除数进展除法运算,所得的余数即为校验码。传送与接收的双方只要针对其固定的检查方法分别进行运算,比较后只要双方均一致,即正确;假设不一致,数据重传。6、错误排除波特率失配检验错误字长不匹配停顿位错帧错波特率失配如果两个设备的波特率设置不同,当接收设备试图承受数据时,程序将报告校验错和帧错。校验错误指数据在传输中被破坏,至少可以说明设备在奇偶校验位类型设置不同或者字长不同。字长不匹配发送的是8位字长,接收采用7位字长发送的是7位字长,接收采用8位字长停顿位错接收端要求一个停顿位,而发送端发送了两个停顿位接收端要求
18、两个停顿位,而发送端发送了一个停顿位帧错一般指位数不匹配。这个类型的错误,通常是在没有接收到要求的停顿位时出现。第章串行通信程序及组件建立1、串行通信的Windows简述2、通信测试3、自动与事件1、串行通信的Windows简述串行通信相关函数串口通信流程Delphi的Windows.pas单元文件中已经将Win32 API均声明进去,因此在Delphi里面使用API时只要在uses 区段中参加Windows,使其引用该单元文件即可串行通信相关函数CreateFile:建立文件,在此用翻开通信端口CloseHandle:关闭由CreateFile建立的文件,在此用于关闭通信端口GetCommS
19、tate:取得计算机串口的设置参数SetCommState:设置计算机串口的参数WriteFile:将数据写入文件,在此用来将数据由串口送出ReadFile:由文件中读取数据,在此用来取得送到串口的数据ClearCommError:去除串行端口的错误,并取得信息串行通信相关函数PurgeComm:去除串口上的缓冲区EscapeCommFunction:控制串口的硬件状态SetCommMask:设置事件的掩码,用以触发事件WaitCommEvent:等待设置事件的发生GetCommModemStatus:取得串口上的硬件线路状态HANDLE CreateFile(LPCTSTR lp, /文件名
20、指针DWORD dwDesiredAccess, /存取读/写模式DWORD dwShareMode,/共享模式 LPSECURITY_ATTRIBUTES lpSecurityAttribute, /security attribute构造指针DWORD dwCreationDistribution, /翻开文件的方式DWORD dwAttrsAndFlags, /文件属性HANDLE hTemplateFile/带属性复制的文件句柄 );有关参数说明lp :欲翻开的文件名称。以串口通信来说,就是COM1、 COM2等dwDesiredAccess :读写模式设备。由于将会对串口进展读写操作
21、,因此在此给定GENERIC_READ和GENERIC_WRITE常数dwShareMode :是否共享串行端口。一般不共享,设为0lpSecurityAttribute:传入一个Security Attribute构造,指明其返回的Handle是否可以被子程序所继承。在此设置为nil,表示不可继承dwCreationDistribution :指定如何翻开文件。在翻开设备时,此参数设定为OPEN_EXISTINGdwAttrsAndFlags :文件属性及相关标志。此项设置为0hTemplateFile :此项设置为0BOOL CloseHandle(HANDLE hObject);hObj
22、ect:要关闭对象的句柄当函数返回True时,表示关闭动作完成。Var FHandle: THandle; ComName:array0.4 of char; / ComName:string;Begin ComName:=COM1;/ PCHAR(ComName) FHandle := Create, GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, , 0);if FHandleINVALID_HANDLE_VALUE then showmessage(串口翻开成功!)Else showmessage(串口翻开失败!);CloseH
23、andle(FHandle);End;GetCommStateBOOL 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: Byt
24、e; /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; /接收事件字符 wReserved1: Word; /保存,未使用 end; TDCB = _DCB; DCB = _DCB;PDCB = TDCB;GetCommStateBOOL SetCommState( H
25、ANDLE hFile,/ 通信设备的句柄 LPDCB lpDCB/ 设备控制块构造的地址 );VarFDCB: TDCB; GetCommState(FHandle, FDCB); FDCB.BaudRate := 9600; FDCB.Parity := EVENPARITY; FDCB.Stopbits := ONESTOPBIT; FDCB.Bytesize := 8; SetCommState(FCOMHandle, FDCB);WriteFileBOOL WriteFile( HANDLE hFile,/ 要写入文件的句柄 LPCVOID lpBuffer,/ 写入文件中的数据的指
26、针 DWORD nNumberOfBytesToWrite,/ 写入的字节数 LPDWORD lpNumberOfBytesWritten,/ 写入总字节数的指针 LPOVERLAPPED lpOverlapped / overlapped I/O构造的指针 );/ lpOverlapped 通常用来作后台工作时同步检查之用,在串行通信中假设不同时使用串行端口,那么可不使用,设为nilvar i:byte; strlen:DWord; xx:byte; dat : array0.99of char;begin dat0 := chr($fe); dat1 := chr($1B); dat2 :
27、= 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; Write);end;ReadFileBOOL ReadFile( HANDLE hFile, /要读取文件的句柄 LPVOID lpBuffer, /接收数据的缓冲区地址 DWORD NumberOfBytesToRead, /读取的字节数 LPDWORD lpNumberOfBytesRead,/读取总字节数的地址 LPOVERLAP
28、PED lpOverlapped/OverLapped I/O构造的地址);Var dat : array0.99of char; flag:dword;stepno:integer;begin stepno:=0; repeat Read); if flag0 then if dat10=chr($fe) then stepno:=1; until (stepno=1)or(flag=0); Read); length:=ord(dat10); /取长度 read);end;PurgeCommBOOL PurgeComm( HANDLE hFile,/ 通信资源的句柄 DWORD dwFla
29、gs/ 执行动作 ); dwFlags:指定执行的工作PURGE_TXABORT:终止目前所有的传输工作,立即返回,不管是否完完成传输的操作PURGE_RXABORT:终止目前所有的读取工作,立即返回,不管是否完成读取操作PURGE_TXCLEAR:去除传送缓冲区中的所有数据PURGE_RXCLEAR:去除接收缓冲区中的所有数据EscapeCommFunctionBOOL EscapeCommFunction( HANDLE hFile,/ 通信设备的句柄 DWORD dwFunc / 指定执行的功能 );dwFunc:指定串口必须完成的工作CLRDTR:将DTR线路降成低电压CLRRTS:将
30、RTS线路降成低电压SETDTR:将DTR线路升成高电压SETRTS:将RTS线路升成高电压SETXOFF:当接收到Xoff字符时激活传输操作SETXON:当接收到Xon字符时激活传输操作SETBREAK:设置通信状态为中断送出BREAK信号CLRBREAK:去除BREAK信号,使传输动作继续GetCommModemStatus取得串口数字输入线路电压状态可用该函数BOOL GetCommModemStatus( HANDLE hFile,/ 通讯设备的句柄 LPDWORD lpModemStat/ 控制存放器中数值的地址 );lpModemStat:指向检测到的状态的参数地址,32位长度MS
31、_CTS_ON:CTS (clear-to-send) 引脚升至高电压MS_DSR_ON:DSR (data-set-ready) 引脚升至高电压MS_RING_ON:RI引脚升至高电压MS_RLSD_ON:DCD引脚升至高电压串口通信流程翻开通信端口翻开成功?通信参数设置其他函数操作显示错误信息关闭串口完毕开场继续操作?否是2、通信测试通信步骤回路测试通信步骤设置通信端口号码使用CreateFile函数翻开通信端口设置通信协议设置传输速度等参数设置其它参数送出字符串或读入字符串,使用ReadFile及WriteFile函数使用完毕后以CloseHandle函数将通信端口关闭回路测试硬件设置软
32、件实现硬件设置两台计算机,各使用其上的一个串口,一条RS-232两边都是母头的线一台计算机,但拥有两个串行通信口,一条RS-232两边都是母头的线一台计算机,一个串行通信口,一条RS-232线,至少其中一边是母头3、自动与事件自动化的实现轮询方式:不断地发出询问的信号给设备,要求设备返回计算机所要的信息使用定时器Timer组件,设定时间间隔,当时间间隔一到,便会执行原先放在定时器中的程序代码使用WhileDo不断地执行程序代码线程方式:将串行通信的功能封装在一个线程中,利用线程的不断执行而到达自动化的目的建立多线程工作原理:操作系统将CPU处理数据的时间切成很多的时间片Time Slice,操
33、作系统再将应用程序的代码加载到CPU中执行,一旦这一小块的时间执行完毕后,操作系统会将正在执行的程序放一边,然后再取另外一个应用程序进CPU中执行,一样只执行这一小块时间片,如此周而复始,所以见到了整个系统中多任务的情况。线程的实现应用程序执行后即产生主线程,而主线程可以衍生出其他线程。一个应用程序可以依需要而造出多个线程对象,每一个线程开场执行后即被排入CPU的执行周期中,这些线程可能被建立后开场执行,直到应用程序完毕;也有可能执行完工作后在应用程序完毕前就完毕掉,实际的情况看具体需求而定。Tthread类中常用的方法Create:建立线程。使用此方法可建立线程,有1个参数,假设设成True
34、,表示建立后不立即执行;假设设成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 SecondPro
35、cess := 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中的字符串种类及处理函数中英文字符串长度计算字符和字节的差异Windows支持的字符集有单字
36、符集、双字节字符集及UniCode字符集,在西方国家使用Windows系统根本使用单字符集,每一个字符都使用一个字节来表示;而亚洲国家由于字符无法单用一个字节表示,因此使用双字节字符集,其中每个字符使用双字节字符集。UniCodeUniCode涵盖了世界上所有国家的字符码,每个字符用一个唯一的内码来表示,其特点是所有的字符以两个字节表示,不仅中文使用两个字节,英文也使用两个字节串口通信过程中,如果传送的是一个英文字节组成,只要一个字节就可以将信息传送出去;如果传送的是双字节的字符如中文,完整的字符传送就必须是两个字节。Delphi中的字符串种类及处理函数Chr(x):返回X参数的字符,Chr(
37、97)=a ord(a)=97Ord(x):返回x参数所列的序数,一般用来解读字符在ASCII码中的序数Pos(substr,str):返回str中,substr出现的位置,假设找不到那么返回0StrPos(str1,str2):返回str2在str1出现的第一位置的指针,无那么返回nilCopy(str,index,count):返回str参数中,索引index开场的count数目的字串Delete(str,index,count):删除str字串中,由index所指定的开场位置的count数目的字串Length(str):返回字串str的长度SetLength(str,newlen):设置
38、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位置中英文字符串长度计算TypeMaximum lengthMemory requiredUsed forShortString255 characters2 to 256 bytesbackward compatibili
39、tyAnsiString231 characters4 bytes to 2GB8-bit (ANSI) charactersWideString230 characters4 bytes to 2GBUnicode 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
40、:=inttostr(length(Instr); edit3.text:=inttostr(length(InstrW); edit4.text:=inttostr(length(InstrA);End;现 象纯英文字符串使用三种字符串的计算结果一样,显示出一样的字符串长度纯中文字符串时,String和ANSIString所呈现的结果一样,但WideString的字符串长度只有它们的一半中英文混合时,String及ANSIString所呈现的结果还是一样,中文占两个字符和英文占一个字符;但WideString类型中英文和中文都只占一个字符,结 论Length函数在不同的类型下所作的计算是不一
41、样的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:=
42、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;End;2、字节数据的传送与接收字节类型、声明与传送/接收动态数组数组名:ArraystartIndex.EndIndex of 类型 ByteSend:Array0.9 of Byte;ByteSend0:=123
43、;ByteSend1:=46; 动态数组动态数组:声明时不指定数组的大小,而在需要使用数组之前再指定该数组的大小Delphi中对于动态数组的声明方式如下:ByteReceive:array of Byte;./其他代码SetLength(ByteReceive,count)var ByteSend:array of byte; ByteReceive:array of byte; count,i:dword; FHandle: THandle;begin FHandle := Create(COM1),GENERIC_READ or GENERIC_WRITE, 0, nil, PEN_EXI
44、STING, 0); SetLength(ByteSend,mSend.Lines.Count); for i:=0 to mSend.Lines.Count -1 do ByteSendi:=StrtoInt(mSend.Linesi); count:=0; Write); showmessage(inttostr(count); closehandle(FHandle);end;第五章 嵌入式汇编语言开发通信程序PC系统及体系构造Delphi中的嵌入式汇编语言嵌入式汇编的通信编程例子1、PC系统及体系构造存放器总线构造和主内存访问I/O寻址存放器Intel CPU内在4个主要的16位存放器
45、,即所谓的AX、BX、CX和DX。每个存放器可认为是两个8位存放器,即总共有8个8位存放器:AH、AL、BH、BL、CH、CL、DH和DL。通常将一个16位数的低字节装入AL,高字节装入AH。段地址和编移量段地址存放器可以是CS代码段、SS堆栈段、DS数据段和ES附加段存放器。偏移量可以保存在AX、BX、CX和DX存放器中的任何一个存放器里,或者保存在专门为作偏移量的一些存放器里。总线构造总线BUS是计算机内一组连接设备的电路集合。PC机有3组总线:数据总线地址总线控制总线主内存访问当处理器需要读内存时,它在地址总线上送出地址并在控制总线的读出线上置一个信号。相关的内存器件识别这个地址并将该地
46、址放在数据总线上返回给处理器。发送数据给内存时,一个信号置于控制总线的写入线上,地址放在地址总线上,并将数据入在数据总线上,然后发到内存。I/O寻址向CPU送出IN或OUT指令来访问I/O地址OUT 3F8H,AL /将AL存放器中的内容送到3F8H端口IN AL,DX /从DX存放器读出数据,并将结果放入AL 存放器中Delphi中可以使用嵌入式汇编语言,语法如下:asm statementListendstatementList是汇编程序语句,其分隔符可以是分号、换行符或者是Object Pascal注释2、 Delphi中可以使用嵌入式汇编语言Var PortData:byte;begi
47、n asm MOV AL,$20 MOV DX, $20 MOV DX,al MOV DX, $20 IN AL,DX MOV PortData,AL; /将$20端口的数据读入Byte变量PortData end;end;1汇编语言的根底知识汇编语言的语法存放器的使用标签汇编指令操作数1汇编语言的语法Label:Prefix Opcode Operand1,Operand2Label:标签可选Prefix:汇编程序的前缀操作操作码可选Opcode:汇编程序指令操作码或指令Operand:汇编表达式2存放器的使用asm语句必须保持EDI、ESI、ESP、EBP和EBX存放器的内容,但可以自由修
48、改EAX、ECX和EDX存放器的内容在asm主语句的入口,BP指向当前的堆栈,SP指向堆栈顶端,SS包含了堆栈的段地址,而DS包含了数据段的段地址。3标签标签没有长度限制,但在内嵌汇编器中只有前32个字符有效。局部标签必须有符号开头例:MOV ECX,Delay1:LOOP 14汇编指令Delphi内嵌汇编器支持3种汇编指令:DB定义字节:该指令产生单字节的数据,每个操作数可以是常量表达式8位,或者是任意长度的字符串。DW定义字:该指令产生一序列字,每个操作数可以是常量表达式16位,或者地址表达式。DD定义双字:该指令产生一序列字,每个操作数可以是常量表达式32位,或者地址表达式例: asm
49、DB 0FFH 一个字节 DB 0,99 两个字节 DB A DB Hello world,0DH,0AH DB 12,“Delphi DW 0FFFFH 一个字 DW 0,9999 两个字 DW A 与DB A、0一样 DW BA与DB A、B一样 DD 0FFFFFFFFH 一个双字 DD 0,99999999 两个双字 DD A 与DB A、0、0、0一样 DD DCBA 与DB A、B、C、D一样 end; 变量声明Var ByteVar:Byte; WordVar:Word; IntVar:Integer;asm MOV AL,ByteVar MOV BX,WordVar MOV E
50、CX,IntVarend;操作数内嵌汇编器的操作数可以是常量、存放器、符号和运算符保存字Var ch:charasm MOV Ch,1 将1装入CH存放器 MOV &Ch,1将1赋给CH变量End;2表达式Object Pascal与汇编表达式的不同表达式元素表达式类别表达式类型1Object Pascal与汇编表达式的不同Object Pascal与汇编表达式的最大区别在于所有汇编的表达式必须分解成单独的可以在编译时计算的常量Const X=10; Y=20;Var Z:Integer;asm MOV Z,X+Yend;Var X,Y, Z:Integer;asm MOV EAX,X ADD
51、 EAX,Y MOV Z, EAXend;2表达式元素常量存放器符号常量内嵌汇编器支持两种类型的常量:数值常量:32位,一般用十进制,也支持二进制数据后加B,八进制O,十六进制H或前加$ 字符串常量:字符串必须包括在单引号或双引号之间存放器寄存器保留字32位通用寄存器EAX EBX ECX EDX32位指针或变址寄存器ESP EBP ESI EDI16位通用寄存器AX BX CX DX16位指针或变址寄存器SP BP SI DI低8位寄存器AL BL CL DL16位段寄存器CS DS SS ES高8位寄存器AH BH CH DH协处理器寄存器堆栈ST符号Delphi的内嵌汇编器支持在汇编代码
52、中存取几乎所有的Object Pascal标识符,此外还支持特殊符号Result,它对应的是函数内部的结果变量。Function Sum(X,Y:integer):Integer;Begin Result:=X+Y;End;Function Sum(X,Y:integer):Integer;stdcall;Begin asmMOV EAX,XADD EAX,Y MOV Result,EAX end;End;下述的符号不能在汇编语句中使用:标准过程和函数例如WriteLn和ChrMem,MemW,MemL,Port和PortW等特殊数组字符串变量,浮点数和集合常量没有在当前块声明的标签在函数外的
53、Result符号3表达式类别在内嵌汇编程序中将表达式分为:存放器、内存引用和立即数Const start=10;Var count:integer;AsmMOVEAX,startMOV EAX,xxxx MOVEAX,countMOV EAX,xxxx MOVECX,startMOV ECX,xxxx MOVEDX,OFFSET countMOV EDX,xxxxEnd;4表达式类型每个内嵌汇编表达式都有一个类型,更确切的是都具有长度,因为汇编器仅仅是简单地将表达式类型视作内存位置的长度。Var QuitFlag:Boolean; /一个字节 OutBuf:Word; /一个字AsmMOVAL, QuitFlag MOVBX, OutBuf MOVDL, OutBuf 出错End;类型转换:MOVDL, BYTE PTR OutBufMOV
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026届银川市重点中学高三英语第一学期期末达标测试试题含解析
- 票据管理制度适用范围(3篇)
- 药品纸箱管理制度范本(3篇)
- 设计工时管理制度范本(3篇)
- 辅材配件管理制度范本(3篇)
- 野生种质资源圃管理制度(3篇)
- 防疫临时驻场人员管理制度(3篇)
- 食品品质责任管理制度内容(3篇)
- 疾病预防与安全应急 溺水的预防与急救 课件2025-2026学年人教版初中+体育与健康七年级全一册
- 中学学生社团财务管理制度
- 2026年药店培训计划试题及答案
- 2026春招:中国烟草真题及答案
- 六年级寒假家长会课件
- 物流铁路专用线工程节能评估报告
- 2026河南省气象部门招聘应届高校毕业生14人(第2号)参考题库附答案
- 2026天津市南开区卫生健康系统招聘事业单位60人(含高层次人才)备考核心试题附答案解析
- 2025江苏无锡市宜兴市部分机关事业单位招聘编外人员40人(A类)备考笔试试题及答案解析
- 卵巢过度刺激征课件
- 汉服行业市场壁垒分析报告
- 重睑手术知情同意书
- 2026华润燃气校园招聘(公共基础知识)综合能力测试题附答案解析
评论
0/150
提交评论