最新日志

发表于:2008-5-16 11:50:37
标签:无标签

0

Motorola S-records 16进制文件的常见格式

Motorola S-records 16进制文件的另一种常见格式,Fujitsu平台的Softune编译出来就是这种格式
这篇文章介绍了一下各个数据记录的意义。

The following fairly complete description of Motorola S-records was found a number of years ago on the man pages of a UNIX system.
--------------------------------------------------------------------------------
NAME
srec - S-record file and record format
DESCRIPTION

An S-record file consists of a sequence of specially formatted ASCII character strings. An S-record will be less than or equal to 78 bytes in length.
The order of S-records within a file is of no significance and no particular order may be assumed.

The general format of an S-record follows:

+-------------------//------------------//-----------------------+
| type | count | address | data | checksum |
+-------------------//------------------//-----------------------+

type -- A char[2] field. These characters describe the type of record (S0, S1, S2, S3, S5, S7, S8, or S9).
count -- A char[2] field. These characters when paired and interpreted as a hexadecimal value, display the count of remaining character pairs in the record.

address -- A char[4,6, or 8] field. These characters grouped and interpreted as a hexadecimal value, display the address at which the data field is to be loaded into memory. The length of the field depends on the number of bytes necessary to hold the address. A 2-byte address uses 4 characters, a 3-byte address uses 6 characters, and a 4-byte address uses 8 characters.

data -- A char [0-64] field. These characters when paired and interpreted as hexadecimal values represent the memory loadable data or descriptive information.

checksum -- A char[2] field. These characters when paired and interpreted as a hexadecimal value display the least significant byte of the ones complement of the sum of the byte values represented by the pairs of characters making up the count, the address, and the data fields.

Each record is terminated with a line feed. If any additional or different record terminator(s) or delay characters are needed during transmission to the target system it is the responsibility of the transmitting program to provide them.

S0 Record. The type of record is 'S0' (0x5330). The address field is unused and will be filled with zeros (0x0000). The header information within the data field is divided into the following subfields.


mname is char[20] and is the module name.
ver is char[2] and is the version number.
rev is char[2] and is the revision number.
description is char[0-36] and is a text comment.

Each of the subfields is composed of ASCII bytes whose associated characters, when paired, represent one byte hexadecimal values in the case of the version and revision numbers, or represent the hexadecimal values of the ASCII characters comprising the module name and description.
S1 Record. The type of record field is 'S1' (0x5331). The address field is intrepreted as a 2-byte address. The data field is composed of memory loadable data.

S2 Record. The type of record field is 'S2' (0x5332). The address field is intrepreted as a 3-byte address. The data field is composed of memory loadable data.

S3 Record. The type of record field is 'S3' (0x5333). The address field is intrepreted as a 4-byte address. The data field is composed of memory loadable data.

S5 Record. The type of record field is 'S5' (0x5335). The address field is intrepreted as a 2-byte value and contains the count of S1, S2, and S3 records previously transmitted. There is no data field.

S7 Record. The type of record field is 'S7' (0x5337). The address field contains the starting execution address and is intrepreted as 4-byte address. There is no data field.

S8 Record. The type of record field is 'S8' (0x5338). The address field contains the starting execution address and is intrepreted as 3-byte address. There is no data field.

S9 Record. The type of record field is 'S9' (0x5339). The address field contains the starting execution address and is intrepreted as 2-byte address. There is no data field.

EXAMPLE

Shown below is a typical S-record format file.

S00600004844521B
S1130000285F245F2212226A000424290008237C2A
S11300100002000800082629001853812341001813
S113002041E900084E42234300182342000824A952
S107003000144ED492
S5030004F8
S9030000FC
The file consists of one S0 record, four S1 records, one S5 record and an S9 record.

The S0 record is comprised as follows:

S0 S-record type S0, indicating it is a header record.
06 Hexadecimal 06 (decimal 6), indicating that six character pairs (or ASCII bytes) follow.
00 00 Four character 2-byte address field, zeroes in this example.

48 44 52 ASCII H, D, and R - "HDR".
1B The checksum.
The first S1 record is comprised as follows:
S1 S-record type S1, indicating it is a data record to be loaded at a 2-byte address.
13 Hexadecimal 13 (decimal 19), indicating that nineteen character pairs, representing a 2 byte address, 16 bytes of binary data, and a 1 byte checksum, follow.
00 00 Four character 2-byte address field; hexidecimal address 0x0000, where the data which follows is to be loaded.
28 5F 24 5F 22 12 22 6A 00 04 24 29 00 08 23 7C Sixteen character pairs representing the actual binary data.
2A The checksum.
The second and third S1 records each contain 0x13 (19) character pairs and are ended with checksums of 13 and 52, respectively. The fourth S1 record contains 07 character pairs and has a checksum of 92.

The S5 record is comprised as follows:

S5 S-record type S5, indicating it is a count record indicating the number of S1 records
03 Hexadecimal 03 (decimal 3), indicating that three character pairs follow.
00 04 Hexadecimal 0004 (decimal 4), indicating that there are four data records previous to this record.
F8 The checksum.
The S9 record is comprised as follows:

S9 S-record type S9, indicating it is a termination record.
03 Hexadecimal 03 (decimal 3), indicating that three character pairs follow.
00 00 The address field, hexadecimal 0 (decimal 0) indicating the starting execution address.
FC The checksum.


--------------------------------------------------------------------------------

Instructor Notes
There isn't any evidence that Motorola ever has made use of the header information within the data field of the S0 record, as described above. This must have been used by some third party vendors.
This is the only place that a 78-byte limit on total record length or 64-byte limit on data length is documented. These values shouldn't be trusted for the general case.
The count field can have values in the range of 0x3 (2 bytes of address + 1 byte checksum = 3, a not very useful record) to 0xff; this is the count of remaining character pairs, including checksum.
If you write code to convert S-Records, you should always assume that a record can be as long as 514 (decimal) characters in length (255 * 2 = 510, plus 4 characters for the type and count fields), plus any terminating character(s). That is, in establishing an input buffer in C, you would declare it to be an array of 515 chars, thus leaving room for the terminating null character.

点击此处查看原文 >>

系统分类: 嵌入式   |    用户分类:    |    来源: 转贴

评论(0) | 阅读(16)
发表于:2008-4-19 0:14:58
标签:无标签

0

AT指令

根据V.25TER的AT指令概要(Overview of AT Commands According to V.25TER)
A/  重新发送最后给的AT指令(Reissues the last command given)
ATA 接听外来电话  (ANSWER INCOMING CALL)
ATD 向外拨打电话   (MOBILE ORIGINATED CALL TO DIALABLE NUMBER)
ATDL 重拨上次拨打的电话号码 (REDIAL LAST TELEPHONE NUMBER USED)
ATE 设置回声模式 (SET COMMAND ECHO MODE)
ATH 断开现有连接/挂断电话(DISCONNECT EXISTING CONNECTION)
ATI 显示产品的标志信息(DISPLAY PRODUCT IDENTIFICATION INFORMATION)
ATL 设置监听话筒大声(SET MONITOR SPEAKER LOUDNESS)
ATM 设置监听话筒模式(SET MONITOR SPEAKER MODE)
+++ 从数据模式或PPP上网模式回到命令模式(SWITCH FROM DATA MODE OR PPP ONLINE MODE TO COMMAND MODE)
ATO 从命令模式回到数据模式(SWITCH FROM COMMAND MODE TO DATA MODE)
ATP 选择脉冲拨号(SELECT PULSE DIALLING)
ATQ 设定结果代码颁布方式 (SET RESULT CODE PRESENTATION MODE)
ATS0 设置在接电话前的响铃次数(SET NUMBER OF RINGS BEFORE AUTOMATICALLY ANSWERING THE CALL)
ATS3 设置命令行终止字符(SET COMMAND LINE TERMINATION CHARACTER)
ATS4 设置响应初始化字符(SET RESPONSE FORMATTING CHARACTER)
ATS5 设置命令行编辑特性(SET COMMAND LINE EDITING CHARACTER)
ATS6 设置停止在盲目拨号之前(SET PAUSE BEFORE BLIND DIALLING)
ATS7 设置等待连接完成的秒数(SET NUMBER OF SECONDS TO WAIT FOR CONNECTION COMPLETION)
ATS8 设置当遇到逗号,拨出被修改者使用等待的秒数(SET NUMBER OF SECONDS TO WAIT WHEN COMMA DIAL MODIFIER USED)
ATS10 设置在表明没有数据传送后断开延迟(SET DISCONNECT DELAY AFTER INDICATING THE ABSENCE OF DATA CARRIER)
ATT 选择音频(SELECT TONE DIALLING)
ATV 设置结果代码格式方式(SET RESULT CODE FORMAT MODE)
ATX 设置连接结果码格式和呼叫监视(SET CONNECT RESULT CODE FORMAT AND CALL MONITORING)
ATZ 设定用户定义当前所有参数(SET ALL CURRENT PARAMETERS TO USER DEFINED PROFILE)
AT&C 设置DCD功能模式(SET DCD FUNCTION MODE)
AT&D 设置DTR功能模式(SET DTR FUNCTION MODE)
AT&F 设置缺省制造商当前所有参数(SET ALL CURRENT PARAMETERS TO MANUFACTURER DEFAULTS)
AT&V 显示当前配置(DISPLAY CURRENT CONFIGURATION)
AT&W 存储用户定义的当前参数(STORE CURRENT PARAMETER TO USER DEFINED PROFILE)
AT+DR V.42bis数据压缩控制报告(V.42BIS DATA COMPRESSION REPORTING CONTROL)
AT+DS V.42bis 数据压缩控制(V.42BIS DATA COMPRESSION REPORTING CONTROL)
AT+GCAP 请求完成电讯能力清单(REQUEST COMPLETE TA CAPABILITIES LIST)
AT+GMI 要求制造商鉴定(REQUEST MANUFACTURER IDENTIFICATION)
AT+GMM 请求电讯模型鉴定(REQUEST TA MODEL IDENTIFICATION)
AT+GMR 请求电讯修改鉴定(REQUEST TA REVISION IDENTIFICATION)
AT+GOI 请求全球性对象鉴定(REQUEST GLOBAL OBJECT IDENTIFICATION)
AT+GSN 请求电讯序号标志(IMEI)(REQUEST TA SERIAL NUMBER IDENTIFICATION (IMEI))
AT+ICF 设置特讯控制性构筑(SET TE-TA CONTROL CHARACTER FRAMING)
AT+IFC 设置特讯本地流量控制(SET TE-TA LOCAL DATA FLOW CONTROL)
AT+ILRR 设置特讯本地速率报告模式(SET TE-TA LOCAL RATE REPORTING MODE)
AT+IPR 设定当地固定速率(SET FIXED LOCAL RATE)

在TCPIP 应用上的AT指令(AT Commands for TCPIP Application Toolkit)
AT+CIPSTART 启动TCP或UDP的连接(START UP TCP OR UDP CONNECTION)
AT+CIPSEND 发送数据通过TCP或UDP的连接(SEND DATA THROUGH TCP OR UDP CONNECTION)
AT+CIPCLOSE 关闭连接(CLOSE CONNECTION)
AT+CIPSHUT 撤销GPRS PDP 环境(DEACTIVATE GPRS PDP CONTEXT)
AT+CLPORT 设置本地端口(SET LOCAL PORT)
AT+CSTT 设置APN, 用户名, 密码(SET APN, USER NAME, PASSWORD)
AT+CIICR 提出与GPRS 或CSD 的无线连接(BRING UP WIRELESS CONNECTION WITH GPRS OR CSD)
AT+CIFSR 获得本地IP地址(GET LOCAL IP ADDRESS)
AT+CIPSTATUS 查询当前的连接状态(QUERY CURRENT CONNECTION STATUS)
AT+CDNSCFG 配置域名服务器(CONFIGURE DOMAIN NAME SERVER)
AT+CDNSGIP 查询所给出域名的IP地址(QUERY IP ADDRESS OF GIVEN DOMAIN NAME)
AT+CDNSORIP 连接用IP 地址或域名服务器(CONNECT WITH IP ADDRESS OR DOMAIN NAME SERVER)
AT+CIPHEAD 接收数据时加上一个IP头(ADD AN IP HEADER WHEN RECEIVING DATA)
AT+CIPATS 设置自动送出时间(SET AUTO SENDING TIMER)
AT+CIPSPRT 当送数据时设置‘〉’提示(SET PROMPT OF ‘>’ WHEN SENDING DATA)
AT+CIPSERVER 配置作为服务器(CONFIGURE AS SERVER)
AT+CIPCSGP 设置CSD 或GPRS 为连接方式(SET CSD OR GPRS FOR CONNECTION MODE)
AT+CIPCCON 选择连接(CHOOSE CONNECTION)
AT+CIPFLP 固定本地端口(FIX LOCAL PORT)
AT+CIPSRIP 设置从何处接收的数据(SHOW WHERE RECEIVED DATA FROM)
AT+CIPDPDP 设置是否检查GPRS网络时间状态(SET WHETHER CHECK STATE OF GPRS NETWORK TIMING)
AT+CIPSCONT 保存TCPIP应用背景(SAVE TCPIP APPLICATION CONTEXT)
AT+CIPMODE 选择TCPIP 应用方式(SELECT TCPIP APPLICATION MODE)
AT+CIPCCFG 配置透明传输模式(CONFIGURE TRANSPARENT TRANSFER MODE)

根据GSM07.07的AT指令(AT Commands According to GSM07.07)
AT+CACM 累计电话计量器(ACM) 重新设置或询问(ACCUMULATED CALL METER(ACM) RESET OR QUERY)
AT+CAMM 累计电话计量器最大值的设置或查询(ACCUMULATED CALL METER MAXIMUM(ACMMAX) SET OR QUERY)
AT+CAOC 咨询收费 (ADVICE OF CHARGE)
AT+CBST 选择持有人服务类型(SELECT BEARER SERVICE TYPE)
AT+CCFC 呼叫转移号码和条件控制(CALL FORWARDING NUMBER AND CONDITIONS CONTROL)
AT+CCUG 关闭用户群控制(CLOSED USER GROUP CONTROL)
AT+CCWA 呼叫等待控制(CALL WAITING CONTROL)
AT+CEER 延期的错误报告(EXTENDED ERROR REPORT)
AT+CGMI 要求制造商识别(REQUEST MANUFACTURER IDENTIFICATION)
AT+CGMM 要求样式识别(REQUEST MODEL IDENTIFICATION)
AT+CGMR 要求修正识别(REQUEST REVISION IDENTIFICATION)
AT+CGSN 要求产品序号识别(同等+GSN )(REQUEST PRODUCT SERIAL NUMBER IDENTIFICATION(IDENTICAL WITH +GSN))
AT+CSCS 选择TE 字符集(SELECT TE CHARACTER SET)
AT+CSTA 选择地址类型(SELECT TYPE OF ADDRESS)
AT+CHLD 电话挂起并多线(电话会议)(CALL HOLD AND MULTIPARTY)
AT+CIMI 请求国际移动用户身份(REQUEST INTERNATIONAL MOBILE SUBSCRIBER IDENTITY)
AT+CKPD 键盘控制(KEYPAD CONTROL)
AT+CLCC 我的当前通话名单(LIST CURRENT CALLS OF ME)
AT+CLCK 设备锁(FACILITY LOCK)
AT+CLIP 呼叫线路识别介绍(CALLING LINE IDENTIFICATION PRESENTATION)
AT+CMEE 报告移动设备错误(REPORT MOBILE EQUIPMENT ERROR)
AT+COLP 连接的线路识别介绍(CONNECTED LINE IDENTIFICATION PRESENTATION)
AT+COPS 操作员选择(OPERATOR SELECTION)
AT+CPAS 移动设备的活动状态(MOBIL EQUIPMENT ACTIVITY STATUS)
AT+CPBF 找到电话簿条目(FIND PHONEBOOK ENTRIES)
AT+CPBR 读当前的电话本条目(READ CURRENT PHONEBOOK ENTRIES)
AT+CPBS 选择电话本记忆存贮区(SELECT PHONEBOOK MEMORY STORAGE)
AT+CPBW 写电话本条目(WRITE PHONEBOOK ENTRY)
AT+CPIN 输入PIN(ENTER PIN)
AT+CPWD 改变密码(CHANGE PASSWORD)
AT+CR 服务报告控制(SERVICE REPORTING CONTROL)
AT+CRC 设置手机结果码为来电标志(SET CELLULAR RESULT CODES FOR INCOMING CALL INDICATION)
AT+CREG 网络注册(NETWORK REGISTRATION)
AT+CRLP 选择无线电链路协议PARAM.ETER(SELECT RADIO LINK PROTOCOL PARAM.ETER)
AT+CRSM 有限的SIM 通入(RESTRICTED SIM ACCESS)
AT+CSQ 信号质量报告(SIGNAL QUALITY REPORT)
AT+FCLASS 电传: 精选, 读或测试服务组(FAX: SELECT, READ OR TEST SERVICE CLASS)
AT+FMI 电传: 报告制作的身份证明(FAX: REPORT MANUFACTURED ID)
AT+FMM 电传: 报告模式身份证明(FAX: REPORT MODEL ID)
AT+FMR 电传: 报告修正身份证明(FAX: REPORT REVISION ID)
AT+VTD 长短音(TONE DURATION)
AT+VTS DTMF以及拨号音的产生(DTMF AND TONE GENERATION)
AT+CMUX 多重通道控制(MULTIPLEXER CONTROL)
AT+CNUM 用户号码(SUBSCRIBER NUMBER)
AT+CPOL 首选的操作员名单(PREFERRED OPERATOR LIST)
AT+COPN 读操作员名字(READ OPERATOR NAMES)
AT+CFUN 设置电话功能(SET PHONE FUNCTIONALITY)
AT+CCLK 时钟(CLOCK)
AT+CSIM 普通SIM 通入(GENERIC SIM ACCESS)
AT+CALM 警报声模式(ALERT SOUND MODE)
AT+CRSL ***等级(RINGER SOUND LEVEL)
AT+CLVL 喇叭音量(LOUDSPEAKER VOLUME)
AT+CMUT 静音控制(MUTE CONTROL)
AT+CPUC 价格每单位货币表(PRICE PER UNIT CURRENCY TABLE)
AT+CCWE 电话计量器最大值(CALL METER MAXIMUM EVENT)
AT+CBC 电池充电(BATTERY CHARGE)
AT+CUSD 非结构化补充业务数据(UNSTRUCTURED SUPPLEMENTARY SERVICE DATA)
AT+CSSN 辅助服务的通知(SUPPLEMENTARY SERVICES NOTIFICATION)

根据GSM07.05的AT指令(AT Commands According to GSM07.05)
AT+CMGD 删除SMS 短信(DELETE SMS MESSAGE)
AT+CMGF 选择SMS 短信格式(SELECT SMS MESSAGE FORMAT)
AT+CMGL 从首选存储器的SMS短信清单(LIST SMS MESSAGES FROM PREFERRED STORE)
AT+CMGR 读SMS短信(READ SMS MESSAGE)
AT+CMGS 发送SMS短信(SEND SMS MESSAGE)
AT+CMGW 往内存写SMS短信(WRITE SMS MESSAGE TO MEMORY)
AT+CMSS 从存储器发送SMS短信(SEND SMS MESSAGE FROM STORAGE)
AT+CMGC 发送SMS短信指令(SEND SMS COMMAND)
AT+CNMI 新的SMS短信标志(NEW SMS MESSAGE INDICATIONS)
AT+CPMS 首选SMS短信存储区(PREFERRED SMS MESSAGE STORAGE)
AT+CRES 恢复SMS 设置(RESTORE SMS SETTINGS)
AT+CSAS 保存SMS短信设置(SAVE SMS SETTINGS)
AT+CSCA SMS 服务中心地址(SMS SERVICE CENTER ADDRESS)
AT+CSCB 选择小区广播短讯(SELECT CELL BROADCAST SMS MESSAGES)
AT+CSDH 显示SMS 文本方式参量(SHOW SMS TEXT MODE PARAMETERS)
AT+CSMP 设置SMS 文本方式参量(SET SMS TEXT MODE PARAMETERS)
AT+CSMS 选择信息服务(SELECT MESSAGE SERVICE)

GPRS 支持的AT指令(AT Commands for GPRS Support)
AT+CGATT 从GPRS服务附加/分离(ATTACH/DETACH FROM GPRS SERVICE)
AT+CGDCONT 定义PDP环境(DEFINE PDP CONTEXT)
AT+CGQMIN 服务质量概况(最低可接受)(QUALITY OF SERVICE PROFILE (MINIMUM ACCEPTABLE))
AT+CGQREQ 服务质量概况(被请求的)(QUALITY OF SERVICE PROFILE (REQUESTED))
AT+CGACT 环境激活(CONTEXT ACTIVATION)
AT+CGDATA 进入数据状态(ENTER DATA STATE)
AT+CGPADDR 显示PDP地址(SHOW PDP ADDRESS)
AT+CGCLASS GPRS移动站种类(GPRS MOBILE STATION CLASS)
AT+CGEREP 控制未经请求GPRS 事件报告(CONTROL UNSOLICITED GPRS EVENT REPORTING)
AT+CGREG 网络注册状态(NETWORK REGISTRATION STATUS)
AT+CGSMS 为MO SMS 消息选择服务(SELECT SERVICE FOR MO SMS MESSAGES)
AT+CGCOUNT GPRS打包计数(GPRS PACKET COUNTERS)

SIM应用集的AT指令(AT Commands for SIM Application Toolkit)
不大会翻译。。。
+STC: ()
+STGC=… ()
+STCR=… ()
+STPD=… ()
+STMS=… ()
+STEV=… ()
+STRT=… ()
+STTONE=… ()

专有的simcom AT指令(AT Commands Special for SIMCOM)
AT+ECHO 回音消除技术控制(ECHO CANCELLATION CONTROL)
AT+ SIDET 改变侧音增益等级(CHANGE THE SIDE TONE GAIN LEVEL)
AT+CPOWD 断电(POWER OFF)
AT+SPIC 时间保持以输入SIM PIN/PUK(TIMES REMAIN TO INPUT SIM PIN/PUK)
AT+CMIC 改变手机增益等级(CHANGE THE MICOPHONE GAIN LEVEL)
AT +UART 配置双串口模式 (CONFIGURE DUAL SERIAL PORT MODE)
AT+CALARM 设置警报(SET ALARM)
AT+CADC 读ADC(READ ADC)
AT +CSNS 唯一编号模式(SINGLE NUMBERING SCHEME)
AT +CDSCB 重新设置小区广播(RESET CELLBROADCAST)
AT +CMOD 配置交替式来电(CONFIGURE ALTERNATION MODE CALLS)
AT +CFGRI 当使用URC时表明RI(INDICATE RI WHEN USING URC)
AT+CLTS 获取本地时间标志(GET LOCAL TIMESTAMP)
AT+CEXTHS 外部耳机插孔控制(EXTERNAL HEADSET JACK CONTROL)
AT+CEXTBUT 耳机按钮状态报告(HEADSET BUTTON STATUS REPORTING)
AT+CSMINS SIM卡插入状况报告(SIM INSERTED STATUS REPORTING)
AT+CLDTMF 本地的DTMF音生成(LOCAL DTMF TONE GENERATION)
AT+CDRIND 政务语音/数据/传真来电或GPRS的PDP方面终止标志(CS VOICE/DATA/FAX CALL OR GPRS PDP CONTEXT TERMINATION INDICATION)
AT+CSPN 从SIM获得服务提供商名称(GET SERVICE PROVIDER NAME FORM SIM)
AT+CCVM 获得并设置SIM的语音信箱号码(GET AND SET THE VOICE MAIL NUMBER ON THE SIM)
AT+CBAND 取得或设置移动波段操作(GET AND SET MOBILE OPERATION BAND)
AT+CHF 配置免提操作(CONFIGURES HANDS FREE OPERATION)
AT+CHFA 交换音频频道(SWAP THE AUDIO CHANNELS)
AT+CSCLK 配置慢时钟(CONFIGURE SLOW CLOCK)
AT+CENG 开启或关闭工程模式(SWITCH ON OR OFF ENGINEERING MODE)
AT+SCLASS0 当收到0级短讯存储0级手机短信到SIM(STORE CLASS 0 SMS TO SIM WHEN RECEIVED CLASS 0 SMS)
AT+CCID 显示ICCID(SHOW ICCID)


AT+CALARM   设置警报
AT+CADC    读ADC
AT+CSNS    单号码方案
AT+CDSCB   重启小区广播
AT+CMOD   配置交替模式呼叫
AT+CFGRI   用URC时通知RI
AT+CLTS   获得当地时间
AT+CEXTHS  额外的手机插座控制
AT+CEXTBUT  手机按键状态报告
AT+CSMINS  SIM插入状态报告
AT+CLDTMF  当地DTMF(双音多频)声音发生器
AT+CDRIND  连接状态通知
AT+CSPN   从SIM中得到服务运营商的名字
AT+CCVM   在SIM上得到和设置声音数字
AT+CBAND   得到和设置移动运营商联合
AT+CHF    配置手动自由业务
AT+CHFA   转换声音通道
AT+CSCLK   配置慢时钟
AT+CENG   ON和OFF模式之间转换
AT+SCLASS0  当收到CLASS 0 SMS时存储到SIM卡内
AT+CCID   显示卡ID号
AT+HGPRS   挂断GPRS
AT+UART   配置双串口模式

经常用到的一些AT指令
simcom的(BENQ就不写了):
1、AT+IPR?(查询模块的波特率)
模块会返回+IPR: 9600之格式的信息,9600即波特率,注意9600与冒号之间是有空格的;

2、AT+IPR=9600;&W(设置模块的固定波特率)
此命令写一次之后就可以了,simcom支持掉电保护,之后此模块波特率就一直为9600了,成功返回OK,错误返回ERROR,说明命令格式错误;

3、AT+CIPCCFG=3,2,1024,1(设定模块缓冲区为1024字节)
此命令成功返回OK,错误返回ERROR,说明命令格式错误,=号后面数据根据个人需求填写;

4、AT+CIPCCFG?(查询模块缓冲区的大小)
模块会返回+CIPCCFG:3,2,1024,1这种格式的信息。1024即为缓冲区大小;

5、AT+CFUN=1,1(全功能命令,立即执行)
此命令可以开启simcom模块的大部分功能,一般在初始化模块的时候都要写上;

6、AT+CLIP=1(显示来电号码)
显示来电号码,如果没有这条指令,则来电话模块只送出ring,不送出号码;

7、ATH(挂断电话)
这个就不用多说了,送出就挂断电话,在Benq里还可以做完全断开gprs网络用;

8、ATA(接听电话)
接听电话,也不用多说了,来电话发这个给模块就可以接听了;

9、AT+VTS="dt"(dtmf音)
开启dtmf音,dtmf音就是你拨打10086时提示你按几键发给10086的,开始我也不知道。。。听同事说才明白,benq开启dtmf音是AT+WDTMF=1,0,7,7,麻烦;

10、AT+VTD=70(dtmf音持续长短)
持续项为0~255;

11、AT+CLVL=(通话音量大小)
范围是0~100,数值越小,则音量越轻;

12、AT+SIDET=(侧音灵敏度大小)
范围是1~32767,越大越灵敏,日常通话建议设为0,设大了容易产生啸叫,在设置监听功能时可以把此值设大一些;

13、AT+CMIC=0,15(改变麦克风的增益)
逗号前有0,1两项,1为免提通话状态,逗号后即音量大小了,当然是对方听到你的。此功能是切换免提用的;

14、AT+CHFA=(0/1此命令用来切换两个音频通道)
simcom提供两个音频通道,用此命令来切换;

15、AT+CMGS=(发送短信的长度)
当然你也可以不用发=号,则可以写任意长度短信(模块支持长度范围内);

16、AT+CMGL=0(读取新sms)
返回+CMGL: 21(如果有短消息的话)之格式的信息,后面回车换行跟着就是短信内容了;

17、AT+CMGD=(删除第几条短信)
后面是几就删除第几条短信咯;

18、AT+CNMI=2,1(新sms来时送出脉冲)
此命令最好在初始模块时就加上,如果没有此命令,嘿嘿,有短信你也不知道了,正确放回OK,错误返回ERROR,格式错误;

19、AT+CSCA?(读取sms服务中心号码)
返回+CSCA: "+8613800532500",145之格式的信息,我是青岛的,所以返回是这个号码;

20、AT+CIPSHUT(关闭移动场景返回到IP INITIAL)
在连线不成功时这条命令挺管用的,可以断开连接然后可以再次执行连线,建议跟AT+CIPCLOSE一起用(个人建议),如果这条命令都不行的话就只有给模块重启了,移动场景是什么到现在我也不明白,谁明白可以告诉我啊;

21、AT+CIPSEND=(通过gprs网络发送数据指令)
等号后面跟发送数据长度,返回〉号后可以填写数据,达到规定数据量自动发送,也支持无规定数据量的发送,发送成功返回SEND OK,不成功返回SEND FAIL,也可能不返回东东;

22、AT+CIPSTART="TCP","192.43.10.157","4005"(gprs拨号连线)
正确返回OK,错误ERROR,格式错误,连上线返回CONNECT OK,连线失败返回CONNECT FAIL;格式能看懂吧应该;

23、AT+CIPSTATUS(查询模块gprs状态)
模块返回STATE: CONNECT OK(在线),STATE: IP IND(连线失败,接受场景配置),STATE: IP CLOSED(对方掉线或断开连接了),STATE: PDP DEACT(连接断开,你应该检查一下你的天线了),STATE: TCP CONNECTING(正在连接,这种情况下一般都连接失败,所以就直接AT+CIPCLOSE,AT+CIPSHUT一起用,然后重连得了,当然我的做法,不一定好),我碰到的只有这几种状态,其他状态没遇到过;

24、AT+CCLK="07/03/28,06:46:30+00"(给模块设定时间日期)
格式应该看的懂,正确放回OK,错误返回ERROR,格式错误;

25、AT+CCLK?(读取日期时间)
返回+CCLK: "03/01/01,16:07:46+00"之格式的信息;

26、AT+CSQ(读取信号强度)
返回+CSQ: 20,0之格式的信息,20为有用的值对我来说,信号强度;

27、AT+CBC(读取电池电量)
返回+CBC: 1,96,4149之格式的信息,0 模块由电池供电,1 模块装有电池,但不由电池供电,2 模块没有电池,3 模块电源无效, 禁止呼叫,1-100表示电量百分比,后面那个数不清楚作用,不过模块读取的电量信息不是很准,我明明装的电池有时还返回2;

 

 

AT+CFUN具体开启什么功能我也不清楚,问售后也没说出个所以然来,只知道要想正常使用simcom模块就得把其大部分功能都打开,也就是表示simcom正常开机了。

关于AT+COPS这个跟网络堆栈没什么联系吧~!?以下是技术手册上说的,之前用BENQ用过这个命令,只是读取sim卡是哪个运营商的指令
AT+COPS 运营商选择
选择运营商有3种可能:
1、移动台进入manual手动模式想查找提供给用户的运营商如果查找正确并注册成功,移动台处于idle状态.
2、移动台进入automatic自动模式,想查找本地运营商.如果查找正确并注册成功移动台处于idle状态;如果不成功,移动台自动搜索其他的网络.
3、移动台进入manual/automatic手动/自动模式,想查找提供给用户的运营商(类似处于manual模式),如果不成功进入automatic模式.
读取命令返回当前模式和选择的运营商。
要想选择并注册网络运营商,发送如下的命令行:
AT+COPS=<mode>, [<format> [ , <oper> ] ]
对AT+COPS=<mode> 命令的可能的响应
OK ( 选择全部的网络业务)
+CME ERROR: 30 ( 没有网络业务)
+CME ERROR: 32 ( 网络不允许? 只允许紧急电话)
+CME ERROR: 3 ( 电话期间不允许此操作)
+CME ERROR: 4 ( 错误参数)
对AT+COPS? 命令的响应语法
+COPS: <mode> [, <format>, <oper> ]
对AT+COPS=? 命令的响应语法
+COPS: [ 列举所支持的<stat>, <oper> 字母数字型数字型 ]
命令行参数值如下定义
<mode>:
0: 自动(缺省值)
1: 手动
3: 用于设置<format> 域 对于读取命令AT+COPS?
4: 手动/ 自动要有<oper> 域,如果手动选择失败,进入自动模式
<format>:<oper> 域的格式
0 长字母数字格式(最多16 个字符)
1 短字母数字格式(最多8 个字符)
2 数字格式(缺省值)
<stat> <oper> 的状态
0: 未知
1: 可用
2: 当前正在使用
3: 禁止
<oper> 运营商标识

格式:AT+COPS?
返回:+COPS:0
OK //说明未找到网络
返回:+COPS:0,0,”UNICOM”
OK //说明是联通MOBILE是移动

转载地址:

http://www.mcublog.com/blog/blog2007/xinxinsky/archives/2007/25543.html

点击此处查看原文 >>

系统分类: 接口电路   |    用户分类:    |    来源: 转贴

评论(0) | 阅读(171)
发表于:2008-4-11 9:18:55
标签:无标签

0

主框架与对话框之间消息传递

总结:
消息传递的方法一:使用ON_MESSAGE
使用ON_MESSAGE响应消息,必须配合定义消息#define WM_MY_MESSAGE (WM_USER+100)

对于发送消息者-MyMessageDlg,
在其MyMessageDlg.h中,定义#define WM_MY_MESSAGE (WM_USER+100)
在其MyMessageDlg.cpp中要先添加:#include "MainFrm.h"
因为使用了CMainFrame*定义对象。
并且要有测试消息的函数:
void MyMessageDlg::OnButtonMsg()
{
    // TODO: Add your control notification handler code here
    CMainFrame* pMF=(CMainFrame*)AfxGetApp()->m_pMainWnd;  //先通过获取当前框架指针
    CView * active = pMF->GetActiveView();//才能获取当前视类指针
    if(active != NULL)  //获取了当前视类指针才能发送消息
    active->PostMessage(WM_MY_MESSAGE,0,0);   //使用PostMessage发送消息
}

对于消息的接受者-MessageTestView,
在其MessageTestView.h中,也要定义#define WM_MY_MESSAGE (WM_USER+100)
并定义消息映射函数-OnMyMessage()
protected:
 //{{AFX_MSG(CMessageTestView)
 afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);
 //}}AFX_MSG
 DECLARE_MESSAGE_MAP()
在其MessageTestView.cpp中,
先要声明响应消息:
BEGIN_MESSAGE_MAP(CMessageTestView, CEditView)
 //{{AFX_MSG_MAP(CMessageTestView)
 ON_MESSAGE(WM_MY_MESSAGE, OnMyMessage)
 //}}AFX_MSG_MAP
再添加消息响应的函数实现:
LRESULT CMessageTestView::OnMyMessage(WPARAM wParam, LPARAM lParam)
{
 MessageBox("OnMyMessage!");
 return 0;
}


消息传递的方法二:使用ON_REGISTERED_MESSAGE
使用ON_REGISTERED_MESSAGE注册消息,必须配合
static UINT WM_MY_MESSAGE=RegisterWindowMessage("Message");

对于消息的发送者-MyMessageDlg,
在其MyMessageDlg.h中,只要
定义static UINT WM_MY_MESSAGE=RegisterWindowMessage("Message");
就可以了。
在其MyMessageDlg.cpp中要先添加:#include "MainFrm.h"
因为使用了CMainFrame*定义对象。
并且要有测试消息的函数:
void MyMessageDlg::OnButtonMsg()
{
    // TODO: Add your control notification handler code here
    CMainFrame* pMF=(CMainFrame*)AfxGetApp()->m_pMainWnd;  //先通过获取当前框架指针
    CView * active = pMF->GetActiveView();//才能获取当前视类指针
    if(active != NULL)  //获取了当前视类指针才能发送消息
    active->PostMessage(WM_MY_MESSAGE,0,0);   //使用PostMessage发送消息
}

对于消息的接收者-MessageTestView,
在其MessageTestView.h中不要定义
static UINT WM_MY_MESSAGE=RegisterWindowMessage("Message");
应该把这个定义放到MessageTestView.cpp中,要不会出现: redefinition
在其MessageTestView.h中只要定义消息映射函数
protected:
 //{{AFX_MSG(CMessageTestView)
 afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);
 //}}AFX_MSG
 DECLARE_MESSAGE_MAP()
在其MessageTestView.cpp中,先定义
static UINT WM_MY_MESSAGE=RegisterWindowMessage("Message");
接着注册消息:
BEGIN_MESSAGE_MAP(CMessageTestView, CEditView)
 //{{AFX_MSG_MAP(CMessageTestView)
        ON_REGISTERED_MESSAGE(WM_MY_MESSAGE,OnMyMessage)
 //}}AFX_MSG_MAP
最后添加消息响应的函数实现:
LRESULT CMessageTestView::OnMyMessage(WPARAM wParam, LPARAM lParam)
{
 MessageBox("OnMyMessage!");
 return 0;
}
----------------------------------------------------------------
比较两种方法,只是略有不同。但也要小心谨慎,以免出现接收不到消息的情况。

-------------------------------------------------------------------

其他注意事项:

发送消息的-MyMessageDlg.cpp前也要定义
static UINT WM_MY_MESSAGE=RegisterWindowMessage("Message");

接受消息的-MessageTestView.cpp前也要定义
static UINT WM_MY_MESSAGE=RegisterWindowMessage("Message");

RegisterWindowMessage("Message")中""的内容是什么不重要,写什么都可以,单必须
发送者与接受者是一样的内容,例如:"Message"


 

 

从主框架向对话框如何发送消息 

CString   str;  
  str="myDlg";//对话框标题  
  CWnd   *pWnd=CWnd::FindWindow(NULL,str);  
  if(pWnd)   {  
        pWnd->SendMessage(IDR_MYMESSAGE,0,0);   }就可以了。  

点击此处查看原文 >>

系统分类: 软件开发   |    用户分类: 无分类    |    来源: 整理

评论(0) | 阅读(104)
发表于:2008-3-16 0:03:13
标签:无标签

0

表计数据交换的互操作性

 
 
DLMS/COSEM(IEC62056,EN13757-1)标准自2002年公布以来,全球日益高涨的兴趣也验证了这个标准达到了人们的期望效果。市场自由化和全球性的竞争促使环境更加复杂,也使得人们对于表计数据采集有了新的需要。这一领域的发展提供的核心技术之一赋予了能源市场运作的新方法。

专注于客户满意度和致力于资源优化的能源供应商,需要一种计费系统,要求其无论在地理位置分散的偏远地区还是面对日益增多的商业合作伙伴,系统都能支持各种类型的能源、提供更多数据、数据采集更频繁。精确的数据、及时、安全、以及尽可能低的成本都是必需的。
已经在用的技术,比如低成本的A/D转换器,微处理器、DSP,高性能存储器以及最新的通讯手段正在推动一场早在30年前就在保守工业领域开始的革命,即控制了一个多世纪的机电一体化表计和手动抄表系统。从大用户的应用扩展到民用,智能化的通讯表计要求更精确和更多的数据,生成的大量数据的采集必须基于高效的解决方案,因此系统集成的成本和维护成为很重要的一个方面。
第一套数据采集系统的解决方案不可避免的基于对所有者权益的考虑上。在稳定环境工作下的公用事业部门,也做好准备与一个或多个卖家合作,并投入一定的资源进行系统运作。
标准化的需要
标准化的需要很早就得到认可,1992年发布了IEC61107,其定义了如何登录表计和找回数据。但是关于如何去找、如何识别、怎么格式化以及是什么意思,却没有任何说明。对于每一种表计和数据采集系统,设备驱动程序随着不同制造商各自的定义不得不另行开发。在全球不断扩张、合并、收购的今天,形成了不同制造商的设备组成的表计挂网,这必然要求数据采集系统不断完善。维护难度也随之加大。
领先的制造商和公用事业用户划归在DLMS用户协会中。他们在专用于电力系统控制的最新标准(由IEC TC57发展而来)的基本原则和基础上做了一个新尝试。远程控制领域是其中一个最早认识到智能化电子设备的系统集成需要由接口对象进行程序建模,并将模式从通讯协议中分离出来。随着进程模式的相对稳定,通讯技术的发展也日新月异。模式从协议中的剥离将两个领域的问题划分出来,允许他们以各自的速度发展,增强了灵活性。
DLMS/COSEM考虑到了将互操作性带入到表计数据交换中,而且开发出一个适用于各种能源类型、能够定义识别功能、进行格式化并对所有数据予以说明的接口对象模式实现了这个性能。这个模式和协议无关,适用于任何介质。
开发的协议基于国际标准,适用于不同的通讯方式。标准扩充法规、自描述特性、商议能力特性和上下文提供了未来可验证的规范指标,并能对一个通用数据采集系统进行开发,将表计连接到系统上,看清其数据结构并获取数据。此外,DLMS/COSEM还具有先进的安全特征,可以有选择的获取数据,这在以前是不能实现的。一个一致性验证方案可用来完成校验。
对象模式、协议和数据交换
在蓝本中有所描述的COSEM(Companion Specification for Energy Metering)对象模式定义了靠近计量域的接口类别,如寄存器、曲线、时钟和日程。一个接口类别的定义描述了可用数据类型的属性以及允许对这些属性进行修改的方法。对象有可能互相影响,以便实现诸如费率制定、帐单结算时间以及处理特殊事件的功能。同时,时钟设置、电源掉电也都有所定义。
表计的功能性通过建立必需数量的适当对象方可建模,通过OBIS(Object Identification System)标准中定义的逻辑名属性得以识别和引用。功能性可以通过一个物理设备自由组建到几个逻辑设备上,或跨过几个物理设备进行扩展。COSEM没有标准化也没有限制表计的功能性。模式支持宽范围的功能,并可不断增加新功能。举例来说,2004年,在对象范围内建模的先进电能质量和损耗补偿特性也得以定义。
DLMS协议传输那些由对象属性和方法表达的数据。获取这些数据是COSEM应用层的任务,它在协议栈的顶层。数据交换基于用户服务模式,即:数据采集系统提出服务要求,表计提供相应服务。此外,表计可以启动事件报告。
DLMS服务对所有的接口类别通用,在不影响协议的情况下允许定义新的接口。一个特殊的群对象控制认证并提供表计功能性一览、对象、对象属性以及开放给用户的方法。一些群可以定义,根据访问权限进行访问。所有数据采用ASN.1清楚的组织起来,采用A-XDR进行有效编码。通过建立数据文件夹并通过一叫一答方式转移数据来减少上一层的协议。
协议底层可以依据不同通讯介质进行选择。对于PSTN和GSM网络,有一个3层的OSI协议栈。基于数据链路层的HDLC确保了数据传输的完整性,并能分段传输长信息,如:数据读出和负荷曲线。物理层支持光电口、串行口,PSTN或GSM Modem.
2004年,增加了新的通讯方式,即允许通过Internet进行数据交换,对DLMS/COSEM开放了一定范围内的Internet应用功能,如文件传输和邮件服务。TCP/UDP支持COSEM应用层。IP层下的任何数据链路层和物理层都可用。
互操作性被定义为具有兼容能力的任何表计和任何数据采集系统进行数据交换的能力。DLMS/COSEM配有一致性验证方案。虽然还不能保证互操作性,但已经成为验证其是否正确执行的一个重要工具。迄今为止,已有13种表计类型得以验证。
对于现有的大量表计和系统,位置移动是个很大的问题。针对这一点,大多数表计在提供DLMS/COSEM的同时还继续提供IEC 62056-21的C模式。虽然相比较完整的DLMS/COSEM,其功能性可能会减弱,但协议转换器依然可用。
通过使用DLMS/COSEM这个开放的全球化标准,买卖双方都受益匪浅。买方享受到了低成本的系统集成和维护费用,可以不断完善表计功能性,加强获取数据的控制能力和安全性。卖方能够更好在应用层面和性价比上进行竞争,而不是纠于技术细节。DLMS用户协会给大家提供了一个分享经验、丰富自我的有效平台。 
 

点击此处查看原文 >>

系统分类: 工业控制   |    用户分类:    |    来源: 转贴

评论(0) | 阅读(173)
发表于:2008-1-28 14:52:16
标签:无标签

0

IEC62056国际标准

  IEC62056(电能计量-用于抄表,费率和负荷控制的数据数交换)

标准体系结构简介.

rar

点击此处查看原文 >>

系统分类: 资源共享   |    用户分类:    |    来源: 转贴

评论(1) | 阅读(470)
发表于:2008-1-12 17:38:03
标签:无标签

0

Proteus 与KeilC通信

如何在keil中调用proteus进行MCU外围器件的仿真!
         proteus 6.9以前的版本
  1、安装keil c51 与 proteus
  2、把proteus安装目录下MODELS文件夹里 VDM51.dll文件复制到Keil安装目录的 \C51\BIN
   目录中。
  3、修改keil安装目录下 Tools.ini文件,在C51字段加入TDRV5=BIN\VDM51.DLL
   ("Proteus VSM Monitor-51 Driver"),保存
   注意:不一定要用TDRV5,根据原来字段选用一个不重复的数值就可以了。引号内的
   名字随意~
  4、打开proteus,画出相应电路(这个自己摸索吧。注意:proteus中mouse的左右键与
   一般程序是相反的样子)。在proteus的tools菜单中选中use remote debug monitor
  5、在keil中编写MCU的程序(keil不会,那先学学吧,比medwin难学些哦!)。
  6、进入KEIL的project菜单option for target '工程名'。在DEBUG选项中右栏上部的下
   拉菜选中 Proteus VSM Monitor-51 Driver
   在进入seting,如果同一台机IP 名为127.0.0.1,如不是同一台机则填另一
   台的IP地址。端口号一定为8000
   注意:可以在一台机器上运行keil,另一台中运行proteus进行远程仿真哦~
  7、在keil中进行debug吧,同时在proteus中查看直观的结果(如LCD显示…) 
 
        proteus 6.9以后的版本
 

proteus 7.12与 keil 8.0的联调方法
    对于proteus 6.9以后的版本,在安装盘里或LABCENTER公司有vdmagdi插件,安装该插件即可实现与KEIL的联调。
    首先安装vdmagdi软件,然后再进行以下设置:

Keil设置
    在Keil软件上单击“Project菜单/Options for Target”选项或者点击工具栏的“option for ta rget”按钮 ,弹出窗口,点击“Debug”按钮,出现如图所示页面。
点击看大图 
在出现的对话框里在右栏上部的下拉菜单里选中“Proteus VSM Monitor-51 Driver”。并且还要点击一下“Use”前面表明选中的小圆点。再点击“Setting”按钮,设置通信接口,在“Host”后面添上“127.0.0.1”,如果使用的不是同一台电脑,则需要在这里添上另一台电脑的IP地址(另一台电脑也应安装Proteus)。在“Port”后面添加“8000”。设置好的情形如图所示,点击“OK”按钮即可。最后将工程编译,进入调试状态,并运行。  

Proteus的设置
进入Proteus的ISIS,鼠标左键点击菜单“Debug”,选中“use romote debuger monitor”,如图所示。此后,便可实现KeilC与Proteus连接调试。
 

 

 

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 转贴

评论(0) | 阅读(269)
发表于:2008-1-12 17:36:24
标签:无标签

0

Proteus 自建元件库

  

 

一、Proteus VSM仿真模型简介在使用Proteus仿真单片机系统的过程中,经常找不到所需的元件,这就需要自己编写。Proteus VSM的一个主要特色是使用基于DLL组件模型的可扩展性。这些模型分为两类:电气模型(Electrical Model)和绘图模型(Graphical Model)。电气模型实现元件的电气特性,按规定的时序接收数据和输出数据;绘图模型实现仿真时与用户的交互,例如LCD的显示。一个元件可以只实现电气模型,也可以都实现电气和绘图模型。
    Proteus为VSM模型提供了一些C++抽象类接口,用户创建元件时需要在DLL中实现相应的抽象类。VSM模型和Proteus系统通信的原理如下图: 
点击看大图0 && image.height>0){if(image.width>=510){this.width=510;this.height=image.height*510/image.width;}}" border="0"> 

绘图模型接口抽象类:

ICOMPONENT――ISIS内部一个活动组件对象,为VSM模型提供在原理图上绘图和用户交互的服务。
IACTIVEMODEL――用户实现的VSM绘图模型要继承此类,并实现相应的绘图和键盘鼠标事件处理。

电气模型接口抽象类:

IINSTANCE――一个PROSPICE仿真原始模型,为VSM模型提供访问属性、模拟节点和数据引脚的服务,还允许模型通过仿真日志发出警告和错误信息。
ISPICECKT(模拟)――SPICE拥有的模拟元件,提供的服务:访问、创建和删除节点,在稀疏矩阵上分配空间,同时还允许模型在给定时刻强制仿真时刻点的发生和挂起仿真。
ISPICEMODEL(模拟)――用户实现的VSM模拟元件要继承此类,并实现相应的载入数据,在完成的时间点处理数据等。
IDSIMCKT(数字)――DSIM拥有的数字元件,提供的服务:访问数字系统的变量,创建回调函数和挂起仿真。
IDSIMMODEL(数字)――用户实现的VSM数字元件要继承此类,并实现相应的引脚状态变化的判断和回调事件的处理。
IDSIMPIN(数字)――数字组件的引脚,提供检测引脚状态和创建输出事务事件的服务。
IDBUSPIN(数字)――数字组件的数据或地址总线,提供检测总线状态和创建总线输出事务事件的服务。
IMIXEDMODEL(混合)――同时继承了ISPICEMODEL 和 IDSIMMODEL,元件既有模拟特性,又有数字特性。

       为了让Proteus访问用户模型中的成员函数,必须创建用户模型的一个实例。这不能通过类的接口来实现,只能通过从DLL中导出几个C函数来实现,在用户模型中必须实现这些C函数,达到构造和析构用户模型实例的效果。

(1)构造和析构绘图模型实例:
IACTIVEMODEL *createactivemodel (CHAR *device, ILICENCESERVER *ils)
VOID deleteactivemodel (IACTIVEMODEL *model)

(2)构造和析构模拟电气模型实例:
ISPICEMODEL *createspicemodel (CHAR *device, ILICENCESERVER *ils)
VOID deletespicemodel (ISPICEMODEL *model)

(3)构造和析构数字电气模型实例:
IDSIMMODEL *createdsimmodel (CHAR *device, ILICENCESERVER *ils)
VOID deletedsimmodel (IDSIMMODEL *model)

(4)构造和析构混合电气模型实例:
IMIXEDMODEL *createmixedmodel (CHAR *device, ILICENCESERVER *ils)
VOID deletemixedmodel (IDSIMMODEL *model)

二、Proteus VSM仿真模型开发流程
1.绘制元件图形、引脚和相关符号。
2.制作元件,设置元件属性。
3.用C++编写元件,实现电气和绘图模型,编译生成DLL。
4.搭建电路仿真测试。

三、VSM模型开发实例
下面以TG19264A点阵式液晶显示元件的开发为实例详细讲解开发过程。

1.打开Proteus,选择菜单 查看>>Snap 10 th,选择左边绘图工具栏的2D graphics box,绘制如图所示的三个图形。


点击看大图0 && image.height>0){if(image.width>=510){this.width=510;this.height=image.height*510/image.width;}}" border="0"> 

2.选择2D graphics line,给出两条直线,设置width为36th,颜色为灰色。选择2D graphics circle,给四个角绘制安装孔。选择Markers for component origin,给三个图形分别绘图符号原点(图中红色部分)。


点击看大图0 && image.height>0){if(image.width>=510){this.width=510;this.height=image.height*510/image.width;}}" border="0"> 

3.选择Device pin,顺时针旋转90度,放置20个引脚,如图所示。GND、VCC、V0、Vee、LED+的电气类型选择PP-Power Pin,D/I、R/W、E、CS1、RET、CS2、CS3的电气类型选择IP-Input,D0~D7的电气类型选择IO- Bidirectional。


点击看大图0 && image.height>0){if(image.width>=510){this.width=510;this.height=image.height*510/image.width;}}" border="0"> 

 

4.右键拖出选择框选择第一个符号,选择菜单库>>制作符号,命名为LCD19264A_C,确定。同理,第二和第三个分别命名为LCD19264A_1 和LCD19264A_0。当用户调用drawsymbol (-1),将绘制LCD19264A_C,调用drawsymbol (1),将绘制LCD19264A_1,调用drawsymbol (0),将绘制LCD19264A_0。


点击看大图0 && image.height>0){if(image.width>=510){this.width=510;this.height=image.height*510/image.width;}}" border="0"> 

 

5.右键拖出选择框选择符号LCD19264A_C,选择菜单库>>制作元件,Device Properties设置如图,
点击看大图0 && image.height>0){if(image.width>=510){this.width=510;this.height=image.height*510/image.width;}}" border="0"> 
点击Next>。跳过封装设置,点击Next>。组件属性设置如图,
点击看大图0 && image.height>0){if(image.width>=510){this.width=510;this.height=image.height*510/image.width;}}" border="0"> 
点击看大图0 && image.height>0){if(image.width>=510){this.width=510;this.height=image.height*510/image.width;}}" border="0"> 
点击Next>。选择数据手册(可选),点击Next>。选择器件库,点击OK。

6.打开VC,新建工程,选择Win32 Dynamic-Link Library,给工程命名,建立空的DLL工程。从Proteus安装目录的INCLUDE文件夹中将VSM.HPP复制到当前工程目录,新建文件 LCD19264A.H和LCD19264A.CPP,编写如下代码。


CODE:

/*****************************************************************
* 文件:LCD19264A.H
* 说明:不支持以下特性
* (1) 不支持显示开关控制
* (2) 不支持设置显示起始行
*****************************************************************/
#i nclude "vsm.hpp"

//LCD常量
#define LCD_BLK_NUM  3  //lcd block number
#define LCD_BLK_LEN  64  //lcd block length
#define LCD_LINE_NUM 8  //lcd line number
#define LCD_LENGTH  (LCD_BLK_LEN*LCD_BLK_NUM)  //lcd length
#define LCD_WIDTH  64  //lcd width
#define BLANK_WIDTH  50  //the width of blank
#define SYM_LINEWIDTH 28  //the width of symbol line
//LCD命令掩码
#define CMD_MASK  0xc0
//LCD命令
#define DISP_ONOFF  0x00 //开关背光
#define SET_STARTLINE 0xc0 //设置起始行
#define SET_XADDRESS 0x80 //设置X地址
#define SET_YADDRESS 0x40 //设置Y地址
//延时常量
#define DELAY_1s  1000000000000
#define DELAY_1ms 1000000000
#define DELAY_1us 1000000
#define DELAY_1ns 1000
#define DELAY_1ps 1

/*
LCD元件既有数字电气特性,也有绘图特性,所以要继承IACTIVEMODEL和IDSIMMODEL
*/
class LCD19264A : public IACTIVEMODEL,public IDSIMMODEL
{
public:
/* 电气模型成员函数 */
//数字电路总是返回TRUE
INT isdigital (CHAR *pinname);
//当创建模型实例时被调用,做初始化工作
VOID setup (IINSTANCE *inst, IDSIMCKT *dsim);
//仿真运行模式控制,交互仿真中每帧开始时被调用
VOID runctrl (RUNMODES mode);

//交互仿真时用户改变按键等的状态时被调用
VOID actuate (REALTIME time, ACTIVESTATE newstate);
//交互仿真时每帧结束时被调用,通过传递ACTIVEDATA数据与绘图模型通信,从而调用animate()进行绘图
BOOL indicate (REALTIME time, ACTIVEDATA *data);
//当引脚状态变化时被调用,主要用来处理数据输入和输出
VOID simulate (ABSTIME time, DSIMMODES mode);
//可通过setcallback()设置在给定时间调用的回调函数
VOID callback (ABSTIME time, EVENTID eventid);

/* 绘图模型成员函数 */
//当创建模型实例时被调用,做初始化工作
VOID initialize (ICOMPONENT *cpt);
//被PROSPICE调用,返回模拟电气模型
ISPICEMODEL *getspicemodel (CHAR *device);
//被PROSPICE调用,返回数字电气模型
IDSIMMODEL *getdsimmodel (CHAR *device);
//当原理图需要重绘时被调用
VOID plot (ACTIVESTATE state);
//当相应的电气模型产生活动事件时被调用,常用来更新图形
VOID animate (INT element, ACTIVEDATA *newstate);
//用来处理键盘和鼠标事件
BOOL actuate (WORD key, INT x, INT y, DWORD flags);
private:
IINSTANCE *instance; //PROSPICE仿真原始模型
IDSIMCKT *ckt;   //DSIM的数字元件
ICOMPONENT *component; //ISIS内部一个活动组件对象
//引脚定义
IDSIMPIN *di; //D/I
IDSIMPIN *rw; //R/W
IDSIMPIN *en; //E
IDSIMPIN *cs1; //CS1
IDSIMPIN *cs2; //CS2
IDSIMPIN *cs3; //CS3
IDSIMPIN *d[8]; //D0~D7
IBUSPIN *databus; //D[0..7]
//LCD参数
BYTE x_addr; //X地址(见手册)
BYTE y_addr; //Y地址(见手册)
BYTE status; //状态(见手册)
BYTE cur_blk; //当前块号(总共分3块,见手册)
BYTE DDRAM[LCD_BLK_NUM][LCD_BLK_LEN*LCD_WIDTH/8]; //LCD显示RAM
BOOL new_flag; //新数据到达标志
//显示参数
BOX lcdarea; //LCD显示区域
float pix_width, pix_height; //每象素对应矩形的宽和高
};


CODE:
/*****************************************************************
* 文件:LCD19264A.CPP
* 说明:不支持以下特性
* (1) 不支持显示开关控制
* (2) 不支持设置显示起始行
*****************************************************************/
#i nclude
#i nclude "LCD19264A.h"
//----------------------------------------------------------------------------
//电气模型的实现
//构造数字电气模型实例
extern "C" IDSIMMODEL __declspec(dllexport) * createdsimmodel (CHAR *device, ILICENCESERVER *ils)
{
//授权认证
ils->authorize(0x88888888, 0x69); //版本为6.9
return new LCD19264A; //创建模型实例
}

//析构数字电气模型实例
extern "C" VOID __declspec(dllexport) deletedsimmodel (IDSIMMODEL *model)
{
delete (LCD19264A *)model; //删除模型实例
}

//数字电路总是返回TRUE
INT LCD19264A::isdigital (CHAR *pinname)
{
return 1;
}

//当创建模型实例时被调用,做初始化工作
VOID LCD19264A::setup (IINSTANCE *inst, IDSIMCKT *dsim)
{
instance = inst; //PROSPICE仿真原始模型
ckt = dsim;  //DSIM的数字元件
//获取引脚
di = instance->getdsimpin("D/I,d/i", true);
di->setstate(FLT); //FLOAT
rw = instance->getdsimpin("R/W,r/w", true);
rw->setstate(FLT);
en = instance->getdsimpin("E,e", true);
en->setstate(FLT);
cs1 = instance->getdsimpin("CS1,cs1", true);
cs1->setstate(FLT);
cs2 = instance->getdsimpin("CS2,cs2", true);
cs2->setstate(FLT);
cs3 = instance->getdsimpin("CS3,cs3", true);
cs3->setstate(FLT);
d[0] = instance->getdsimpin("D0,d0", true);
d[0]->setstate(FLT);
d[1] = instance->getdsimpin("D1,d1", true);
d[1]->setstate(FLT);
d[2] = instance->getdsimpin("D2,d2", true);
d[2]->setstate(FLT);
d[3] = instance->getdsimpin("D3,d3", true);
d[3]->setstate(FLT);
d[4] = instance->getdsimpin("D4,d4", true);
d[4]->setstate(FLT);
d[5] = instance->getdsimpin("D5,d5", true);
d[5]->setstate(FLT);
d[6] = instance->getdsimpin("D6,d6", true);
d[6]->setstate(FLT);
d[7] = instance->getdsimpin("D7,d7", true);
d[7]->setstate(FLT);
//为方便操作,将D0~D7映射为8位总线
databus = instance->getbuspin("LCD_DBUS", d, 8);
databus->settiming(100,100,100); //设置时间延迟
databus->setstates(SHI,SLO,FLT); //设置总线逻辑为[1,0,三态]时的驱动状态

//lcd model
x_addr = 0; //X地址(见手册)
y_addr = 0; //Y地址(见手册)
status = 0; //状态(见手册)
new_flag = TRUE; //新数据到达标志
}

//仿真运行模式控制,交互仿真中每帧开始时被调用
VOID LCD19264A::runctrl (RUNMODES mode)
{
}

//交互仿真时用户改变按键等的状态时被调用
VOID LCD19264A::actuate (REALTIME time, ACTIVESTATE newstate)
{

}

//交互仿真时每帧结束时被调用,通过传递ACTIVEDATA数据与绘图模型通信,从而调用animate()进行绘图
BOOL LCD19264A::indicate (REALTIME time, ACTIVEDATA *data)
{
if(new_flag){ //有新数据到达
  data->type = ADT_REAL; //call back animate() to refresh lcd
  data->realval = (float)time*DSIMTICK;
}
return TRUE;
}

//当引脚状态变化时被调用,主要用来处理数据输入和输出
VOID LCD19264A::simulate (ABSTIME time, DSIMMODES mode)
{
BYTE data;
if(en->isnegedge()){  //E的下降沿到达
  if((rw->istate()==SLO)||(rw->istate()==WLO)){ //R/W为低表示写
   //读块选择
   if((cs1->istate()==SLO)||(cs1->istate()==WLO))
    cur_blk = 0;
   else if((cs2->istate()==SLO)||(cs2->istate()==WLO))
    cur_blk = 1;
   else if((cs3->istate()==SLO)||(cs3->istate()==WLO))
    cur_blk = 2;
   else
    return; //not select block
  
   data = (BYTE)databus->getbusvalue(); //读数据
   if((di->istate()==SHI)||(di->istate()==WHI)){ //D/I为高表示数据
    DDRAM[cur_blk][x_addr*LCD_BLK_LEN+y_addr] = data; //写入数据
    new_flag = TRUE; //新数据到达标志
    y_addr = ((y_addr+1)%LCD_BLK_LEN);  //y地址自动加1
    if(y_addr==0)
     x_addr = ((x_addr+1)%LCD_LINE_NUM); //自动换行
   }else{  //D/I为低表示命令
    switch(data&CMD_MASK)
    {
    case DISP_ONOFF: //开关背光
     break;
    case SET_STARTLINE: //设置起始行
     break;
    case SET_XADDRESS: //设置X地址
     x_addr = (data&0x07); //bit2~bit0
     break;
    case SET_YADDRESS: //设置Y地址
     y_addr = (data&0x3f); //bit5~bit0
     break;
    default:
     break;
    }
   }
  }else{  //E的下降沿到达,R/W为高表示读结束
   databus->drivetristate(time); //驱动总线为三态
  }
}else if(en->isposedge()  //E的上升沿到达
   && ((rw->istate()==SHI)||(rw->istate()==WHI))){ //R/W为高表示读
  if((di->istate()==SHI)||(di->istate()==WHI)){ //D/I为高表示数据
   //读块选择
   if((cs1->istate()==SLO)||(cs1->istate()==WLO))
    cur_blk = 0;
   else if((cs2->istate()==SLO)||(cs2->istate()==WLO))
    cur_blk = 1;
   else if((cs3->istate()==SLO)||(cs3->istate()==WLO))
    cur_blk = 2;
   else
    return; //not select block
   data = DDRAM[cur_blk][x_addr*LCD_BLK_LEN+y_addr];
   databus->drivebusvalue(time, data);  //输出数据
   y_addr = ((y_addr+1)%LCD_BLK_LEN);  //y地址自动加1
   if(y_addr==0)
    x_addr = ((x_addr+1)%LCD_LINE_NUM); //自动换行
  }else{  //D/I为低表示命令
   databus->drivebusvalue(time, status); //输出状态
  }
}
}

//可通过setcallback()设置在给定时间调用的回调函数
VOID LCD19264A::callback (ABSTIME time, EVENTID eventid)
{
}

//----------------------------------------------------------------------------
//绘图模型的实现
// Exported constructor for active component models.
extern "C" IACTIVEMODEL __declspec(dllexport) * createactivemodel (CHAR *device, ILICENCESERVER *ils)
{
ils->authorize (0x88888888,0x69); //6.9
return new LCD19264A;
}

// Exported destructor for active component models.
extern "C" VOID  __declspec(dllexport) deleteactivemodel (IACTIVEMODEL *model)
{
delete (LCD19264A *)model;
}

//当创建模型实例时被调用,做初始化工作
VOID LCD19264A::initialize (ICOMPONENT *cpt)
{
//获取ICOMPONENT接口和初始化
component = cpt;
component->setpenwidth(0);
component->setpencolour(BLACK);
component->setbrushcolour(BLACK);
//获取显示区域
component->getsymbolarea(0,&lcdarea);
//计算每象素对应矩形的宽和高
pix_width = (float)(lcdarea.x2-lcdarea.x1-BLANK_WIDTH*2-SYM_LINEWIDTH*2)/LCD_LENGTH;
pix_height = (float)(lcdarea.y2-lcdarea.y1-BLANK_WIDTH*2-SYM_LINEWIDTH*2)/LCD_WIDTH;
}

//被PROSPICE调用,返回模拟电气模型
ISPICEMODEL *LCD19264A::getspicemodel (CHAR *)
{
return NULL;
}

//被PROSPICE调用,返回数字电气模型
IDSIMMODEL  *LCD19264A::getdsimmodel (CHAR *)
{
return this;
}

//当原理图需要重绘时被调用
VOID LCD19264A::plot (ACTIVESTATE state)
{
//绘制LCD19264A_C元件基本图形
component->drawsymbol(-1);
//刷新LCD数据显示
new_flag = TRUE;
animate (0, NULL);
}

//当相应的电气模型产生活动事件时被调用,常用来更新图形
VOID LCD19264A::animate (INT element, ACTIVEDATA *data)
{
BOX pix;
BYTE dat,block,line,byte_off,bit_off;
if(new_flag){ //当有新数据到达
  new_flag = FALSE;
  component->begincache (lcdarea); //打开缓冲
  component->drawsymbol(1);  //显示LCD19264_1符号
  //显示各点数据
  for(block=0; block   for(line=0; line    for(byte_off=0; byte_off     dat = DDRAM[block][line*LCD_BLK_LEN+byte_off]; //get byte data
     for(bit_off=0; bit_off<8; bit_off++){
      if(dat&(1<       pix.x1 = (int)(BLANK_WIDTH+(block*LCD_BLK_LEN+byte_off)*pix_width+0.5);
       pix.y1 = -(int)(BLANK_WIDTH+(line*8+bit_off)*pix_height+0.5);
       pix.x2 = pix.x1 + (int)(pix_width+0.5);
       pix.y2 = pix.y1 - (int)(pix_height+0.5);
       component->drawbox(pix); //绘制1个象素点
      }
     }
    }
   }
  }
  component->endcache(); //结束缓冲,显示数据
}
}

//用来处理键盘和鼠标事件
BOOL LCD19264A::actuate (WORD key, INT x, INT y, DWORD flags) 
{
return FALSE;
}

7.搭建电路如下电路,新建Keil C工程,编写代码测试元件。如下图:
点击看大图0 && image.height>0){if(image.width>=510){this.width=510;this.height=image.height*510/image.width;}}" border="0">

protues7.2 提供下载地址.

http://file.mofile.com/cn/docs/listallfiles.do

点击此处查看原文 >>

系统分类: 软件开发   |    用户分类:    |    来源: 转贴

评论(0) | 阅读(361)
发表于:2008-1-11 18:06:37
标签:无标签

0

功率因数通过P,Q计算

 有些型号的电能计量IC,没有功率因数寄存器可读,而读视在功率寄存器又不是很准.那么通过cosa = p/s ;也会达不到要求.

那么可以这样计算:  F= tg(arccos( P/Q));

             for(i = 0;i < 1000;i++)

 {

          if( tab[i]  = = x)

     cosa = i/1000;

 }

如果要为了提高速度可以二分法查表,或分段查表.

下面自动生成表软件.rar

点击此处查看原文 >>

系统分类: 嵌入式   |    用户分类:    |    来源: 无分类

评论(0) | 阅读(327)
发表于:2008-1-9 0:20:11
标签:无标签

0

LPC ARM7 主频计算软件

rar ARM7 主频计算软件

点击此处查看原文 >>

系统分类: ARM   |    用户分类:    |    来源: 原创

评论(0) | 阅读(387)
发表于:2008-1-8 9:15:48
标签:无标签

0

ADE7169(IAR 环境)变量定位

 

把一个变量放在一个绝对地址,可以用@和#pragma 定义,@用法与KeilC类似.
 Example
__no_init char alpha @ 0x81; 

__no_init __bit bool beta @ 0x62;

#pragma location="0x98"
__code const int gamma; 

__xdata_rom const int delta @ 0xA0 = 3; 

 

 

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 原创

评论(0) | 阅读(398)
总共 , 当前 /,234下一页