组态王与单片机通信协议1
基于ASCII的单片机与组态王通讯设计

命令格式可查阅组态王使用手册。
2 通 信 流 程 图 1 组态 王从 单 片机 读 数 据 过 程 如 图 1所 示 。 )
字 头 HE AD: 1字节 1个 AS I , 0 Cl码 4 H
设备 地 址 : 节 2个 A CI , ~ 5 ( 0 0 0f 1字 S l 0 2 5 即 ~ xf 码 H)
标志: 1字 节 2个 AS l , i bi bt 0:读 , i =1: Cl码 bt 0~ t i 7, 0= bt 0
写 。 i : : 打包 。 i b 2 0 , bt O 不 1 bt i = 0 数据 类 型 为字 节 。 i bt = 1 3 t bt i 0 , 3 2 数据 类 型为 字 。bt bt = X 数 据 类 型为 浮 点 数 。 i i 1, 3 2
单 片 机的 串行 通 信 , 建 监 控 系 统 。 文 完 成 了组 态 王 与 单 片 机 构 本
通 讯 正 常 时下 位 单 片 机 应 答 格 式 为
HA ED 设 备 地 址 # # 蚌或 CR l ( 式 5 格 )
的通 讯 设 汁 , 方 法 设 汁简 单 且 实 时 性 好 , 用 于一 般 用 户 。 该 适 1 组 态 王 与 单 片机 的通 信 协 议
HE AD 设备 地址 标 志 数据 地 址 数据 字 节数 数 据 异 或 CR
通 讯 不 正常 时下 位 单 片机 应 答 为
J A J设备地址 j { HE D 异或 c J( 6) R 格式
其 中
和 舟} 不 同 的数 值 , }为 具体 组 态 王 与 单 片机 通 讯 的
异 或 :异 或 从 设 备 地址 到异 或 字 节前 ,异 或 值 转 换 成 2个
通用单片机通讯协议(ASCII)

1、在单片机中定义从地址0开始的数据类型为BYTE型的变量:
则在组态王中定义相应的变量的寄存器为X0、X1、X2、X3、X4。。。。。。。。,数据类型为BYTE,每个变量占一个字节
2、在单片机中定义从地址100开始的数据类型为UINT型的变量:
则在组态王中定义相应的变量的寄存器为X100、X102、X104、X106、X108。。。。。。。。,数据类型UINT,每个变量占两个字节
bit3bit2 =1x,数据类型为浮点数。
数据地址:2字节4个ASCII码,0x0000~0xffff
数据字节数:1字节2个ASCII码,1—100,实际读写的数据的字节数。
数据…:为实际的数据转换为ASCII码,个数为字节数乘2。
异或:异或从设备地址到异或字节前,异或值转换成2个ASCII码
CR:0x0d。
46
30
30
30
46
30
34
31
30
46
46
46
46
30
30
字头
设备地址15
标志
写操作
浮点型
打包
数据地址15
数据字节数4
数据65535
30
30
0d
异或
若正确:
40
30
46
23
23
37
36
0d
字头
设备地址15
##
异或
若不正确:
40
30
46
2a
2a
37
36
0d
字头
设备地址15
**
异或
5.浮点数格式:
4字节浮点数=第一字节高4位ASCII码+第一字节低4位ASCII码
单片机与组态王的通信实例

单片机与组态王的通信实例随着工业自动化的发展,越来越多的设备开始采用单片机进行控制。
而组态王作为一种通用的组态软件,可以方便地对单片机的控制过程进行监控和操作。
本文将介绍一个单片机与组态王通信的实例,以帮助读者了解二者的基本通信原理和实现方法。
一、单片机与组态王的通信方式单片机与组态王之间的通信一般采用串口通信方式。
串口通信是一种常见的通信方式,它通过串口数据线将单片机与计算机连接起来,实现数据传输。
在组态王中,可以通过设置串口参数来与单片机进行通信。
二、单片机通信协议在单片机与组态王通信的过程中,需要约定一些通信协议来实现数据的传输和控制。
通信协议一般包括数据格式、波特率、校验方式等。
根据不同的单片机和组态王版本,通信协议可能会有所不同,需要根据实际情况进行调整。
三、组态王通信控件的使用在组态王中,可以使用串口通信控件来实现单片机与组态王之间的通信。
控件提供了许多函数和属性,可以方便地进行串口通信。
例如,可以使用控件的Open函数打开串口,使用Read函数和Write函数进行数据的读取和写入。
四、实例:单片机控制LED灯亮灭下面是一个简单的单片机与组态王通信实例:通过单片机控制LED灯的亮灭。
该实例中使用的单片机型号为AT89C51,组态王版本为6.53。
1、硬件连接将AT89C51单片机的P1.0引脚连接到LED灯上,并将单片机的RXD 和TXD引脚分别连接到计算机的串口上。
2、编写程序在AT89C51单片机上编写程序,用于控制LED灯的亮灭。
程序如下:MOV P1.0, #1 //将P1.0引脚电平设为高电平,LED灯亮SJMP $ //无限循环,保持电平不变3、组态王组态设计在组态王中创建一个新项目,并添加一个设备,选择与AT89C51单片机进行通信的串口设备。
然后创建一个画面,添加一个按钮和指示灯,用于控制LED灯的亮灭。
4、编写组态王脚本程序在组态王中编写脚本来实现与单片机的通信。
脚本如下:Dim ledState As Integer //定义LED状态变量,初始值为0 Function OnClick() As Integer //按钮单击事件处理函数If ledState = 0 Then //如果LED状态为灭,则发送高电平信号,使LED亮起CommandManager.WriteTag("TagName", "1") //写入高电平信号ledState = 1 //修改LED状态为亮Else //如果LED状态为亮,则发送低电平信号,使LED熄灭CommandManager.WriteTag("TagName", "0") //写入低电平信号ledState = 0 //修改LED状态为灭End IfEnd Function5、调试与运行将程序编译并下载到AT89C51单片机中,然后运行组态王程序。
单片机与组态王软件通讯的解决方案

单片机与组态王软件通讯的解决方案
1、引言
组态王软件作为一种工业控制组态软件在国内已得到了非常广泛的应用。
其具有强大的硬件支持能力,对国内外绝大多数PLC、变频器、板卡、模块、仪器仪表都编写了相应的驱动程序,使用起来相当方便快捷。
在农水实验田环境监测项目中,我们使用的硬件设备包括日本三菱PLC、台湾研华亚当模块及自行开发的基于单片机的分析仪器,我们选择的软件开发平台是组态王软件。
因此,实现单片机与组态王的数据通讯是一个必须解决的问题。
2、单片机与组态王软件通讯的解决方案
2.1 两种通讯解决方案
单片机与组态王软件通讯的解决方案有两种,其一是直接编写支持单片机的驱动程序,就象组态王支持PLC 一样;其二是利用组态王软件和Visual Basic 都支持DDE 的特点,以VB 为开发平台,写一个数据通讯应用程序,一方面
实现与单片机的连接,另一方面实现与组态王的动态数据交换。
2.2 两种方案的比较
第一种方案的优点是程序结构比较紧凑,数据通讯效率较高;缺点是必须由对组态王软件内核比较清楚的程序员开发,开发周期较长。
第二种方案可由一般的程序员开发,缺点是数据通讯效率较低。
在本项目中,我们采用了第二种方案。
3、基于DDE 方案的实现
3.1 DDE 的概念
DDE 是WINDOWS 平台上的一个完整通信协议,它使应用程序能彼此交换数据和发送指令。
DDE 过程可以比喻为两人对话,一方向另一方提出问题,然。
单片机与组态王基于ASCII型通讯程序设计

单片机与组态王基于 A CI S 型通讯程序设计 l
Co m u ia in P o r m b t e CU a d ig e B s d o m nc t r g a o e we n M n K n Viw a e n ASCI r o o s t c l I p o
# e ie E d 0 0 / d f n x d 定 义字 尾 C 一个 A CJ / n R, S I . # e ie e d o o / d f R a x o 上 位机 读 n /
#d fn W re x e ie i O O1 t / 上 位 机 写 /
u h r n we 【] 1x 0O 3 ,x 000000 0 } c a A s r8 = 0 4 ,x 00 3 ,,,.,x d ;
应答 信 息 帧 数 组 / u h rc u t O / c a o n= . 接 收 字 头字 尾 间 数 据 个 数 t / u h rf g 0 c a l = ; / 单 片 机 接 收 到字 头 标 志 a /
Ths i pap ito ce t e er n rdu s h ASCI omm u c i p ooc l bewe KigVi I c niat on r t os t en n ew an MCU, d d an prvi s o de al C pr a l ogrm s ure o c co of m pl de i eme of o muncain nt c m i t pr o ol I ont o otc s. d ne d o ta h t e t at c an f clisdi t us t e y a it r l ie ec y e h ASCI r t o I ooc l p
组态王通用单片机协议(ASCII)说明

组态王通用单片机协议(ASCII)说明概述通用单片机ASCII协议支持单片机与组态王通讯,用户只要按照我们的协议编写单片机通讯程序就可实现与组态王的通讯.组态王设置1、定义组态王设备定义组态王定义设备时请选择:智能模块\单片机\通用单片机ASCII\串口组态王的设备地址定义格式:##.#前面的两个字符是设备地址,范围为0-255,此地址为单片机的地址,由单片机中的程序决定;后面的一个字符是用户设定是否打包,"0"为不打包、"1"为打包,用户一旦在定义设备时确定了打包,组态王将处理读下位机变量时数据打包的工作,与单片机的程序无关.2、组态王通讯通讯方式:RS-232,RS-485,RS-422均可。
波特率:由单片机决定(2400,4800,9600and19200bps)。
注意:在组态王中设置的通讯参数如波特率,数据位,停止位,奇偶校验必须与单片机编程中的通讯参数一致3.组态王数据词典--变量定义在组态王中定义的寄存器数据格式(类型):由单片机决定。
斜体字dd代表数据地址,此地址与单片机的数据地址相对应.注意:在组态王中定义变量时,一个X寄存器根据所选数据类型(BYTE,USHORT,FLOAT)的不同,分别占用一个、两个,四个字节,定义不同的数据类型要注意寄存器后面的地址,同一数据区内不可交叉定义不同数据类型的变量。
为提高通讯速度建议用户使用连续的数据区。
例如,1、在单片机中定义从地址0开始的数据类型为BYTE型的变量: 则在组态王中定义相应的变量的寄存器为X0、X1、X2、X3、X4。
,数据类型为BYTE,每个变量占一个字节2、在单片机中定义从地址100开始的数据类型为USHORT型的变量: 则在组态王中定义相应的变量的寄存器为X100、X102、X104、X106、X108。
数据类型USHORT,每个变量占两个字节3、在单片机中定义从地址200开始的数据类型为FLOAT型的变量: 则在组态王中定义相应的变量的寄存器为X200、X204、X208、X212。
组态王及单片机多机串口通信的设计

组态王与单片机多机串口通信的设计1 引言随着工业化要求提高,分布式系统发展以及控制设备与监控设备之间通讯需要,组态软件设计的监控系统逐步普及。
现在组态软件繁多,比如KingVieW(组态王)、MCGS、WinCC等。
KingView软件基于Microsoft Windows XP,NT/2000操作系统.具有友好的人机操作界面、强大的IO设备端口驱动能力,可与各种PLC、智能仪表、智能模块、板卡、变频器等实时通讯。
由于在检测大量模拟量的工业现场使用PLC与组态软件通讯势必增加产品成随着工业化要求提高,分布式系统发展以及控制设备与监控设备之间通讯需要,组态软件设计的监控系统逐步普及。
现在组态软件繁多,比如KingVieW(组态王)、MCGS、WinCC等。
KingView软件基于Microsoft Windows XP,NT/2000操作系统.具有友好的人机操作界面、强大的IO设备端口驱动能力,可与各种PLC、智能仪表、智能模块、板卡、变频器等实时通讯。
由于在检测大量模拟量的工业现场使用PLC与组态软件通讯势必增加产品成本。
而单片机接口丰富,与A/D转换模块组合可以完成相同的工作,并且系统可靠、成本低。
2 组态王与单片机的串口通讯方法目前,组态王与单片机的通信多是通过动态数据交换(DDE)或通过自己开发通讯驱动程序完成。
DDE是Windows平台上的一个完整的通信协议,组态王通过该协议与其他应用程序交换数据。
但不可靠和非实时。
而自己开发通讯驱动程序会带来设计困难,增加系统开发周期,可行性不高。
组态王专门提供一种与单片机多机串口通信方法,可满足大多数系统需求。
3 PC机与单片机的硬件接口电路图1为上位PC机与下位单片机80C51的连接电路。
PC机与单片机本身都自带串行通讯接口,但由于在分布式系统中PC机与各单片机的分布不集中,不能利用RS-232通讯传输,只能改用RS-485。
RS-485采用差分式传输信号,最大传输距离为1 219 m.最大传输速率为10 Mb/s.对同时出现的两条信号线A、B 的干扰有较强的抑制能力。
单片机与组态王的通信

组态王(kingView)内置了通用单片机通信模块,这样,我们自己开发的单片机仪表就可以挂接在KingView上了。
因为这样,所以对这个东西有了些兴趣,做了些研究。
(1)研究环境组态王6.53,免费下载,当然有使用限制,不过用于研究是没有问题的。
下载地址:/download/index.aspxKeil软件,Porteus,这些就不多说了。
Virtual Serial Ports Driver XP 5.1 虚拟串口软件,用此软件可以生成一对相互联接的虚拟串口,这样,初期的研究工作就在电脑上完成了,省得用硬件电路板了。
(2)资料KingView提供了一份简单的说明材料,就在下载后的解压缩文件包中。
具体的位置是:Value Pack\技术资料\常用协议\单片机ASCII码通讯协议(3)电路搭建注意单片机的TXD与虚拟串口的TXD,单片机的RXD与虚拟串口的RXD是连在一起的,不要交叉哦,我在这上面可吃了不少的苦头。
这个虚拟串口元件的设置如下图所示:说明:这里选COM2,是因为我事先用Vspd生成了一对虚拟串口,com2和com4,至于其他参数则应该选得和kingview中的一致,这个到下面再说。
什么,这个元件不知哪里找?这里啦(4)VSPD的使用现如今的电脑很少有两个串口的了,人呢也是越来越懒了,虽然手边的电路板是现成的,写片子是容易的,但是仍然还是嫌麻烦的,所以就发动狗狗搜一搜,找到了这个VSPD,当然它是很容易用的在first后面选一个串口名,然后在Second后面再选一个串口名,然后点一下Add Pair 就行啦。
怎么选都可以,就算是选com1也是可以的,虽然com1是真实存在的物理串口,但是这个VSPD照样把它给虚拟了。
这里我选的是com2和com4,大家可以看到在左侧的窗口中出现了这样一对互联的串口了,也就是说,我从串口2发数据,然后串口4就能收到。
同样,我从串口4发数据,串口2就能收到。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、通讯参数:通讯参数包括数据位,停止位,波特率、校验方式。
数据位、停止位、波特率由单片机决定。
组态王中的设定和单片机一致即可。
校验方式参照“数据传输格式”中相关部分。
二、数据传输格式:格式1、组态王发送地址请求格式:(此时检验位为1)ENQ Sta EOT CRC格式2、单片机应答地址格式:(此时检验位为0)ACK Sta ETX CRC格式3、组态王读数据请求格式:(此时检验位为0)ENQ R DataType DataAddr DataNum EOT CRC格式4、单片机应答读数据格式(正确):(此时检验位为0)ACK DataLong Data….ETX CRC格式5、单片机应答读数据格式(错误):(此时检验位为0)NAK ErrorCode ETX CRC格式6、组态王写数据请求格式:(此时检验位为0)ENQ W DataType DataAddrData….EOT CRC格式7、单片机应答写数据格式(正确):(此时检验位为0)ACK ErrorCode ETX CRC三、时序:读数据:组态王单片机第一步:格式1第二步:格式2第三步:格式3第四步:格式4或格式5 第五步:如果第四步单片机执行格式4,结束。
否则,执行格式1。
第六步:格式2第七步:格式3第八步:格式4或格式5写数据:组态王单片机第一步:格式1第二步:格式2第三步:格式6第四步:格式7第五步:如果第四步单片机执行格式7的ErrorCode=0,结束。
否则,执行格式1。
第六步:格式2第七步:格式6第八步:格式7四、协议说明:数据传输:所有数据均为16进制数ENQ(头) H05 询问请求帧的开始代码ACK(头) H06 确认ACK应答帧的开始代码NAK(头) H15 否认NAK应答帧的开始代码EOT(尾) H04 正文的结束请求帧的结束ASCII代码ETX(尾) H03 结束正文应答帧的结束ASCII代码Sta::设备地址1字节R:读标志1字节(0x52)W:写标志1字节(0x57)DataType;需要交换的数据类型,1字节。
1,字节;2,字,3,浮点型。
DataType的值含义1 字节2 字3 浮点数DataNum:要读取的数据的数量,1字节。
DataAddr;为数据偏移地址2字节,低字节在前,高字节在后Data:实际传输的数据,低字节在前,高字节在后DataLong: 单片机返回Data的字节数,2字节,低字节在前,高字节在后CRC:为从第一个字节至CRC前的所有字节的异或值,1字节ErrorCode:ErrorCode数值含义0 正确应答1 数据类型错误2 数据范围超限3 指令无法识别,应为R或W。
4 校验错误1.通讯口设置:通讯方式:RS-232,RS-485,RS-422均可。
波特率:由单片机决定(2400,4800,9600and19200bps)。
字节数据格式:由单片机决定。
起始位数据位校验位停止位注意:在组态王中设置的通讯参数如波特率,数据位,停止位,奇偶校验必须与单片机编程中的通讯参数一致2.在组态王中定义设备地址的格式格式:##.#前面的两个字符是设备地址,范围为0-255,此地址为单片机的地址,由单片机中的程序决定;后面的一个字符是用户设定是否打包,“0”为不打包、“1”为打包,用户一旦在定义设备时确定了打包,组态王将处理读下位机变量时数据打包的工作。
3.在组态王中定义的寄存器格式寄存器名称dd上限dd下限数据类型X dd65535 0 FLOAT/BYTE/UINT斜体字dd代表数据地址,此地址与单片机的数据地址相对应。
注意:在组态王中定义变量时,一个X寄存器根据所选数据类型(BYTE,UINT,FLOAT)的不同分别占用一个、两个,四个字节,定义不同的数据类型要注意寄存器后面的地址,同一数据区内不可交叉定义不同数据类型的变量。
为提高通讯速度建议用户使用连续的数据区。
例如,1、在单片机中定义从地址0开始的数据类型为BYTE型的变量:则在组态王中定义相应的变量的寄存器为X0、X1、X2、X3、X4。
,数据类型为BYTE,每个变量占一个字节2、在单片机中定义从地址100开始的数据类型为UINT型的变量:则在组态王中定义相应的变量的寄存器为X100、X102、X104、X106、X108。
,数据类型UINT,每个变量占两个字节3、在单片机中定义从地址200开始的数据类型为FLOAT型的变量:则在组态王中定义相应的变量的寄存器为X200、X204、X208、X212。
,数据类型FLOAT,每个变量占四个字节3.组态王与单片机通讯的命令格式:读写格式(除字头、字尾外所有字节均为ASCII码)字头设备地址标志数据地址数据字节数数据…异或CR说明;字头:1字节1个ASCII码,40H设备地址: 1字节2个ASCII码,0—255(即0---0x0ffH)标志:1字节2个ASCII码,bit0~bit7,bit0= 0:读,bit0= 1:写。
bit1= 0:不打包。
bit3bit2 = 00,数据类型为字节。
bit3bit2 = 01,数据类型为字。
bit3bit2 = 1x,数据类型为浮点数。
数据地址: 2字节4个ASCII码,0x0000~0xffff数据字节数:1字节2个ASCII码,1—100,实际读写的数据的字节数。
数据…:为实际的数据转换为ASCII码,个数为字节数乘2。
异或:异或从设备地址到异或字节前,异或值转换成2个ASCII码CR:0x0d。
通讯尝试恢复命令(COMERROR),请求地址为0的一个BYTE数据3.1.上位机发送读命令字头设备地址标志数据地址数据字节数异或CR下位机应答:若正常:字头设备地址数据字节数数据…异或CR若不正常:字头设备地址** 异或CR例1:读15号仪表,数据地址为15的数据。
其中数据为100,数据类型为字节,不打包。
组态王所发数据为:40 30 46 43 30 30 30 30 46 30 31 37 32 0d字头设备地址15 标志数据地址15 数据字节数1异或读操作字节型不打包若正确:40 30 46 30 31 36 34 37 35 0d字头设备地址15 数据字节数1数据100 异或若不正确:40 30 46 2a 2a 37 36 0d字头设备地址15** 异或例2:读15号仪表,数据地址为15的数据。
其中数据为100,数据类型为字节,打包。
组态王所发数据为:40 30 46 43 32 30 30 30 46 30 31 37 30 0d字头设备地址15标志读操作字节型打包数据地址15 数据字节数1异或若正确:40 30 46 30 31 36 34 37 35 0d字头设备地址15 数据字节数1数据100 异或若不正确:40 30 46 2a 2a 37 36 0d设备地址15** 异或3.2.上位机发送写命令字头设备地址标志数据地址数据字节数数据…异或CR 下位机应答:若正常:字头设备地址## 异或CR若不正常:字头设备地址** 异或CR例1:写15号仪表,数据地址为15。
写数据255,数据类型为字,不打包。
组态王所发数据为:40 30 46 43 35 30 30 30 46 30 32 30 30 46 46 37 34 0d字头设备地址15标志写操作字型不打包数据地址15 数据字节数2数据255 异或若正确:40 30 46 23 23 37 36 0d字头设备地址15## 异或若不正确:40 30 46 2a 2a 37 36 0d字头设备地址15** 异或例2:写15号仪表,数据地址为15。
写数据65535,数据类型为浮点型,打包。
组态王所发数据为:40 30 46 43 46 30 30 30 46 30 34 31 30 46 46 46 46 30 30字头设备地址15标志写操作浮点型打包数据地址15 数据字节数4数据6553530 30 0d 异或若正确:40 30 46 23 23 37 36 0d## 异或字头设备地址15若不正确:40 30 46 2a 2a 37 36 0d 字头设备地址** 异或153、注:仪表内部数据为十六进制表示的十进制数。
如:实时测量值为500,则用十六进制表示为1F4H。
仪表通讯传输是将上述十六进制数据转化为标准ASCII 码(即一字节的16进制数转化为2个ASCII码──高4位ASCII码+低4位ASCII 码)。
如:上述数据1F4H(16进制),传输时,转化为ASCII码则为30H、31H、46H、34H。
此浮点数格式的转换:1)ASCII码到浮点数:float C4toD(char * c){BYTE Hd[30], Jiema[30];float DTc[30];float Decimal = 0;memset(Hd, 0, sizeof(Hd));memset(Jiema, 0, sizeof(Jiema));memset(DTc, 0, sizeof(DTc));float returnflo = 0;BOOL ShuFU = FALSE, JieFU = FALSE;if((c[7] > 0x40) && (c[7] < 0x47))Hd[7] = ((c[7] - 0x37) & 0x0f);else if((c[7] > 0x60) && (c[7] < 0x67))Hd[7] = ((c[7] - 0x57) & 0x0f);elseHd[7] = ((c[7] - 0x30) & 0x0f);if((c[6] > 0x40) && (c[6] < 0x47))Hd[6] = ((c[6] - 0x37) & 0x0f);else if((c[6] > 0x60) && (c[6] < 0x67))Hd[6] = ((c[6] - 0x57) & 0x0f);elseHd[6] = ((c[6] - 0x30) & 0x0f);DTc[2] = (float)(((float)(Hd[6] * 16.0) + (float)(Hd[7])) / 256.0);if((c[5] > 0x40) && (c[5] < 0x47))Hd[5] = ((c[5] - 0x37) & 0x0f);else if((c[5] > 0x60) && (c[5] < 0x67))Hd[5] = ((c[5] - 0x57) & 0x0f);elseHd[5] = ((c[5] - 0x30) & 0x0f);if((c[4] > 0x40) && (c[4] < 0x47))Hd[4] = ((c[4] - 0x37) & 0x0f);else if((c[4] > 0x60) && (c[4] < 0x67))Hd[4] = ((c[4] - 0x57) & 0x0f);elseHd[4] = ((c[4] - 0x30) & 0x0f);DTc[1] = (float)((((float)(Hd[4] * 16.0) + (float)Hd[5]) + DTc[2]) / 256.0);if((c[3] > 0x40) && (c[3] < 0x47))Hd[3] = ((c[3] - 0x37) & 0x0f);else if((c[3] > 0x60) && (c[3] < 0x67))Hd[3] = ((c[3] - 0x57) & 0x0f);elseHd[3] = ((c[3] - 0x30) & 0x0f);if((c[2] > 0x40) && (c[2] < 0x47))Hd[2] = ((c[2] - 0x37) & 0x0f);else if((c[2] > 0x60) && (c[2] < 0x67))Hd[2] = ((c[2] - 0x57) & 0x0f);elseHd[2] = ((c[2] - 0x30) & 0x0f);Decimal = (float)(((float)(Hd[2] * 16) + (float)(Hd[3]) + DTc[1])/ 256.0);if((c[1] > 0x40) && (c[1] < 0x47))Jiema[1] = ((c[1] - 0x37) & 0x0f);else if((c[1] > 0x60) && (c[1] < 0x67))Jiema[1] = ((c[1] - 0x57) & 0x0f);elseJiema[1] = ((c[1] - 0x30) & 0x0f);if((c[0] > 0x40) && (c[0] < 0x47))Jiema[0] = ((c[0] - 0x37) & 0x0f);else if((c[0] > 0x60) && (c[0] < 0x67))Jiema[0] = ((c[0] - 0x57) & 0x0f);elseJiema[0] = ((c[0] - 0x30) & 0x0f);ShuFU = ((Jiema[0] & 0x08) >> 3) > 0;JieFU = ((Jiema[0] & 0x04) >> 2) > 0;Jiema[2] = (Jiema[0] & 0x03) * 16 + Jiema[1];if(JieFU)returnflo = (float)pow(2, (-1) * Jiema[2]) * Decimal;elsereturnflo = (float)pow(2, Jiema[2]) * Decimal;if(ShuFU)returnflo = (-1) * returnflo;return returnflo;}2)浮点数到ASCII码:void D4toC(char * c,float d){BYTE i = 0, Jiema = 0;char inbyte1[30];BOOL ShuFu = FALSE, JieFu = FALSE;int inbyte2 = 0, inbyte3 = 0, inbyte4 = 0;char afterbyte2[30], afterbyte3[30], afterbyte4[30];float F_afterbyte2 = 0, F_afterbyte3 = 0, F_afterbyte4 = 0;memset(inbyte1, 0x30, sizeof(inbyte1));memset(afterbyte2, 0x30, sizeof(afterbyte2));memset(afterbyte3, 0x30, sizeof(afterbyte3));memset(afterbyte4, 0x30, sizeof(afterbyte4));inbyte1[10] = 0x0;afterbyte2[10] = 0x0;afterbyte3[10] = 0x0;afterbyte4[10] = 0x0;if(d == 0){for(int j = 0; j < 8; j++)c[j] = 0x30;return;}if(d < 0){ShuFu = TRUE;d = (-1) * d;}while(d > 1){d =(float)(d / 2.0);i ++;}while(d <= 0.5){JieFu = TRUE;d = (float)(d * 2.0);i ++;}if(d == 1){for(int j = 2; j < 8; j++)c[j] = 0x46;}else{inbyte2 = (int)(d * 256);F_afterbyte2 = (d * 256) - (int)(d * 256);inbyte3 = (int)(F_afterbyte2 * 256);F_afterbyte3 = (F_afterbyte2 * 256) - (int)(F_afterbyte2 * 256);inbyte4 = (int)(F_afterbyte3 * 256);F_afterbyte4 = (F_afterbyte3 * 256) - (int)(F_afterbyte3 * 256);itoa(inbyte2, afterbyte2, 16);itoa(inbyte3, afterbyte3, 16);itoa(inbyte4, afterbyte4, 16);if(inbyte2 == 0){c[2] = 0x30;c[3] = 0x30;}else if(inbyte2 < 16){c[2] = 0x30;c[3] = afterbyte2[0];}else{c[2] = afterbyte2[0];c[3] = afterbyte2[1];}if(inbyte3 == 0){c[4] = 0x30;c[5] = 0x30;}else if(inbyte3 < 16){c[4] = 0x30;c[5] = afterbyte3[0];}else{c[4] = afterbyte3[0];c[5] = afterbyte3[1];}if(inbyte4 == 0){c[6] = 0x30;c[7] = 0x30;}else if(inbyte4 < 16){c[6] = 0x30;c[7] = afterbyte4[0];}else{c[6] = afterbyte4[0];c[7] = afterbyte4[1];}}if(JieFu){if(i > 0x3f)i = 0x3f;}else if(i > 0x32)i = 32;if(ShuFu)i = i | 0x80;if(JieFu)i = i | 0x40;itoa(i, inbyte1, 16);if(inbyte1 == 0){c[0] = 0x30;c[1] = 0x30;}else if(i < 16){c[0] = 0x30;c[1] = inbyte1[0];}else{c[0] = inbyte1[0];c[1] = inbyte1[1];}for(i = 0; i < 8; i ++){if((c[i] > 0x60) && (c[i] < 0x67))c[i] = c[i] - 0x20;}c[8] = 0x00;}。