VB下基于Modbus规约的串口通信 VB下基于Modbus规约的串口通信 Serial Communication Based on Modbus Protocol with Microsoft Visual Basic 董立君刘书伟侯逸青(航天空气动力技术研究院,北京100074) 摘要 主要介绍Modbus-RTU规约,并在分析其通信原理的基础上,结合一个应用实例给出了VB6.O编程环境下利用 MSComm通信控件实现基于该规约的工控机与数字显示表之间的串口通信编程方法。 关键词:MsComm控件,RS-485,Modbus协议,CRC校验 Abstract Modbus-RTU protocol is introduced briefly,and on the basis of analyse its communication principle,make use of MSComm ActiveX realize serial communication way of programming between IPC and digital display meter based on Mod- bus-RTU protocol under Microsoft visual basic6.0 integrate an application. Keywords:MsComm control,RS-485,Modbus protocol,CRC check 本文主要从应用的角度利用VB6.0的MicroSoft Com- 。P据能数显表数形量入优348口) munication控件和Modbus-RTU协议,成功实现了某锥位控 出可粒塔言谁过言地址勤位验码 制系统中工控机与带RS-485输出接口的智能数字显示表之间 01 0300000002 C40B 的串行通信功能。所用工控机为凌华Rack-610系列。DMP- 一内甲口发送的1进制命伞事 ANFA数字显示表应用于某锥位控制系统中锥位的显示,工控 康入的进制代风笔4入字节为意里我的量据 机通过读取其显示值作为反馈信号,实现锥位的闭环控制。 01030400000C667P19 1DMP-ANFA数字显示表的设置 数盈表10进重宽昆劳 在DMP-ANFA数字显示表的内部已经固化好Modbus- R几U通信协议及工作指令,允许用户预先设定本机的地址码。此 外,要注意通信波特率必须与工控机的波特率相匹配。 本例数字显示表设置: 2 开始 停止 通信地址码:01 通信波特率:9600 小数点:2位 图1工控机通信软件界面 显示最大量程:100.00 MSComm1..InputMode=comlnputModeBinary/设定为二进制的数 显示最小量程:0.00 据流方式 /一次全部读入缓冲区全部内容 2工控机通信软件 MSComm1.InputLen =0 MSComm1.PortOpen=True //打开通讯端口 本文的工控机通信软件主要是利用Visual Basic6.0中的 MSComm1.InBufferCount-0/清空接收缓冲区 Mscomm通信控件来实现的,在VB6.0中对串口进行编程使用 MSComm1.RThreshold=9/设置输入缓冲区字符输入门限 Mscomm控件可加快开发进度。该控件主要是为RS-232的通 (3 Modbus--RTU协议的CRC校验的实现方法 用串口而设计.所以为了利用工控机上现有的RS-232接口,通 冗余循环码(CRC)包含2个字节,即16位二进制.CRC码 常是使用RS232/485的转换器。通过转换器,我们就可以像开 由发送设备计算,放置于发送信息的尾部。接收信息的设备再重 发通用的RS-232串口一样来快速开发基于RS-485接口的工 新计算接收到信息的CRC码,比较计算得到的CRC码是否与 控机通信软件。 接收到的相符,如果两者不相符,则表明出错。 工控机通过RS232接口,经RS232/RS485转换模块与数 计算CRC码的步骤为: 字显示表相连接,数字显示表被赋予唯一的通讯地址码用以识 预置16位寄存器为十六进制FF干F(即全为1)。称此寄存 别身份,这样上位工控机即能通过RS-485总线实现对进锥系 器为CRC寄存器: 统锥位位置的采集与监控。 把第一个8位数据与16位CRC寄存器的低位相异或,把 (1)工控机通信软件界面 结果放于CRC寄存器: (2)MSComm控件初始化程序设计 把寄存器的内容右移一位(朝低位),用0填补最高位,检查 根据数字显示表的串行通信协议规定,在MSComm控件 最低位: 初始化程序中,主要是进行一些必须的串口初始化设定。具体的 如果最低位为0:重复第3步(再次移位):如果最低位为1: 操作如下面代码说明: CRC寄存器与多项式A001(1010000000000001)进行异或: MSComm1.CommPort =1 /设定需要使用的串口 重复步骤3和4,直到右移8次,这样整个8位数据全部进 MSComm1.Settings:="9600,n,8,1”/设定传输的波特率和校验方式 1994-201 China Academic Journal Electronic Publishingll rights reserved. http://www.cnki.net
本文主要从应用的角度利用 !"#$% 的 &’()*+*,- .*/0 /12’(3-’*2 控件和 &*4516789: 协议,成功实现了某锥位控 制系统中工控机与带 8+7;7#?% 系列。@&A7 BCDB 数字显示表应用于某锥位控制系统中锥位的显示,工控 机通过读取其显示值作为反馈信号,实现锥位的闭环控制。 ! "#$%&’(& 数字显示表的设置 在 @&A7BCDB 数字显示表的内部已经固化好 &*45167 89: 通信协议及工作指令,允许用户预先设定本机的地址码。此 外,要注意通信波特率必须与工控机的波特率相匹配。 本例数字显示表设置: 通信地址码:%? 通信波特率:E#%% 小数点:F 位 显示最大量程:?%%$%% 显示最小量程:%$%% ) 工控机通信软件 本文的工控机通信软件主要是利用 !’613G "36’( #$% 中的 &6(*// 通信控件来实现的,在 !"#$% 中对串口进行编程使用 &6(*// 控件可加快开发进度。该控件主要是为 8+7FHF 的通 用串口而设计。所以为了利用工控机上现有的 8+7FHF 接口,通 常是使用 8+FHF I ;K 16K *, &+.*// B(-’WKX )K3G’YK 6K)’3G (*//12’(3-’*2 V3Q *, P)*L)3//’2L 5K-VKK2 OA. 324 4’L’-3G 4’6PG3Q /K-K) 536K4 *2 &*40 516789: P)*-*(*G 124K) &’()*6*,- W’613G 536’(#$% ’2-KL)3-K 32 3PPG’(3-’*2$ 01234-5+Z&6.*// (*2-)*GN8+7; 图 ? 工控机通信软件界面 !" 下基于 &*4516 规约的串口通信 <
《工业控制计算机》2006年19卷第8期 9 重复步骤2到步骤5,进行下一个8位数据的处理: 在锥位实时显示、反馈控制系统中,可在定时器Timer1的 最后得到的CRC寄存器即为CRC码。 Timer事件中工控机定时查询数字显示表显示数据,Interval属 根据上述规则,编写VB下CRC校验码程序如下: 性值不能设置低于100ms。 Public Function CrcResult(ByVal Data As Long,ByVal Genpoly (6)数字显示表数值读取 As Long.ByVal CrcData As Long)As Long /计算校验码 Modbus协议通过主设备(工控机)、从设备(数字显示表) Dim i As Integer 间的询问应答环路交换信息。 Data =Data2 图2是Modbus协议的询问应答环路。 For i =8 To 1 Step -1 Data =Fix(Data /2) 上设备查询消息 If ((Data Xor CrcData)And 1)Then 设各地址 CrcData Fix(CrcData /2)Xor Genpoly 功能代码 Else 派段1 数话设n CrcData Fix(CrcData 2) 散据政 研误湖 End If 从设备回成清息 Next i CrcResult =CrcData 图2 Modbus协议的询问应答环路 End Function DMP-ANFA数字显示表采用Modbus RTU通讯规约,利 计算得到的CC校验码添加到命令时,必须按低位字节在 用通讯命令,可以进行读取点(“保持寄存器”)或返回值(“输入 前、高位字节在后的顺序放置。例如,对本通信软件界面中工控 寄存器”)的操作。当通讯命令发送至仪表时,符合相应地址码的 机查询命令调用计算校验码函数得到其CRC码为0BC4,则命 设备接通讯命令,并除去地址码,读取信息,如果没有出错,则执 令中最后两个字节是C4、0B。 行相应的任务:然后把执行结果返送给发送者。保持和输入寄存 (4)MSComm控件的触发事件 器都是16位(2字节)值,并且高位在前、低位在后。这样用于仪 在VB的控件工具箱中,提供了一个使用非常方便的串行 表的读取点和返回值都是2字节。由于一些可编程控制器不用 通信控件MSComm,它全面地提供了使用串行通信上层开发的 功能码03,所以功能码O3被用作读取点和返回值。从机(数字 所有细则,串行通信的实现既可以采用中断方式,又可以采用查 显示表)响应的命令格式是从机地址、功能码、数据区及CRC 询方式。MSComm控件提供了实现串行端口中断功能的On- 码。如果出错就不发送任何信息。 Comm事件,该事件是唯一的,可以截取串口的任何消息,当有 数字显示表应答命令中的地址码、功能码必须与工控机机 串口事件或错误发生时,VB程序就会自动转入OnComm事件 查询命令相同:命令中的模拟量数据按高位字节在前、低位字节 处理程序中.CommEvent属性存有串口最近的事件或错误的数 在后的顺序放置,而CRC码与此相反,是低位字节在前、高位字 值代码,可以在程序中随时读取CommEvent属性值来了解通 节在后。 信的状况,OnComm事件是和CommEvent属性密切相关、一 以工控机通信软件界面的显示为例,介绍数字显示表数值 起使用,当任何一个OnComm事件或错误发生时,都会使得 读取的命令格式和内容。 CommEvent属性值改变。在OnComm事件处理过程中,可以 工控机和数字显示表之间采用查询与应答方式进行通信, 通过判断CommEvent属性值,对于不同的属性值转入不同的 每一种查询命令都对应着一种应答。工控机发出的查询命令格 事件处理过程。CommEvent属性的返回值为2时,表示接收缓 式如表1所示。 冲区中的受到RThreshold个字符(本文设为9),这时可以引发 表1工控机查询偷令格式 接收中断事件,当RThreshold属性设为O时,不引发接收中断 事件。 地址码功能码起始数据高、低字节数据长度高,低字节CC校验码 本例OnComm事件处理程序: 01 03 0000 00 C4 0B Private Sub MSComm1_OnComm() 地址码“01”表示工控机要求查询01号数字显示表,功能码 Dim bytInput()As Byte Dim intInputLen As Integer “03”表示数字显示表要求读保持寄存器操作,起始数据“00 intInputLen MSComm1.InBufferCount 00”表示从第1个数据开始读,数据长度“0002”表示要求读取 ReDim bytInput(intlnputLen) 2个模拟量数据。 bytInput MSComm1.Input 数字显示表接收到表1所示命令时的正确信息应答格式如 Call InputManage(bytInput,.intInputLen)/处理接受到的命令 表2所示。 Call GetDisplayText /以十六进制显示接受字符 表2数字显示表应答命令格式 End Sub 地址码功能码数据字节数据高、低字节 数据高.低字节CC校验码 (5)其他几项重要处理 当程序启动时,打开串口:退出程序时,关闭串口 01 03 04 00 00 oC 66 7 19 (MSComm1.PortOpen=False),以便使各种操作在串口打开状 表中“01、03”如前所述,“04”为数字显示表发送数据的字 态下进行。 节个数,即数据共发送了4字节(2个数据):“00000C66”为 由于控制软件中,串行通信发送和接收的数据多为十六进 2个数据的高、低字节值。 制,因此,须进行以下两种操作:字符串表示的十六进制数据转 由于数字显示表应答数据为十六进制数,所以在保留小数 化为相应的字节串:字符表示的十六进制数转化为相应的整数。 (下转第11页) 1994-2011 China Academic Journal Electronic Publishing House.All rights reserved. http://www.cnki.net
《工业控制计算机》!""# 年 $% 卷第 & 期 重复步骤 ! 到步骤 ’,进行下一个 & 位数据的处理; 最后得到的 ()( 寄存器即为 ()( 码。 根据上述规则,编写 *+ 下 ()( 校验码程序如下: ,-./01 2-314053 (61)78-/4 9+:*;/ 53?@ +:*;/ A73B5/: =8 >53?@ +:*;/ (6153?C =8 >53? D D 计算校验码 73 =8 F347?76 034F3B-4>73 G TJ(5EE$YF3+-MM76(5-34 )773C .:4F3B-4 G TJ(5EE$YF3B-4 (;// F3B-4T;3;?79.:4F3B-4@ 034F3B-4>73C D D 处理接受到的命令 (;// A74<08B/;:I7L4 D D 以十六进制显示接受字符 Q3O J-. (’)其他几项重要处理 当 程 序 启 动 时 , 打 开 串 口 ; 退 出 程 序 时 , 关 闭 串 口 (TJ(5EE$Y,564UB73G2;/87),以便使各种操作在串口打开状 态下进行。 由于控制软件中,串行通信发送和接收的数据多为十六进 制,因此,须进行以下两种操作:字符串表示的十六进制数据转 化为相应的字节串;字符表示的十六进制数转化为相应的整数。 在锥位实时显示、反馈控制系统中,可在定时器 I0E76$ 的 I0E76 事件中工控机定时查询数字显示表显示数据,F3476W;/ 属 性值不能设置低于 $""E8。 (#)数字显示表数值读取 T5O.-8 协议通过主设备(工控机)、从设备(数字显示表) 间的询问应答环路交换信息。 图 ! 是 T5O.-8 协议的询问应答环路。 图 ! T5O.-8 协议的询问应答环路 <T,K=R2= 数字显示表采用 T5O.-8 )IZ 通讯规约,利 用通讯命令,可以进行读取点(“保持寄存器”)或返回值(“输入 寄存器”)的操作。当通讯命令发送至仪表时,符合相应地址码的 设备接通讯命令,并除去地址码,读取信息,如果没有出错,则执 行相应的任务;然后把执行结果返送给发送者。保持和输入寄存 器都是 $# 位(! 字节)值,并且高位在前、低位在后。这样用于仪 表的读取点和返回值都是 ! 字节。由于一些可编程控制器不用 功能码 "[,所以功能码 "[ 被用作读取点和返回值。从机(数字 显示表)响应的命令格式是从机地址、功能码、数据区及 ()( 码。如果出错就不发送任何信息。 数字显示表应答命令中的地址码、功能码必须与工控机机 查询命令相同;命令中的模拟量数据按高位字节在前、低位字节 在后的顺序放置,而 ()( 码与此相反,是低位字节在前、高位字 节在后。 以工控机通信软件界面的显示为例,介绍数字显示表数值 读取的命令格式和内容。 工控机和数字显示表之间采用查询与应答方式进行通信, 每一种查询命令都对应着一种应答。工控机发出的查询命令格 式如表 $ 所示。 表 $ 工控机查询命令格式 地址码“"$”表示工控机要求查询 "$ 号数字显示表,功能码 “"[”表示数字显示表要求读保持寄存器操作,起始数据“"" ""”表示从第 $ 个数据开始读,数据长度“"" "!”表示要求读取 ! 个模拟量数据。 数字显示表接收到表 $ 所示命令时的正确信息应答格式如 表 ! 所示。 表 ! 数字显示表应答命令格式 表中“"$、"[”如前所述,“"S”为数字显示表发送数据的字 节个数,即数据共发送了 S 字节(! 个数据);“"" "" "( ##”为 ! 个数据的高、低字节值。 由于数字显示表应答数据为十六进制数,所以在保留小数 (下转第 $$ 页) 地址码 功能码 起始数据高、低字节 数据长度高、低字节 ()( 校验码 "$ "[ "" "" "" "! (S "+ 地址码 功能码 数据字节 数据高、低字节 数据高、低字节 ()( 校验码 "$ "[ "S "" "" "( ## \2 $% %
《工业控制计算机》2006年19卷第8期 判优法来解决,控制逻辑原理框图如图3所示。在该接口电路 FFFFFFH 16M A0000H 中,选用可编程器件来实现组合逻辑和时序逻辑,简化了印制电 单色CGA/EGA EMB NGA 路板的设计、缩小了系统的体积、提高了系统的可靠性。 扩展任储器 录示RAM-VRAM 10FFFFH 1088K C0000H 开 HMA 视顿/碰盘B1OS、 EMS、 ROM FFFFFH 1024K 扩充区 E0000H 斋瑞存储器 保留区 系统怀储器 A0000H 640K F0000H 地增口 基本存储器 系统ROM 00000H OK FFFFFH 存储器地址分配 岛端竹储器地址分配 图4存储器地址分配 右纷号 32KB)地址空间,作为双端口SRAM的映射区域。对于ISA总 线,CPU有16M的寻址空间,若在微机1M主存内没有空闲地 址空间,则可向1M主存以上的扩展存储器地址空间寻求双端 口SRAM的映射入口地址。 在使用双端口SRAM时,当两台微机同时对双端口SRAM 的同一存储单元进行读或写操作时,就产生了争用,会出现写入 图3控制逻辑原理框图 值或读出值不是所期望数值的混乱状态。一般解决双端口争用 控制逻辑部分硬件描述如下: 的方法有4种:①硬件判优法,这种方法是纯硬件方法,其利用 Module SRAM 双端口SRAM的片内硬件判优电路来确定端口的优先权,由双 title UR 端口SRAM的/BUSY Pin读出状态信息来判别端口占用与否。 UR device 'p20v8c'; ②中断法。③令牌传递法,中断法与令牌传递法为软硬结合的方 MWS,MRS,RA14,RA15,RA16,RA17.RA18.RA19.BSL,BSR pin 2,3,4, 法,不仅要求双端口SRAM在硬件上具有中断引脚和令牌引 5.6.78.9.10.11: RWR,OER,KR,CER,MCS16S,SR pin 17,18,19,20,21,22: 脚,而且需要相应的软件配合,软件的工作是向各标识单元置初 EQUATIONS 值,并在双端口SRAM的工作过程中不断地读写标识位,来确 KR=IMWS&RA19&RA18&RA17&RA16&RA15: 定端口的优先权。④软件判优法,该方法为纯软件方法,其思想 IKR=IMRS&RA19&RA18&IRA17&RA16&IRA15: 是在两个端口的CPU之间建立“握手”信号,一个端口在读写 MCS16S-RA19&RA18&IRA17&RA16&!RA15: 双端口SRAM之前,先看对方是否已占用了双端口SRAM,若 IOER=RA19&RA18&IRA17&RA16&RA15&IMRS&BSL: 未用,则本方使用双端口SRAM,并通过握手信号通知对方本端 ICER=RA19&RA18&IRA17&RA16&!RA15&BSL: 口已占用了双瑞口SRAM,操作结束后再通知对方本方结束占 IRWR=IMWS&RA19&RA18&!RA17&RA16&IRA15&BSL: SR=RA19&RA18&1RA17&RA16&!RA15&BSL: 用双端口SRAM。 End 在使用双端口SRAM时,其体采用何种方法来解决争用问 3运用双端口SRAM的关键技术 题,须根据双端口SRAM芯片的硬件特性和系统的功能特性来 现今,SA总线在工控机中仍然有一定的应用,双端口 定。本接口电路选用的DT70261L功能强大,采用4种方法均 SRAM对于ISA总线的入口地址依靠设计者选择,而对于PCI 可,结合系统的功能要求,笔者采用了硬件判优法,简洁高效地 总线,用户接口线路的入口地址是随机配备的,因此在SA总线 解决了双端口RAM的争用问题。 中为双端口SRAM选择入口地址十分关键。本文介绍存储器映 4结束语 射方式下双端口SRAM入口地址的选择设计思想。 本文阐述的双系统微机通信接口电路的设计方法已得到运 存储器映射方式,即从微机内存中划出一块区域供双端口 用,该接口电路的功能稳定可靠,且成本低。其设计思想在多系 SRAM使用。要在微机内存中寻求一段空闲地址,首先必须清楚 统微机通信接口中具有普遍意义。 微机内存地址空间分配情况,以PC/AT为例,其地址空间分配 参考文献 如图4所示。 [1]刘乐普,微型计算机接口技术及应用[M们.武汉:华中科技大学出版 在此,双端口SRAM寻找映射入口地址的具体方法为:从 社,2000 微机存储器地址分配图中可看到,一般来说,入口地址可在 [2]陈赜等.在系统可编程技术[M].北京:科学出版社,2001 COO0OH到DFFFFH区间寻找,在微机1M主存内,选取微机系 [3]王士元.C高级实用程序设计[M们.北京:清华大学出版社,1996 统没有使用的连续32KB(此处双端口SRAM的存储容量为 [收稿日期:2005.12.10] (上接第9页) 点两位的情况下将读取数据转化为十进制读数如下: 参考文献 (0*26+0*22+12w2+6*2+6)/100=31.74 [1]范逸之,等.Visual Basic与RS-232串行通信控制[M.北京:清华大 3结束语 学出版社,2002 本系统已在某进锥系统锥位控制中成功使用,这种通信方 [2]范逸之,等.利用Visual Basic实现串并行通信技术M].北京:清华 式灵活方便,结构简单,可靠性高,完全达到了预期的要求,具有 大学出版社,2001 较好的赛际价值和使用凭ademi ouaEcro Publishng House,All rights reserved. 收稿日期:2006.2.15] http://www.cnki.net
《工业控制计算机》!""# 年 $% 卷第 & 期 (上接第 % 页) 点两位的情况下将读取数据转化为十进制读数如下: ("!!$# ’"!!$! ’$!!!& ’#!!( ’#)) $""*+$,-( ! 结束语 本系统已在某进锥系统锥位控制中成功使用,这种通信方 式灵活方便,结构简单,可靠性高,完全达到了预期的要求,具有 较好的实际价值和使用性。 参考文献 [$]范逸之,等,./0123 420/5 与 678!+! 串行通信控制9:;,北京:清华大 学出版社,!""! [!]范逸之,等,利用 ./0123 420/5 实现串并行通信技术9:;,北京:清华 大学出版社,!""$ 收稿日期:!""#,!,$13? 76@: A/A3? BC6B C6 >?D/5? BE!"D&5BF :G7H:67H6@$(H6@$ ! 运用双端口 "#$% 的关键技术 现今,Q7@ 总 线 在 工 控 机 中 仍 然 有 一 定 的 应 用 , 双 端 口 76@: 对于 Q7@ 总线的入口地址依靠设计者选择,而对于 UNQ 总线,用户接口线路的入口地址是随机配备的,因此在 Q7@ 总线 中为双端口 76@: 选择入口地址十分关键。本文介绍存储器映 射方式下双端口 76@: 入口地址的选择设计思想。 存储器映射方式,即从微机内存中划出一块区域供双端口 76@: 使用。要在微机内存中寻求一段空闲地址,首先必须清楚 微机内存地址空间分配情况,以 UN ) @P 为例,其地址空间分配 如图 ( 所示。 在此,双端口 76@: 寻找映射入口地址的具体方法为:从 微机存储器地址分配图中可看到,一般来说,入口地址可在 N""""V 到 WXXXXV 区间寻找,在微机 $: 主存内,选取微机系 统没有使用的连续 +!M4(此处双端口 76@: 的存储容量为 +!M4)地址空间,作为双端口 76@: 的映射区域。对于 Q7@ 总 线,NUC 有 $#: 的寻址空间,若在微机 $: 主存内没有空闲地 址空间,则可向 $: 主存以上的扩展存储器地址空间寻求双端 口 76@: 的映射入口地址。 在使用双端口 76@: 时,当两台微机同时对双端口 76@: 的同一存储单元进行读或写操作时,就产生了争用,会出现写入 值或读出值不是所期望数值的混乱状态。一般解决双端口争用 的方法有 ( 种:!硬件判优法,这种方法是纯硬件方法,其利用 双端口 76@: 的片内硬件判优电路来确定端口的优先权,由双 端口 76@: 的 ) 4C7Y U/J 读出状态信息来判别端口占用与否。 "中断法。#令牌传递法,中断法与令牌传递法为软硬结合的方 法,不仅要求双端口 76@: 在硬件上具有中断引脚和令牌引 脚,而且需要相应的软件配合,软件的工作是向各标识单元置初 值,并在双端口 76@: 的工作过程中不断地读写标识位,来确 定端口的优先权。$软件判优法,该方法为纯软件方法,其思想 是在两个端口的 NUC 之间建立“握手”信号,一个端口在读写 双端口 76@: 之前,先看对方是否已占用了双端口 76@:,若 未用,则本方使用双端口 76@:,并通过握手信号通知对方本端 口已占用了双端口 76@:,操作结束后再通知对方本方结束占 用双端口 76@:。 在使用双端口 76@: 时,具体采用何种方法来解决争用问 题,须根据双端口 76@: 芯片的硬件特性和系统的功能特性来 定。本接口电路选用的 QWP-"!#$I 功能强大,采用 ( 种方法均 可,结合系统的功能要求,笔者采用了硬件判优法,简洁高效地 解决了双端口 6@: 的争用问题。 & 结束语 本文阐述的双系统微机通信接口电路的设计方法已得到运 用,该接口电路的功能稳定可靠,且成本低。其设计思想在多系 统微机通信接口中具有普遍意义。 参考文献 [$]刘乐善,微型计算机接口技术及应用[:],武汉:华中科技大学出版 社,!""" [!]陈赜等,在系统可编程技术[:],北京:科学出版社,!""$ [+]王士元,N 高级实用程序设计[:],北京:清华大学出版社,$%%# [收稿日期:!""<,$!,$"] 图 ( 存储器地址分配 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! $$