P&R Series API GUI CN

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 178

应用开发指南

[适用 P78、P80、P90、R50、P58、R30、R50-M、R100]
版本号:V1.2.5

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd.
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

目 录

1、 概述.................................................................................................................................................... 8

1.1 内容概述 ........................................................................................................................................ 8


1.1.1 手册合并及注意事项............................................................................................................ 8
1.1.2 产品适用模块一览表............................................................................................................ 8
1.2 修改历史 ........................................................................................................................................ 9

2、 开发平台.......................................................................................................................................... 12

2.1 系统需求 ...................................................................................................................................... 12


2.2 软件工具 ...................................................................................................................................... 12
2.2.1 编译工具 ............................................................................................................................. 12

3、 API 详细说明................................................................................................................................... 13

3.1 系统基本函数 .............................................................................................................................. 13


3.1.1 SystemInit ......................................................................................................................... 13
3.1.2 Beep ..................................................................................................................................... 14
3.1.3 Beef ..................................................................................................................................... 14
3.1.4 SetTime ............................................................................................................................... 14
3.1.5 GetTime ............................................................................................................................... 15
3.1.6 DelayMs ............................................................................................................................... 15
3.1.7 TimerSet ............................................................................................................................. 16
3.1.8 TimerCheck ......................................................................................................................... 16
3.1.9 ReadSN ................................................................................................................................. 16
3.1.10 EXReadSN ........................................................................................................................... 17
3.1.11 ReadVerInfo ..................................................................................................................... 17
3.1.12 GetLastError ................................................................................................................... 17
3.1.13 GetTermInfo ..................................................................................................................... 17
3.1.14 EnumFont ........................................................................................................................... 20
3.1.15 ScrSelectFont.................................................................................................................. 20
3.1.16 PrnSelectFont.................................................................................................................. 20
3.1.17 LedDisplay ....................................................................................................................... 21
3.2 电源管理函数 .............................................................................................................................. 21
3.2.1 PowerSave ........................................................................................................................... 21
3.2.2 AutoPowerSave ................................................................................................................... 23
3.2.3 BatteryCheck ..................................................................................................................... 23
3.2.4 PowerOff .............................................................................................................................. 24
3.3 键盘操作函数 .............................................................................................................................. 24
3.3.1 kbhit ................................................................................................................................... 24
3.3.2 kbflush ............................................................................................................................... 25
3.3.3 getkey ................................................................................................................................. 25
3.3.4 kbmute ................................................................................................................................. 26
3.3.5 kbsound ............................................................................................................................... 26
3.3.6 GetString ........................................................................................................................... 26
3.3.7 GetHzString ....................................................................................................................... 28
百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 1/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

3.3.8 kblight ............................................................................................................................... 29


3.3.9 SetLightTime ..................................................................................................................... 29
3.3.10 SetSlipFW ......................................................................................................................... 29
3.4 屏幕操作函数 .............................................................................................................................. 30
3.4.1 ScrCls ................................................................................................................................. 30
3.4.2 ScrClrLine ......................................................................................................................... 30
3.4.3 ScrGray ............................................................................................................................... 31
3.4.4 ScrBackLight ..................................................................................................................... 31
3.4.5 ScrGotoxy ........................................................................................................................... 31
3.4.6 ScrFontSet ......................................................................................................................... 31
3.4.7 ScrAttrSet ......................................................................................................................... 32
3.4.8 Lcdprintf ........................................................................................................................... 32
3.4.9 ScrPrint ............................................................................................................................. 33
3.4.10 ScrPlot ............................................................................................................................. 33
3.4.11 ScrDrLogo ......................................................................................................................... 33
3.4.12 ScrDrLogoxy ..................................................................................................................... 34
3.4.13 ScrRestore ....................................................................................................................... 34
3.4.14 ScrSetIcon ....................................................................................................................... 35
3.4.15 ScrDrawBox ....................................................................................................................... 36
3.4.16 ScrGotoxyEx ..................................................................................................................... 36
3.4.17 ScrGetxyEx ....................................................................................................................... 36
3.4.18 ScrDrawRect ..................................................................................................................... 37
3.4.19 ScrClrRect ....................................................................................................................... 37
3.4.20 ScrSpaceSet ..................................................................................................................... 37
3.4.21 ScrGetLcdSize.................................................................................................................. 38
3.4.22 ScrTextOut ....................................................................................................................... 38
3.5 磁卡读卡器操作函数 .................................................................................................................. 38
3.5.1 MagOpen ............................................................................................................................... 38
3.5.2 MagClose ............................................................................................................................. 39
3.5.3 MagReset ............................................................................................................................. 39
3.5.4 MagSwiped ........................................................................................................................... 40
3.5.5 MagRead ............................................................................................................................... 40
3.6 IC 卡读卡器操作函数 ................................................................................................................. 41
3.6.1 IccInit ............................................................................................................................... 41
3.6.2 IccClose ............................................................................................................................. 43
3.6.3 IccAutoResp ....................................................................................................................... 44
3.6.4 IccIsoCommand ................................................................................................................... 44
3.6.5 IccDetect ........................................................................................................................... 45
3.7 射频卡读卡器操作函数 .............................................................................................................. 46
3.7.1 PiccOpen ............................................................................................................................. 49
3.7.2 PiccSetup ........................................................................................................................... 50
3.7.3 PiccDetect ......................................................................................................................... 51
3.7.4 PiccIsoCommand.................................................................................................................. 54
3.7.5 PiccRemove ......................................................................................................................... 55

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 2/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

3.7.6 PiccClose ........................................................................................................................... 58


3.7.7 M1Authority ....................................................................................................................... 59
3.7.8 M1ReadBlock ....................................................................................................................... 61
3.7.9 M1WriteBlock ..................................................................................................................... 62
3.7.10 M1Operate ......................................................................................................................... 64
3.7.11 PiccLight ......................................................................................................................... 66
3.7.12 PiccInitFelica................................................................................................................ 67
3.7.13 PiccCmdExchange.............................................................................................................. 68
3.8 打印机操作函数 .......................................................................................................................... 68
3.8.1 PrnInit ............................................................................................................................... 69
3.8.2 PrnFontSet(P78)............................................................................................................ 70
3.8.3 PrnFontSet(P80、P90).................................................................................................. 70
3.8.4 PrnSpaceSet ....................................................................................................................... 71
3.8.5 PrnStep ............................................................................................................................... 71
3.8.6 PrnStr ................................................................................................................................. 71
3.8.7 PrnLogo ............................................................................................................................... 72
3.8.8 PrnStart ............................................................................................................................. 73
3.8.9 PrnStatus ........................................................................................................................... 74
3.8.10 PrnLeftIndent.................................................................................................................. 74
3.8.11 PrnGetDotLine.................................................................................................................. 75
3.8.12 PrnSetGray(P80).......................................................................................................... 75
3.8.13 PrnSetGray(P90).......................................................................................................... 75
3.8.14 PrnGetFontDot.................................................................................................................. 76
3.8.15 PrnDoubleWidth................................................................................................................ 76
3.8.16 PrnDoubleHeight.............................................................................................................. 77
3.8.17 PrnAttrSet ....................................................................................................................... 77
3.9 通讯口操作函数 .......................................................................................................................... 77
3.9.1 PortOpen ............................................................................................................................. 77
3.9.2 PortClose ........................................................................................................................... 78
3.9.3 PortSend ............................................................................................................................. 79
3.9.4 PortRecv ............................................................................................................................. 80
3.9.5 PortReset ........................................................................................................................... 80
3.9.6 PortSends ........................................................................................................................... 81
3.9.7 PortTxPoolCheck................................................................................................................ 81
3.9.8 PortRecvs ................................................................................................................................ 82
3.10 MODEM 通讯函数 ......................................................................................................................... 82
3.10.1 ModemReset ....................................................................................................................... 85
3.10.2 ModemDial ......................................................................................................................... 85
3.10.3 ModemCheck ....................................................................................................................... 88
3.10.4 ModemTxd ........................................................................................................................... 89
3.10.5 ModemRxd ........................................................................................................................... 89
3.10.6 ModemAsyncGet.................................................................................................................. 90
3.10.7 OnHook ............................................................................................................................... 91
3.10.8 ModemExCommand................................................................................................................ 91

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 3/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

3.10.9 将 P80 POS 设置成为一个外置 MODEM 的方法 .......................................................... 93


3.11 无线模块操作函数 .................................................................................................................... 94
3.11.1 WNetInit ........................................................................................................................... 94
3.11.2 WNetCheckSignal.............................................................................................................. 94
3.11.3 WNetCheckSim ................................................................................................................... 95
3.11.4 WNetSimPin ....................................................................................................................... 95
3.11.5 WNetUidPwd ....................................................................................................................... 96
3.11.6 WNetDial ........................................................................................................................... 96
3.11.7 WNetCheck ......................................................................................................................... 97
3.11.8 WNetTcpConnect................................................................................................................ 98
3.11.9 WNetTcpTxd ....................................................................................................................... 98
3.11.10 WNetTcpRxd ..................................................................................................................... 99
3.11.11 WNetTcpClose.................................................................................................................. 99
3.11.12 WNetClose ..................................................................................................................... 100
3.11.13 WNetLinkCheck.............................................................................................................. 100
3.11.14 WNetTcpCheck................................................................................................................ 101
3.11.15 WNetReset ..................................................................................................................... 101
3.11.16 WNetSendCmd ................................................................................................................. 102
3.11.17 WNetMTcpConnect.......................................................................................................... 102
3.11.18 WNetMTcpTxd ................................................................................................................. 103
3.11.19 WNetMTcpRxd ................................................................................................................. 104
3.11.20 WNetMTcpClose.............................................................................................................. 104
3.11.21 WNetMTcpCheck.............................................................................................................. 105
3.11.22 WPhoneCall ................................................................................................................... 105
3.11.23 WPhoneHangUp................................................................................................................ 106
3.11.24 WPhoneStatus................................................................................................................ 106
3.11.25 WPhoneAnswer................................................................................................................ 107
3.11.26 WPhoneMicGain.............................................................................................................. 107
3.11.27 WPhoneSpkGain.............................................................................................................. 107
3.11.28 WPhoneSendDTMF............................................................................................................ 108
3.11.29 无线模块注意事项........................................................................................................ 108
3.11.30 无线模块数据功能 API 使用范例 ................................................................................ 109
3.11.31 无线模块语音功能 API 使用范例 .................................................................................111
3.12 PPP 协议接口函数 ................................................................................................................... 113
3.12.1 NpppLogin ....................................................................................................................... 114
3.12.2 NpppOpen ......................................................................................................................... 116
3.12.3 NpppWrite ....................................................................................................................... 117
3.12.4 NpppRead ......................................................................................................................... 118
3.12.5 NpppCheck ....................................................................................................................... 119
3.12.6 NpppClose ....................................................................................................................... 120
3.12.7 NpppProcess ................................................................................................................... 121
3.12.8 GsmCallModem ................................................................................................................. 122
3.12.9 GsmCheck ......................................................................................................................... 124
3.12.10 GsmOnHook ..................................................................................................................... 126

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 4/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

3.12.11 NpppSetAuth ................................................................................................................. 127


3.13 文件系统操作函数 .................................................................................................................. 128
3.13.1 open ................................................................................................................................. 129
3.13.2 ex_open ........................................................................................................................... 129
3.13.3 read ................................................................................................................................. 130
3.13.4 write ............................................................................................................................... 130
3.13.5 close ............................................................................................................................... 131
3.13.6 seek ................................................................................................................................. 131
3.13.7 filesize ......................................................................................................................... 131
3.13.8 remove ............................................................................................................................. 132
3.13.9 freesize ......................................................................................................................... 132
3.13.10 InitFileSys ................................................................................................................. 132
3.13.11 Truncate ....................................................................................................................... 133
3.13.12 fexist ........................................................................................................................... 133
3.13.13 GetFileInfo ................................................................................................................. 133
3.13.14 FileToApp ..................................................................................................................... 134
3.13.15 FileToParam ................................................................................................................. 134
3.13.16 FileToMonitor.............................................................................................................. 135
3.13.17 ReadFontLib ................................................................................................................. 135
3.13.18 DelAppFile ..................................................................................................................... 135
3.14 环境变量操作函数 .................................................................................................................. 136
3.14.1 GetEnv ............................................................................................................................. 136
3.14.2 PutEnv ............................................................................................................................. 136
3.15 加解密函数 .............................................................................................................................. 137
3.15.1 des ................................................................................................................................... 137
3.15.2 Hash ................................................................................................................................. 137
3.15.3 RSARecover ..................................................................................................................... 137
3.16 PED 函数 ................................................................................................................................... 138
3.16.1 PEDInputTimeOut............................................................................................................ 139
3.16.2 PEDInput ......................................................................................................................... 139
3.16.3 PEDGetPwd ....................................................................................................................... 139
3.16.4 PEDGetPwd_3Des.............................................................................................................. 140
3.16.5 PEDWriteMKey ................................................................................................................. 141
3.16.6 PEDWriteDKey ................................................................................................................. 141
3.16.7 PEDWriteWKey ................................................................................................................. 142
3.16.8 PEDDeriveKey ................................................................................................................. 142
3.16.9 PEDDes ............................................................................................................................. 143
3.16.10 PEDMac ........................................................................................................................... 143
3.16.11 EPSPEDAmount................................................................................................................ 144
3.16.12 EPSPEDLoadTMK.............................................................................................................. 145
3.16.13 EPSPEDLoadKey.............................................................................................................. 145
3.16.14 EPSPEDGetMAC1.............................................................................................................. 146
3.16.15 EPSPEDUpdateTPK.......................................................................................................... 146
3.16.16 EPSPEDSetMAC2.............................................................................................................. 147

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 5/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

3.16.17 EPSPEDVerifyTMK.......................................................................................................... 148


3.16.18 EPSPEDGetPwd................................................................................................................ 148
3.16.19 PED_PassWordEncrypt.................................................................................................. 148
3.16.20 PED_PassWordInput...................................................................................................... 149
3.16.21 SYLPEDGetPwd................................................................................................................ 149
3.16.22 SYLPEDVerifyDerive.................................................................................................... 150
3.16.23 SYLPEDCalcPinBlock.................................................................................................... 150
3.16.24 SYLPEDLoadTMK.............................................................................................................. 151
3.16.25 PEDManage ..................................................................................................................... 151
3.17 多应用管理函数 ...................................................................................................................... 152
3.17.1 ReadAppInfo ................................................................................................................... 153
3.17.2 ReadAppState ................................................................................................................. 153
3.17.3 SetAppActive ................................................................................................................. 153
3.17.4 RunApp ............................................................................................................................. 153
3.17.5 DoEvent ........................................................................................................................... 154
3.18 IP 操作函数 ............................................................................................................................. 154
3.18.1 模块返回值列表.............................................................................................................. 154
3.18.2 NetSocket ....................................................................................................................... 155
3.18.3 NetBind ........................................................................................................................... 155
3.18.4 NetConnect ..................................................................................................................... 155
3.18.5 NetListen ....................................................................................................................... 156
3.18.6 NetAccept ....................................................................................................................... 156
3.18.7 NetSend ........................................................................................................................... 157
3.18.8 NetSendto ....................................................................................................................... 157
3.18.9 NetRecv ........................................................................................................................... 157
3.18.10 NetRecvfrom ................................................................................................................. 158
3.18.11 NetCloseSocket............................................................................................................ 158
3.18.12 Netioctl ....................................................................................................................... 158
3.18.13 SockAddrSet ................................................................................................................. 161
3.18.14 SockAddrGet ................................................................................................................. 161
3.18.15 DnsResolve ................................................................................................................... 161
3.18.16 NetPing ......................................................................................................................... 162
3.18.17 RouteSetDefault.......................................................................................................... 162
3.18.18 RouteGetDefault.......................................................................................................... 162
3.18.19 NetDevGet ..................................................................................................................... 163

4、 编译和链接.................................................................................................................................... 164

4.1 GCC 简介 ...................................................................................................................................... 164


4.1.1 gcc 的基本用法和选项..................................................................................................... 164
4.1.2 gcc 的错误类型及对策..................................................................................................... 165
4.2 应用程序的编译 ........................................................................................................................ 166
4.3 用程序的链接和转换 ................................................................................................................ 166
4.4 MAKEFILE 的具体例子 .................................................................................................................. 167
4.5 连接脚本文件的具体例子 ........................................................................................................ 169
4.6 PAXPAYPRO 应用实例 ................................................................................................................... 170
百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 6/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

4.7 应用开发注意事项 .................................................................................................................... 172


4.8 应用程序空间的限制 ................................................................................................................ 172
4.8.1 空间定义 ........................................................................................................................... 172
4.8.2 P80、P78、P90、R50、P58、R50-M 空间大小与限制 ................................................... 172
4.8.3 R30、R100 空间大小与限制 ............................................................................................ 172

5、 附录................................................................................................................................................ 174

5.1 数据结构速查 ............................................................................................................................ 174


5.1.1 IC 卡数据结构 .................................................................................................................. 174
5.1.2 Modem 拨号参数结构......................................................................................................... 174
5.1.3 文件信息结构 ................................................................................................................... 175
5.1.4 应用信息结构 ................................................................................................................... 175
5.1.5 传递磁卡数据的数据结构................................................................................................ 175
5.1.6 事件处理的数据结构........................................................................................................ 175
5.1.7 字库的数据结构................................................................................................................ 176
5.1.8 IP 模块 Socket 地址结构................................................................................................. 176
5.2 名词解释速查 ............................................................................................................................ 176
5.3 全局变量 .................................................................................................................................... 177

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 7/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.2)

1、 概述

1.1 内容概述

本应用开发指南是介绍 P80、P90、P78、R50、P58、R30、R50-M、R100 的应用程序接口


函数的技术文档,在本手册中将全面介绍相应技术指标,P80、P90、P78、R50、P58、R30、
R50-M、R100 在使用上存在的差异与注意事项,应用开发说明,应用接口函数说明,应用程
序的仿真开发等内容。

1.1.1 手册合并及注意事项
由于 P80、P78、P90、R50、P58、R30、R50-M、R100 存在模块级别的差异以及个别 API
接口的细微差异,应用开发人员在参考本手册时要特别给予区分和注意,为了最大限度地减
少应用开发人员在开发过程中由于本手册的原因引起的异常,本手册作了详细的标注,并以
警告色区分,希望应用开发人员引起重视,具体注意事项如下:
1. 在 API 详细说明章中的每一节(模块级别)的开头处均会标注此模块所适应机型,
如在打印机 API 函数这节的开头处会以红色警告色标注:此模块下的 API 仅适应
P80、P78、P90、P58,但 R50、R30、R50-M、R100 不适应!原因是 R50、R30、R50-M、
R100 并不带打印机。
2. 如果某个 API 说明不适用某些机型,则会在这个 API 说明的注释栏中以红色警告色
作相应标注:xxx 机型不支持该 API,在应用开发中务必注意。
3. 在产品适用模块一览表中对机型模块级别的差异作了详细对比与提示,请开发人员
开发前认真参阅。
4. 每个 API 说明中对函数参数进行了细化,分为输入参数与输出参数。

1.1.2 产品适用模块一览表
表 1-1 产品适用模块一览表
模块 适用机型
硬件模块 软件模块 P80 P78 P90 R50 P58 R50 R30 R100
-M
/ 系统基本函数 △ △ △ △ √ △ △ △
/ 加解密函数 √ √ √ √ √ √ √ √
键盘 键盘操作函数 △ △ √ △ △ × × ×
LCD LCD 操作函数 △ △ △ △ √ × × ×
磁卡 磁卡操作函数 √ √ √ × √ × × ×
IC 卡读卡器 IC 卡读卡器操作 √ √ √ √ √ √ × √
函数
串口 通讯口操作函数 √ √ √ √ √ √ √ √
打印机 打印机操作函数 △ △ △ × √ × × ×
MODEM MODEM 通讯函数 √ √ √[适 × √ × × ×

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 8/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

用外置
MODEM]
/ 文件系统操作函数 √ √ △ △ √ △ △ △
/ 多应用管理函数 √ √ √ √ √ √ √[仅 √
适用于 [仅
支持多 适用
应用 于支
R30 持多
monito 应用
r] R100
moni
tor]
/ 环境变量操作函数 √ √ √ √ √ √ √ √
PED PED 操作函数 √ × △ × √ × × ×
射频卡读卡 射频卡读卡器函数 √ × × √ × √ √ √

CDMA,GPRS 无线模块操作函数 △ × √ × × √ × ×
[使
用S






口]
/ PPP 协议接口函数 √ △ △ × × × × ×
注:√-完全适用;△-部分适用;×-不适用

1.2 修改历史

表 1-2 修改历史
日期 版本 备注 作者
2008-06-16 V1.0.0 初稿 宋坤贤
2008-07-09 V1.0.1 添加 P90 外置 MODEM 模块 API;分别处理打印机 宋坤贤
模块 API(分热敏与针式)
2008-9-16 V1.0.2 添加射频卡模块操作函数返回值列表;将射频卡 宋坤贤
内部数据结构 PICC_PARA 添加了两个参数;将
ProPay 改名为 PAXPayPro.
2008-10-27 V1.0.3 修改 ScrAttrSet 说明; 宋坤贤
修改 IccIsoComand 说明;
添加 DesFire 卡的 32 个 API 及说明。

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 9/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

2008-11-7 V1.0.4 1.增加 IccInit 关于 SAM 卡操作说明 宋坤贤


2.增加 IccDetect 卡不支持 SAM 卡说明
3.修改 Desfire API 的说明
4.修 R50PortTxPoolCheck 说明
2008-11-28 V1.0.5 由于会议讨论决定将 DesFire 卡的 31 个 API 从 宋坤贤
monitor 移出交应用层实故删除 DesFire 卡的 31
个 API 及说明。仅保留 PiccDesFire_Exchange
2009-01-13 V1.0.6 添加 GetTermInfo 中 R50 终端型号为 0x80;P50 宋坤贤
终端型号为 0x81
2009-3-10 V1.0.7 将 Desfire 卡的 PiccDesFire_Exchange 改名为 宋坤贤
PiccCmdExchange;R50 增加一串口说明。
2009-5-5 V1.0.8 增加射频卡 M1Opreate API 的转存功能说明。 宋坤贤
2009-5-7 V1.0.9 增加 P58LCD、打印机 API,增加 FSK 处理 API 说 万籁民
明,不支持 modem 7,n,1 格式的异步通信格式。
2009-6-5 V1.1.0 增加 DelAppFile 函数 石金璐
2009-6-23 V1.1.1 增加 R30 的相关 API 说明。 宋坤贤
2009-7-21 V1.1.2 根据测试部要求,修改 R30 的相关 API 说明。 宋坤贤
2009-08-28 V1.1.3 修改 DelAppFile()返回码 吴俊诚
2009-09-02 V1.1.4 增加无线模块部分,部分接口返回码说明。 万籁民
2009-11-20 V1.1.5 增加 R30 对 HASH 及 RSARecover 函数的支持 宋坤贤
2010-01-19 V1.1.6 增加 R30、R50 对 FileToAPP、FileToMonitor、 宋坤贤
FileToParam 函数的支持
2010-02-04 V1.1.7 增加 R50-M 机型的相关函数支持 宋坤贤
2010-03-03 v1.1.8 修改 R50-M 无线模块 API 参照 S 系列开发文档 宋坤贤
说明及 R50、R30、R50-M 对 FileToMonitor 函数
的说明。
1.在 GetTermInfo 接口中添加对 3G 模块的说明 王尚彪
2. 修改了 R30 应用程序空间的限制
1. 2. PiccInitFelica 接口增加返回值 0x02 及其
说明
2. 更新 PICC_PARA 数据结构
3. 删除 PiccOpen()接口的返回值 0x03 和 0x04
2010-06-28 V1.1.9 4. 增加 PiccClose()接口的注释说明, PiccSetup()
接口中增加对灵敏度和 Felica 卡调制深度 宁婷
的注释说明
5. 在射频卡部分的“模块操作函数返回值列表”
中增加 0xff 返回值及其说明,删除“Desfire
卡片回送的错误状态码取值及含义”

2010-08-26 V1.2.0 为 P90 增加 “IP 操作函数”部分 API 万籁民

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 10/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

2010-11-08 V1.2.1 1. 修改‘FileToMonitor’


、‘FileToParam’注
释内容;
2. 增加‘通讯口操作函数’说明中对于 P90 的
吴俊诚
说明;
3. 增加‘ModemDial’注释中‘P90 不支持同步
“9600”拨号,不支持异步拨号’的说明。
1. 删除 PiccCmdExchange()中关于 P80 不支持
谭珏
该 API 的描述。
2. 修改 PerLeftlndent()对 logo 的有效性;
3. 修改 P80/P90 的文档描述;
4. 修改 PED 部分的文档描述;
5. 增加 PEDManage()函数在 mode 模式非法时的
相应返回码。
6. ScrFontSet 修改点:返回值为上一次设置的
值。参数 0 为字符模式,非 0 为汉字模式。
7. ScrSetIcon 接口描述中,
#define ICON_SPEAKER 6 //speeker
2011-03-09 V1.2.2 扬声器 。加入注释信息(P58、P90 中
该项为电池选项。 )
8. ScrDrawBox 修改纵坐标范围:0~7。
9. ScrGotoxyEx 参数修改为:
pixel_X>=0,pixel_Y>=0。
10. ScrClrRect 功能描述修改为清除矩形内
容。
11. 函数 ScrTextOut 修改注释:不支持负值坐
标,并且说明取值为负值时,函数无动作直
接返回。且参数取值范围也做了修改 0-63、
0-127。

2011-12-15 V1.2.3 1. 删除 GetTime()下的返回值;


2. 通讯口操作函数下增加了通讯号为 11 的 USB
DEVICE 和 0x0e 的返回值;
3. 修改通讯操作函数下关于 R50 增强版的注
释;
谭珏
4. 增加了 PortRecvs 接口;
5. 在射频卡读卡器操作函数下增加仅适用于
R50 增强版的 PICC_PARA 数据结构体;
6. 增加 Portopen()中关于 P58 的注释:PINPAD
口不能以“7,E,1”的格式打开。
2012-3-27 V1.2.4 1. 增加 R100 功能描述 彭焕杰
2012-7-24 V1.2.5 1. 增加 P78,P90 支持 S 字库的部分 API
刘彦志
2. 对于 P78,P90, ScrTextOut 坐标支持负值

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 11/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.2)

2、 开发平台

P80、P90、P78、R50、P58、R30、R50-M、R100 具有完全相同的开发平台。

2.1 系统需求

IBM 或兼容奔腾 PC 机一台,64M 以上内存,200M 以上可用硬盘空间,Windows 98 以上


版本的操作系统。

2.2 软件工具

2.2.1 编译工具
现采用 GCC 开发工具,用 GCC 的编译连接工具。具体命令和使用方法参看 LINUX 相关文
档(也可参考本文档的编译和链接章的具体例子) 。

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 12/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.2)

3、 API 详细说明

P78、P80、P90、R50、P58、R30、R100 存在模块级别的差异和个别 API 的细微差异,


请应用开发人员注意各个模块开头处的标注信息以及 API 说明注释栏的标注信息,标注信息
均以红色警告色提醒。

为简化 API 原型,一些变量的数据类型定义如下:

#define uchar unsigned char


#define ushort unsigned short
#define uint unsigned int
#define ulong unsigned long

3.1 系统基本函数

本模块内的所有 API 对 P78、P80、P90、R50、R30、R50-M、R100 部分使用,P58 均


适用。

模块功能说明:本模块是实现系统相关操作 API,包括对系统初始化、系统时间设置、
系统声音调节、系统定时器使用、系统版本信息的获取等功能。

模块内数据结构:无

3.1.1 SystemInit
原型: uchar SystemInit(void);
功能: 系统初始化。
输入参数: 无
输出参数: 无
0x00 应用程序是第一次运行。
返回:
0xff 应用程序非第一次运行。
注释: 该函数必须在 Main()函数的入口处调用一次,不能多次调用。

举例:系统初始化
void main(void)
{
If (SystemInit() == 0) // 第 1 次运行
{
初始化一些应用参数;
}
后续的应用程序部分;
}

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 13/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

3.1.2 Beep

原型: void Beep(void)

功能: 终端蜂鸣器发出一声“嘀”

输入参数: 无

输出参数: 无

返回值: 无

注释: 无

举例:“嘀” 、20ms 的停顿、“嘀”的发声


Beep();
DelayMs(20);
Beep();

3.1.3 Beef
原型: void Beef(uchar mode,ushort DlyTime)
功能: 蜂鸣器按指定的频率和持续时间发声。有按键后中止 Beef。
mode 频率设定,可以是 0~6 的值:
0 最低频率
输入参数: 6 最高频率
DlyTime 持续发生时间(单位:ms)(0~65535)

输出参数: 无
返回: 无
注释: 当 mode 取值大于 6 时,该函数会以 mode%7 为发声频率。

举例:
Beef(1,100);/* 使用较低频率发声 100 毫秒 */

3.1.4 SetTime
原型: uchar SetTime(uchar *time)
功能: 设置系统日期和时间,星期值将自动算出并设置
time 日期时间参数的指针,格式为 YYMMDDhhmmss,参数 为 BCD
输入参数: 码,共 6 个字节长.(有效时间范围:1950,1,1-2049,12,31)

输出参数: 无
0 设置成功
返回:
非0 日期时间值非法
在返回值为非 0 值时,可使用以下值跟踪错误:
注释: 1  参数中年份非法
2  参数中月份非法

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 14/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

3  参数中日期非法
4  参数中小时非法
5  参数中分钟非法
6  参数中秒钟非法
0xff  读写时钟芯片出错。
R30 不支持该 API!

3.1.5 GetTime
原型: void GetTime(uchar *time)
功能: 读取当前系统日期和时间
time 存放日期时间值的指针,以 BCD 码形式存放:
str[0]  年份
str[1]  月份
str[2]  日
输入参数:
str[3]  小时
str[4]  分钟
str[5]  秒钟
str[6]  星期
输出参数: 无

返回:

星期值的定义:
注释: 1  星期一, 2  星期二, …… 7  星期日.
R30 不支持该 API!

举例:设置和读取日期、时间的例子。
unsigned char DateTime[7];
memcpy (DateTime, “\x01\x08\x08\x08\x56\x42”, 6);
SetTime(DateTime);
// 将系统时间改为 01 年 8 月 8 日 8 时 56 分 42 秒
// 系统会将 week 的值会自动设置
GetTime(DateTime);
// 经过适当处理以供显示、自动处理等用途
……

3.1.6 DelayMs
原型: void DelayMs(ushort Ms)
功能: 延时 Ms 个毫秒
输入参数: 无

输出参数: 无
返回: 无
注释: 由于为指令延时,在延时过程中会至少被系统定时器打断,故延时时间太长
百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 15/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

会有误差。

3.1.7 TimerSet
原型: void TimerSet(uchar TimerNo, ushort Cnts)
功能: 启动一个用户指定的定时器,最小定时单位为 100 毫秒。定时器最大定时时
间为 65535 个 100 毫秒
TimerNo 用户指定的定时器编号
输入参数:
Cnts 定时时间(100MS 个数)

输出参数: 无
返回: 无
系统共有 5 个定时器供应用程序使用,其编号为 0~4。对于非法编号,系统
注释: 将以TimerNo %5 为定时器编号,TimerCheck()函数是以同样方式处理TimerNo
的。

3.1.8 TimerCheck
原型: ushort TimerCheck(uchar TimerNo)
功能: 检查一个指定定时器的当前值(100 毫秒的个数)
输入参数: TimerNo 用户指定的定时器编号

输出参数: 无
返回: 定时器的剩余时间
注释: 剩余时间为 0 表示定时器定时时间到。

举例:使用定时器 0 定时 10 秒,按键/定时到退出
TimerSet(0,100);
while(1){
if(kbhit()==0) break;
if(!TimerCheck(0)) break;
}

3.1.9 ReadSN
原型: void ReadSN(uchar *SerialNo)
功能: 读取终端产品序列号
输入参数: 无

输出参数: SerialNo 存放产品序列号的缓冲区地址,需要预先分配 32 字节的空间。

返回: 无
返回的序列号,以’\0’结尾的字符串(最多 32 字节)。如果 SN[0]=’\0’,则
注释:
为无序列号终端。

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 16/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

3.1.10 EXReadSN
原型: void EXReadSN(uchar *SN)
功能: 读取终端扩展序列号(满足一些特定的应用需求)
输入参数: 无

输出参数: SN 存放扩展序列号的缓冲区地址,需要预先分配 32 字节的空间。

返回: 无
返回的扩展序列号,以’\0’结尾的字符串(最多 32 字节)
。如果 SN[0]=’\0’,
注释:
则为无扩展序列号。

3.1.11 ReadVerInfo
原型: uchar ReadVerInfo(uchar *VerInfo)
功能: 读取终端的版本信息
输入参数: 无
VerInfo VerInfo – 版本信息 (8 个字节)
VerInfo[0]:BOOT 版本号
VerInfo[1]:监控主版本号
VerInfo[2]:监控次版本号
VerInfo[3]:主板硬件版本号
输出参数: VerInfo[4]:接口板配置信息[P90 此项保留]
VerInfo[5]:扩展功能板配置信息
VerInfo[6]:磁头配置信息
VerInfo[7]:射频卡配置信息[适用 P80、R50、R30、R100,P90
此项保留]
VerInfo[7]:键盘板配置信息[适用 P78]
返回: 无
注释: 请参考终端内部版本管理相关章节。版本号用十六进制值表示

3.1.12 GetLastError
原型: int GetLastError(void)
读取 errno 的值,在应用程序中不可以直接访问 error 变量,而必须通过调用
功能:
该函数来访问 errno。
输入参数: 无

输出参数: 无
返回: errno
注释: 无

3.1.13 GetTermInfo
原型: int GetTermInfo(uchar *out_info)
功能: 读取终端型号与配置信息,信息缓冲定义应不少于 30 个字节.

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 17/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

输 入 参 无
数:
out_info[0]:终端型号【0x00~0xFF】
1:P60-S
2:P70
3:P60-S1
4:P80
5:P78
6:P90
7:S80
8:SP30
9:S60
10:S90
0x80:R50
0x81:P50
0x82:P58
0x83:R30
0x84:R50-M
0x88: R100
out_info[1]:打印机类型
‘S’:针式打印机
‘T’:热敏打印机
输 出 参 out_info[2]:MODEM 模块配置信息
out_info
数: 0:不支持 MODEM 通信模块
其它:MODEM 模块型号编码:
0x01-TDK 73K222 1200/1200
0x02-TDK 73K224 2400/2400
0x10-Silicon 2414 14.4k/2400
0x20-conexant 81802 33.6k/9600
0x40-conextant 93001-V92 56k/9600
0x41-conextant 93001-V32B 14.4K/9600
out_info[3]:MODEM 最高同步速率信息
1-1200 2-2400 3-9600 4-14400
out_info[4]:MODEM 最高异步速率信息
1-1200 2-2400 3-4800 4-7200
5-9600 6-12000 7-14400 8-19200
9-24000 10-26400 11-28800 12-31200
13-33600 14-48000 15-56000
out_info[5]:PCI 配置信息
0:不支持内置 PCI 安全模块
其它:支持内置 PCI 安全模块(版本编码)
out_info[6]:USB 主机(HOST)配置信息
0:不支持 USB 主机接口
其它:USB 主机接口版本编码(如支持 USB1.1,USB2.0,USB-OTG

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 18/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

等)
out_info[7]:USB 设备配置信息
0:不支持从 USB 接口
其它:USB 设备接口版本编码
out_info[8]:LAN(TCP/IP)模块配置信息
0:不支持 TCP/IP 模块
其它:TCP/IP 模块版本编码
out_info[9]:GPRS 模块配置信息
0:不支持 GPRS 模块
其它:GPRS 模块版本编码
out_info[10]:CDMA 模块配置信息
0:不支持 CDMA 模块
其它:CDMA 模块版本编码
out_info[11]:WI-FI 模块配置信息
0:不支持 WI-FI 模块
其它:WI-FI 模块版本编码
out_info[12]:非接触式读卡模块配置信息
0:不支持非接触式读卡模块
1:非接触式读卡模块为 RC531 模块
2:非接触式读卡模块为 PN512 模块
out_info[13]:显示字库版本信息
0:无字库文件;
1:中文字库;
2:英文;[仅 P90]
3:俄文;[仅 P90]
其它-版本号
out_info[14]:打印字库版本信息
0:无字库文件;
1:中文字库;
2:英文;[仅 P90]
3:俄文;[仅 P90]
其它:版本号
out_info[15]:接触式 IC 卡模块配置信息[R50、R50-M]
0:无接触式 IC 卡模块;
1:接触式 IC 卡模块版本编码;
out_info[16]:磁条卡模块配置信息[R50、R50-M]
0:无磁条卡模块;
1:磁条卡模块版本编码;
out_info[17]:SAM 卡模块配置信息[R50、R50-M]
0:无 SAM 卡模块;
1:SAM 卡模块版本编码;
out_info[18]:时钟模块配置信息[R50、R50-M]
0:无时钟模块;
1:时钟模块版本编码;

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 19/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

out_info[19]:LCD 模块配置信息[R50、R50-M]
0:无 LCD 模块;
1:LCD 模块版本编码;
out_info[20]:3G 模块配置信息
0:不支持 3G 模块;
1:WCDMA 模块;
2:TD-SCDMA 模块
3:CDMA2000 模块
out_info[21]-[29]:保留
返回: 返回终端信息有效字节长度。
注释: 其中 out_info[15~19]为 R50、R50-M 专用配置信息,并适用于 R30、R100!

3.1.14 EnumFont
原型: int EnumFont (ST_FONT *Fonts, int MaxFontNums);
功能: 枚举当前 POS 支持的字体。
Fonts 存放字体的缓冲
参数:
MaxFontNums Fonts 缓冲可以存放字体的个数
返回: >=0 实际读到的字体个数
P58 适用该 API!
注释:
P78 及 P90 使用 S 字库支持该 API

3.1.15 ScrSelectFont
原型: int ScrSelectFont(ST_FONT *SingleCodeFont, ST_FONT *MultiCodeFont);
功能: 选择 LCD 显示字体
SingleCodeFont 单内码字体(比如英文、俄文等等)
,可以为 NULL
参数:
MultiCodeFont 多内码字体(比如中文、日文等),可以为 NULL

-1 SingleCodeFont 指定的字体不存在,选择字体失败
返回:
-2 MultiCodeFont 指定的字体不存在,选择字体失败
0 读取成功
P58 适用该 API!
注释:
P78 及 P90 使用 S 字库时支持该 API

3.1.16 PrnSelectFont
原型: int PrnSelectFont(ST_FONT*SingleCodeFont,ST_FONT *MultiCodeFont);
功能: 选择打印机打印字体
SingleCodeFont 单内码字体(比如英文、俄文等等)
,可以为 NULL
参数:
MultiCodeFont 多内码字体(比如中文、日文等),可以为 NULL
返回: -1 SingleCodeFont 指定的字体不存在,选择字体失败

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 20/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

-2 MultiCodeFont 指定的字体不存在,选择字体失败

0 读取成功
P58 适用该 API!
注释:
P78 及 P90 使用 S 字库支持该 API

3.1.17 LedDisplay
原型: void LedDisplay(unsigned char type, unsigned char *str);
功能: LED 客显显示函数。
显示类型:
0 - 关闭显示
Type 1 - 显示金额
输入参数: 2 - 显示余额
其他 - 保留
显示字符串,支持显示数字“0~9”
、字符“A~F”、符号“-”和
Str
小数点“.”
,输入其他字符不显示。
输出参数: 无

返回: 无

用于控制 LED 客显显示。


注释:
P80、R50、P78、P58、R30 不适用该 API!

3.2 电源管理函数

本模块内的所有 API 对 P90 均适用,对 P80、R50、P78、P58、R30、R50-M、R100 不


适用!

模块功能说明:本模块是实现电源管理相关操作 API,包括使系统进入低功耗模式、读
取系统电压等级、关闭电源等功能。

模块内数据结构:无

3.2.1 PowerSave
原型: uint PowerSave(uint Event, uint OverTime)
功能: 强制进入低功耗模式。
Event 允许退出低功耗的条件。对应位设置为 1 则表示该条件有
效,设置为 0 表示无效。见注释的位说明。
当调用该函数没有已知的退出条件时(如 Event=0)
,则该
输入参数:
函数将立刻退出。当设置多个条件时,这些条件是或者的
关系,只要有一个条件满足则退出该函数。
对于未被设置的条件,后台不影响这些条件发生,只是没

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 21/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

有退出这个函数。
OverTime 当设置超时条件有效时该参数有效,本参数表示超时强制
退出低功耗的时间(ms),精确度 10ms。
输出参数: 无
返回触发退出该函数的条件,各条件对应的位为 1 表示发
生了该事件。由于存在并列的可能,因此退出条件可能不
返回: 是唯一的,具体见注释。

应用程序可以通过调用该 API 进入低功耗状态,然后根据返回的


事件进行相应处理。超时退出的事件作为其它事件的一个补充,其主
要目的是能在操作员无任何操作的情况下有一个把控制权返回给应用
程序的机制,方便应用程序处理超时事件。
需要注意的是本函数仅仅是监控有没有设置的事件发生,并不对
这 些 事 件 能 否 发 生 作 判 断 。 如 COM1 口 未 打 开 则 即 使 设 置 了
EVENT_UARTRECV,也不报错,而且还得不到事件。这样设计的目
的是为函数的独立性和简便性,若本函数进行很多判断的话则应用在
调用本函数就会很繁琐。建议应用在设置条件前能保证 P90 已经就绪,
等待事件发生。通常,建议其他事件与超时并列,让本函数肯定可以
退出。
通过以下应用举例即可了解该函数的简便性。
设置 Event 条件以及退出的事件。对于 Event 输入,其每一位的
1 表示 Enable;0 表示 Disable。对于返回值,其每一位 1 表示被此事
件唤醒并退出,0 表示退出时没有检测到该位对应的事件发生。
#define EVENT_OVERTIME 0X01
#define EVENT_KEYPRESS 0X02
注释: #define EVENT_MAGSWIPED 0X04
#define EVENT_ICCIN 0X08
#define EVENT_UARTRECV 0X10
#define EVENT_WNETRECV 0X20

bit31~bit6 bit5 bit4 bit3 bit2 bit1 bit0

保留 Wnet 接 串口 IC 卡 划卡 按键 超时
收到数据 数据 插卡

bit1 表示按键缓冲还有没有被读取或者清除的键值;
Bit2 表示有划卡数据没有被读取或者清除;
Bit3 表示 IC 卡在位(而不是插卡动作);
Bit4 表示串口缓冲有数据没有被读取;
Bit5 表示 Wnet 缓冲有数据没有被处理;

如果某个事件没有被处理,那再次调用该函数则会很快返回。如用户
按了某个键,但应用程序没有去取该按键值,也没有去清除按键缓冲,
则下次调用 PowerSave(event,1000)则会在 10ms 之内返回,降低了一些

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 22/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

省电效果。其中 event 包含按键事件。


P80、R50、P78、P58、R30、R50-M、R100 不适用该 API!

举例:定时 10 秒,按键/定时到退出(与检测定时器例子比较)
PowerSave(EVENT_KEYPRESS | EVENT_OVERTIME, 10000);

3.2.2 AutoPowerSave
原型: void AutoPowerSave(uchar mode)
功能: 设置交互函数的自动低功耗功能。
mode 0:关闭自动低功耗功能。
参数:
1:开启自动低功耗功能。(默认)

输出参数:

返回: 无
自动低功耗功能是在 kbhit()、MagSwiped()、IccDetect()检测不到按键、
划卡、插卡事件时自动低功耗执行 10ms 时间,也就是说这些函数在没有
判断到事件时的执行时间为 10ms。
如果关闭自动低功耗功能,则这些函数执行时间是 1us 左右,但不能
利用这些函数省电。
在普通界面下,操作员是分辨不出 100ms 以下的延迟,因此可以打
开自动低功耗功能。而在诸如通讯握手等操作,对时间要求可能比较高,
此时应关闭自动低功耗,保证通讯成功。
注释:
普通情况下建议设置模式为 1,仅通过分析对这些事件扫描函数执行
时间要求很高的情况才设置为模式 0。
注:自动低功耗除了上述 3 个函数外,在 getkey()、PortRecv()、Beef()、
Beep() 、 DelayMs() 、 PEDGetPwd_3Des() 、 PEDGetPwd() 、 PrnStart() 、
GetString()、GetHzString()等函数也同样具备低功耗功能。但因这些函数
的实现方式是兼容的,即不会影响执行效果和时间,因此不提供控制开关
来选择。
P80、R50、P78、P58、R30、R50-M、R100 不适用该 API!

举例:使用自动低功耗功能后,应用实现低功耗的扫描按键代码
while(1){
if(kbhit()==0) break;
}

3.2.3 BatteryCheck
原型: uchar BatteryCheck(void)
功能: 读取系统电压等级。

输入参数: 无

输出参数: 无

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 23/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

0 电池小图标闪烁,表示需立即充电。带蜂鸣器提示并可能快速
自动关机。
1 电池小图标闪烁,表示需尽快充电。建议不要做交易、打印、
无线通讯。并且立即保存重要数据,准备提示用户充电。
2 电池小图标显示 1 格。
返回: 3 电池小图标显示 2 格。
4 电池小图标显示 3 格。
5 电池小图标显示 4 格。
6 表示有外接电源供电,正处于充电过程,电池小图标 4 格循环。
7 表示有外接电源供电,但已充满电。
(或者只有外电供电,并且
没有电池)
注释: P80、R50、P78、P58、R30、R50-M、R100 不适用该 API!

3.2.4 PowerOff
原型: void PowerOff(void)
功能: 关闭电源。
输入参数: 无

输出参数: 无

返回: 无

注释: P80、R50、P78、P58、R30、R50-M、R100 不适用该 API!

3.3 键盘操作函数

本模块内的所有 API 对 P90 均适用,对 P80、P78、R50、P58 部分适用,对 R30、R50-M、


R100 不适用,请注意 API 注释栏的提示。

模块功能说明:本模块是实现键盘相关操作 API,包括按键的检测、按键音控制、按键
键值说明、多功能键盘输入(R50 不适用)等功能。

模块内数据结构:无

3.3.1 kbhit
原型: uchar kbhit(void)
功能: 检测键盘缓冲区是否有尚未被取走的键值
输入参数: 无

输出参数: 无
0xFF 没有按键值。
返回:
0x00 有按键(要用 getkey()函数读取)
注释: 键盘有 32 字节的按键缓冲区。键值必须用 getkey()函数读出
百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 24/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

R30、R50-M、R100 不支持该 API!

3.3.2 kbflush
原型: void kbflush()
功能: 清除当前键盘缓冲区中的所有未读取的按键。
输入参数: 无

输出参数: 无

返回: 无

注释: R30、R50-M、R100 不支持该 API!

3.3.3 getkey
原型: uchar getkey(void)
读取键盘缓冲区中的最前一个键值。如果缓冲区空,则等候到有按键输入为
功能:
止才退出并读出该键值。读取后,缓冲中就删除该键值。
输入参数: 无

输出参数: 无
读取的键值。键盘有 32 字节的按键缓冲区,缓冲区满时继续按
返回:
键,则此按键被丢弃。
R30、R50-M、R100 不支持该 API!
以下是 P80,P78,P90 键值的定义(在 POSAPI.H 中有此定义):
功能键[P90无KEYF1~ KEYF6键]:
KEYF1 0x01
KEYF2 0x02
KEYF3 0x03
KEYF4 0x04
KEYF5 0x09
KEYF6 0x0A
P58 没有进纸键

注释: ‘1’
: KEY1 0x31
‘2’
: KEY2 0x32
‘3’
: KEY3 0x33
‘4’
: KEY4 0x34
‘5’
: KEY5 0x35
‘6’
: KEY6 0x36
‘7’
: KEY7 0x37
‘8’
: KEY8 0x38
‘9’
: KEY9 0x39
‘0’
: KEY0 0x30

功能键: KEYFN 0x15


百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 25/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

菜单键: KEYMENU 0x14


字母键: KEYALPHA 0x07
‘▲’
: KEYUP 0x05
‘▼’
: KEYDOWN 0x06
取消键: KEYCANCEL 0x1B
退格键: KEYCLEAR 0x08
确认键: KEYENTER 0x0D
进纸键: KEYPRNUP 0x19
(通常该键不返回键值,只在设置进纸键为普通按键时有效)
以下是 R50 键值的定义(在 POSAPI.H 中有此定义)

功能键: KEYF1 0x01
KEYF2 0x02
KEYF3 0x03
KEYF4 0x04

3.3.4 kbmute
原型: void kbmute(uchar flag)
功能: 设置按键板在按键时是否发声
flag 0:不发声
输入参数:
非 0:发声

输出参数: 无

返回: 无

注释: R30、R50-M、R100 不支持该 API!

3.3.5 kbsound
原型: void kbsound(uchar mode,ushort dlytime)
功能: 控制在按键时蜂鸣器禁止或按指定的频率和间隔发声
Mode 模式选择 0:禁止发声 (dlytime 为任意值)
1:最低频率
输入参数: 7:最高频率
dlytime 间 隔 0xffff:按下后一直响,松开时才停止
时间(单位:ms) 0x0000:不发声
输出参数: 无

返回: 无

当 mode 取值大于 7 时,该函数会以 mode%8 为发声频率。


注释:
R30、R50-M、R100 不支持该 API!

3.3.6 GetString
原型: uchar GetString(uchar *str,uchar mode,uchar minlen,uchar maxlen)
功能: 多功能字符串输入,带光标。对于输入数字、字符方式,如果输入参数 str

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 26/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

中有合法内容并且 bit7 被设为 1,则会将其内容显示出来,用户可在其基


础上进行编辑。
mode:输入方式的 bit7 1(0):能(否)回车退出
定义(优先级顺序为 bit6 1(0):大(小)字体
bit3>bit4>bit5,且 bit5 1(0):能(否)输数字
mode&0x38不能等 bit4 1(0):能(否)输字符
于0) bit3 1(0):是(否)密码方式
bit2 1(0):左(右)对齐输入
输入参数: bit1 1(0):有(否)小数点
bit0 1(0):正(反)显示
Minlen 需要输入串的最小长度。
Maxlen 需要输入串的最大长度(最大允许值是 128 字节)。

str[0] 输入的长度。
str+1 存放输入字符串实际地址。
输出参数: 无
0x00 成功。
0xFE 参数值非法(包括 mode 值非法、minlen>maxlen、
返回: maxlen=0)
0xFF 用户取消操作(CANCEL 键按下)
0x0D 用户回车退出(ENTER 键按下)
输入的 STR 内容中须禁止含如:0X0A,0X0D 等不可见或控制字符,
否则显示乱。
注释:
该接口的输入超时会受 PEDINPUTTIMEOUT 接口的设置影响。
R50、R30、R50-M、R100 不支持该 API

举例 1:输入消费金额(大字符显示、最小字符数 0,最大字符数 10):


unsigned char buf[20];
unsigned long amt;

if(!GetString(buf, 0x26, 0, 10))//输入正确,amt 为输入金额


{
buf[buf[0]+1]=0;
amt=atol(buf+1);
}
else
{
//用户按下[取消]键
}

举例 2:输入柜员签到密码(大字符显示、最小字符数 4,最大字符数 6):


unsigned char pwd[10];// 以‘\0’结尾的正确柜员密码串
unsigned char buf[10];

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 27/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

if(!GetString(buf,0X68, 4, 6))
{
buf[buf[0]+1]=0;
if(!strcmp(pwd,buf))
{
//输入的签到密码正确
}
else
{
//输入的签到密码错误
}
}
else
{
//用户按下[取消]键
}

3.3.7 GetHzString
原型: uchar GetHzString(uchar *outstr, uchar max, ushort TimeOut)
功能: 具有联想功能的中文字符输入函数,也可输入英文和数字字符。
max 需要输入串的最大长度(最大允许值是 128 字节)。
输入参数:
Timeout 超时设定值(=0 表无超时,单位-秒)
输出参数: Outstr 存放输入字符串(以‘\0’结尾)。
0x00 成功。
0XFD 超时
返回:
0xFE 参数值非法
0xFF 用户取消操作(CANCEL 键按下)
使用方法:
 输入方法切换,按 F1 键可在“拼音汉字”,“大写字母”,
“小写字母”之间切换。
 输入中文,在“拼音汉字”的输入方式下,依次按下拼音
所在的数字键即可。比如输入“中”字,可输入“14664”,
然后用“确认”键选择“中”字即可。
 输入大写字母和数字,在“大写字母”的输入方式下,按
注释: 下你需要的字母或数字所在的按键,在 0.8 秒的时间内不停
按下同一按键,则输入的字符为该按键上显示的下一字符,
比如连续按下“1”键两次,输入的字符为“Q” 。
 输入小写字母和数字,在“小写字母”的输入方式下,按下
你需要的字母或数字所在的按键,在 0.8 秒的时间内不停按
下同一按键,则输入的字符为该按键上显示的下一字符,
比如连续按下“1”键 3 次,输入的字符为“z”。
R50、R30、R50-M、R100 不支持该 API
百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 28/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

3.3.8 kblight
原型: void kblight(uchar mode)
功能: 设置键盘背光(在有按键,刷卡,插卡时自动亮)
mode 0:临时关背光,待按键、划卡、插卡等操作点亮(效果与模式
1同)。
1:背光保持亮 1 分钟(在 1 分钟后,自动关闭)
输入参数:
2:背光常亮
3:背光常关闭,即使按键、划卡、插卡都不点亮
其它值无操作
输出参数: 无
返回: 无
系统默认为延时 60 秒亮方式(mode=1)。
注释:
P80、P78、R50、P58、R30、R50-M、R100 不支持该 API!

3.3.9 SetLightTime
原型: void SetLightTime(ushort LightTime)
功能: 设置屏幕背光以及键盘背光定时时间。
背光定时时间,单位为秒,系统默认为 60 秒。设置为 0 时无效,
输入参数: LightTime
仍然保持上次设置的值。
输出参数: 无

返回: 无
该函数设置的值对定时模式有效。所设置的时间对屏幕背光和键盘背光同
注释: 时有效。
P80、P78、R50、P58、R30、R50-M、R100 不支持该 API!

3.3.10 SetSlipFW
原型: void SetSlipFW(unsigned char mode)
功能: 设置走纸键的功能
mode 0:关闭走纸键功能,当按下走纸键后仅仅当做普通按键,不
进行走纸。
输入参数:
1:开启走纸键功能,当按住走纸键后开始走纸,不返回键
值,kbhit 和 getkey 等函数获取不到键值。(默认)

输出参数:

返回: 无
普通情况下建议设置模式为 1,在应用程序实现锁键盘时设置为模式 0,
注释: 开键盘后恢复为模式 1。
P80、P78、R50、P58、R30、R50-M、R100 不支持该 API!

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 29/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

3.4 屏幕操作函数

本模块内的所有 API 对 P90 、P80、R50、P78 部分适用,对 P58 均适用,对 R30、R50-M、


R100 均不适用。

模块功能说明:本模块是实现 LCD 屏幕相关操作 API,包括清屏、屏幕中字体的显示、


光标在屏幕中的定位、画点、画框、屏幕上打印文字信息等功能。

LCD 显示器的大小为 128 x 64 点阵,即横向 128 个点、纵向 64 个点。我们将屏幕分成


8 行[每一行占 8 个点高],这样屏幕可以显示 4 x 16 个大字符(8 x 16 点阵)或 4 x 8 个
汉字(16 x 16 点阵)或 8 x 21 个小字符(6 x 8 点阵)。每个大字符或汉字需占两行,小
字符则占一行。

软、硬字库采用 P80 V1.0 版本的字库[也可使用 P60V4.0 及 P70V1.0 硬字库],字库文


件的头 512 个字节为字库的参数[包含字库的版本信息及语种、字体的大小、编码信息等]。
字库存放在 FLASH 中。

字体的约定如下:

1) 小 ASCII 码[5 x 7],大 ASCII 码[8 x 16];


2) 对于扩展码为单字节的:小字[8 x 8]、大字[8 x 16];
3) 对于扩展码为双字节的:可选字体为 12 x 12 / 14 x 14 / 16 x 16。
模块内数据结构:无

3.4.1 ScrCls
原型: void ScrCls(void)
功能: 清除整个屏幕
输入参数: 无

输出参数: 无

返回: 无

执行该指令后,光标停在屏幕的左上角(0,0)
注释:
R30、R50-M、R100 不支持该 API!

3.4.2 ScrClrLine
原型: void ScrClrLine(uchar startline, uchar endline)
功能: 清除指定的一行或若干行,参数不合理时无动作
startline 起始行号(0~7).
输入参数:
Endline 结束行号(0~7).
输出参数: 无

返回: 无

执行该指令后,光标停在(0,startline),
注释: startline = 0,endline = 0 清除第 0 行。
startline = 1,endline = 5 清除第 1 行到第 5 行。
百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 30/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

startline = 0,endline = 9 清除第 0 行到第 7 行。


Startline>endline 或 Startline 与 endline 均非法时,不清除任何屏幕内
容。
R30、R50-M、R100 不支持该 API!

3.4.3 ScrGray
原型: void ScrGray(uchar mode)
功能: 设置显示屏幕的对比度.
mode 对比度级别[0~7,0 最暗,7 最亮],默认值为 4。其它值无
输入参数:
操作。
输出参数: 无

返回: 无

注释: R30、R50-M、R100 不支持该 API!

3.4.4 ScrBackLight
原型: void ScrBackLight(uchar mode)
功能: 设置屏幕背光(在有按键,刷卡,插卡时自动亮)
mode 0:关背光
1:背光保持亮 1 分钟(在 1 分钟后,自动关闭)
输入参数:
2:背光常亮
其它值无操作
输出参数: 无
返回: 无
系统默认为延时 1 分钟亮方式(mode=1) 。
注释:
R30、R50-M、R100 不支持该 API!

3.4.5 ScrGotoxy
原型: void ScrGotoxy (uchar x,uchar y)
功能: 将光标移到屏幕指定的位置
x 列标。屏幕的水平坐标(0<=x<=127)
输入参数:
y 行标。屏幕的垂直坐标(0<=y<=7)
输出参数: 无
返回: 无
若输入参数 x 或 y 超出范围,则对相应坐标取模。
注释:
R30、R50-M、R100 不支持该 API!

3.4.6 ScrFontSet
原型: uchar ScrFontSet(uchar fontsize)

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 31/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

功能: 设置显示字体。
fontsize 显示字符的大小。
0:ASCII 字符模式,ASCII 字符以 5x7 显示。
非 0:CFONT 汉字模式,汉字 16x16 ,ASCII 字符 8x16
输入参数:
显示。
注:P78,P90 只支持 0,1 两个数值,其他值为非法,会直
接返回
输出参数: 无
设定前的显示
返回:
字体
系统缺省字体大小为 CFONT,汉字模式
注释:
R30、R50-M、R100 不支持该 API!

3.4.7 ScrAttrSet
原型: uchar ScrAttrSet(uchar Attr)
功能: 设置显示属性,正常显示或反白显示.
attr attr - 属性值:
输入参数: 0:正常方式显示。
非 0:反白方式显示。
输出参数: 无

返回: 设置前显示属性

系统缺省属性为 0,正常方式显示
注释:
R30、R50-M、R100 不支持该 API!

3.4.8 Lcdprintf
原型: int Lcdprintf(const char *fmt,...)
功能: 在屏幕当前位置格式化显示字符串(同 P70,P60 中的 printf 功能)
输入参数: 无
输出参数: fmt 显示输出的字符串及格式
返回: 无
此函数为 ANSI C 标准输出函数,但有以下特点:
 在所有的控制字符中,只支持’\n’ ,其它则作为字符显示
 显示字符串长度超出屏幕,超出的部分将在下一行显示
注释:  要显示‘%’时,需要两个%号,即“%%”
 在 P80、P78、P90、R50、P58 应用中须用该接口替换所有
的 printf 接口名称,否则会出乱。
R30、R50-M、R100 不支持该 API!

举例:显示大、小字符和汉字
ScrCls();
ScrFontSet(ASCII);
Lcdprintf(“Pax Technology Ltd.”);
百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 32/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

ScrGotoxy(0, 2);
ScrFontSet(CFONT);
Lcdprintf(“百富科技有限公司\nAugust 2001\n”);
getkey();

3.4.9 ScrPrint
原型: void ScrPrint(uchar col,uchar row,uchar mode, char *str,...)
功能: 在屏幕当前位置格式化显示字符串
col 显示的起始点阵列号(0~127)
Row 显示的起始行号(0~7)
输入参数:
Mode 字体(ASCII[0x00]、CFONT[0x01])和属性(REVER[0x80]反显)

str 显示输出的字符串及格式
输出参数:

返回: 无
指定的字体、属性及坐标仅对本函数有效。要显示‘%’时,需要 2 个%
注释: 号,即“%%” 。若 MODE 值非法,均按正常、大字体显示。
R30、R50-M、R100 不支持该 API!

3.4.10 ScrPlot
原型: void ScrPlot(uchar X, uchar Y, uchar Color)
功能: 在屏幕指定位置画点。
X 指定的横坐标,点阵列(0~127)。
输入参数: Y 指定的纵坐标,点阵行(0~63)。
Color 指定动作,1:画点,0:擦点。

输出参数: 无
返回: 无
非法坐标时无动作。
注释: Color:非零即画点。
R30、R50-M、R100 不支持该 API!

3.4.11 ScrDrLogo
原型: void ScrDrLogo(uchar *logo)
功能: 将指定的点阵数据放到显示模块的缓冲区,适合显示 LOGO
输入参数: logo 要放入显示缓冲区 RAM 数据的指针
输出参数: 无
返回: 无
 图形数据的生成办法如下:
•画 LOGO:可以使用 Windows 中的“开始/程序/附件/画图”工具画图形,
注释:
图形的存盘要求为“单色、BMP 格式”;
•图形大小限制:最宽 128 个象素点、最高 64 个象素点;

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 33/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

•使用本公司提供的“图形转换工具”将该 BMP 图形文件转换成一个诸


如 Logo.h 的头文件[只包含一个数组]。
 生成的数组作为本函数的输入参数;
 如果图形高度或宽度超出 LCD 范围,将被截断;
 在显示 LOGO 之前,可用 ScrGotoxy()设置显示坐标。
 头文件中图形数组格式说明如下:
首字节[1Byte]:图形的行数[在 LCD 上最多显示 8 行];
第一行图形的字节数[2Bytes,高字节在前];
第一行图形的图形数据[一行图形的高度为 8 个点]; (与屏幕的 对应关系
可参考下面的描述)
第二行图形的字节数[2Bytes,高字节在前];
第二行图形的图形数据;
依次类推 ……
图形显示数据与屏幕坐标的对应规则:
假设(x,y)为当前屏幕坐标,buff[n]数组为图形显示数据,m 为 0–n 的
数,则:
buff[m].0 - buff[m].7 对应的屏幕显示坐标为(x+m,y) - (x+m,y+7)
buff[m].0 为 buff[m]的最底二进制位,buff[m].7 为 buff[m]的最高二进制位
如果相应的二进制位为 1,则画点,否则擦点。
R30、R50-M、R100 不支持该 API!

3.4.12 ScrDrLogoxy
原型: void ScrDrLogoxy(char x,char y,uchar *logo)
在指定的坐标处显示 LOGO,其图形点阵结构同上。
功能:
[能自动截取超出显示屏的图形点阵,便于动画显示]
x 指定的横坐标,点阵列(-128~127)。
输入参数: y 指定的纵坐标,点阵行(-64~63)。
logo 要放入显示缓冲区 RAM 数据的指针
输出参数 无
返回: 无
 由于该坐标可以取负值,故可以不用更改图形点阵,就能随意截取不
同部分的图形点阵。
注释:  如要显示屏的最左上端显示一个 64*32 点阵中最右下端的 32*16
点阵部分,则取(-32,-16)即可。
R30、R50-M、R100 不支持该 API!

3.4.13 ScrRestore
原型: uchar ScrRestore(uchar mode)
功能: 保存当前的屏幕显示内容或恢复上一次保存的屏幕显示内容
mode 0:保存
输入参数:
>=1:恢复
输出参数: 无

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 34/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

0x00 成功
返回:
其它值 失败(如恢复前没有保存内容)
[不保存与恢复图标显示]
注释:
R30、R50-M、R100 不支持该 API!

3.4.14 ScrSetIcon
原型: void ScrSetIcon(uchar icon_no,uchar mode)
功能: 在屏幕指定位置画点。
指定的图标号,定义如下:
#define ICON_PHONE 1 // phone 电话
#define ICON_SIGNAL 2 // wireless signal 信号
#define ICON_PRINTER 3 // printer 打印机
#define ICON_ICCARD 4 // smart card IC 卡
icon_no #define ICON_LOCK 5 // lock 锁
#define ICON_SPEAKER 6 // speaker 扬声器(P58、
P90 中该项为电池选项,但是宏定义
仍然为 ICON_SPEAKER。

#define ICON_UP 7 // up 向上
#define ICON_DOWN 8 // down 向下
输入参数:
指定动作, 1:点亮,0:熄灭。
#define CLOSEICON 0 // 关闭图标[针对所有图标]
#define OPENICON 1 // 显示图标[针对打印机、IC 卡、
锁、电池、向上、向下]
若需点亮摘机、挂机图标,则 action 的值设置如下:
mode #define OFFHOOKICON 1 // hook off 摘机
#define ONHOOKICON 2 // hook on 挂机
若需点亮信号图标,则 action 的值设置为:INITSIGNAL+[0,
5]
#define INITSIGNAL 1 // 初 始 信 号 强 度 [最 强 信 号 为
INITSIGNAL+5]
输出参数: 无
0x00 成功
返回:
其它值 失败(如恢复前没有保存内容)
 在 LCD 中共有 8 组图标,既电话、信号、打印机、IC 卡、锁、扬
声器、向上、向下,依次编号为 1~8。
 非法图标号时无动作
注释: [建议应用层只使用信号,UP,DOWN 图标]。
R30、R50-M、R100 不支持该 API!
关于 ICON_SPEAKER (P58、P90 中该项为电池选项,但是宏定义仍然为
ICON_SPEAKER。)
举例:点亮向下图标:
ScrSetIcon (ICON_DOWN, OPENICON);
熄灭向下图标:

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 35/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

ScrSetIcon (ICON_DOWN, CLOSEICON);


点亮摘机图标:
ScrSetIcon (ICON_PHONE, OFFHOOKICON);
熄灭摘机图标:
ScrSetIcon (ICON_PHONE, CLOSEICON);
点亮信号图标[最强信号]:
ScrSetIcon (ICON_ SIGNAL, INITSIGNAL +5);
熄灭信号图标:
ScrSetIcon (ICON_ SIGNAL, CLOSEICON);

3.4.15 ScrDrawBox
void ScrDrawBox(unsigned char y1,unsigned char x1,unsigned char
原型:
y2,unsigned char x2)
功能: 在指定的坐标画矩形框。
y1 起点纵坐标,范围:0~7。
x1 起点横坐标,范围:0~21。
输入参数:
y2 终点纵坐标,范围:0~7。
x2 终点横坐标,范围:0~21。
输出参数: 无
返回: 无
所画矩形框对应于 128*64 点阵位置,横向线条起点 x1*6+1 终点
x2*6-1,纵向线条起点 y1*8+4 终点 y2*8-4。
注释:
x2-x1 必须不小于 5,y2-y1 必须不小于 2。
R30、R50-M、R100 不支持该 API!

3.4.16 ScrGotoxyEx
原型: void ScrGotoxyEx (int pixel_X, int pixel_Y)
功能: 定位 LCD 显示光标
pixel_X>=0:横坐标(单位:像素点)[0 - 127]
参数:
pixel_Y>=0:纵坐标(单位:像素点)[0 - 63]
返回: 无
参数错误时,不改变原坐标位置
注释: P58 支持该 API!
P78 及 P90 使用 S 字库时支持该函数

3.4.17 ScrGetxyEx
原型: void ScrGetxyEx(int *pixel_X, int *pixel_Y);
功能: 读取 LCD 当前的光标位置
pixel_X 指向横坐标的像素值
参数:
pixel_Y 指向纵坐标的像素值

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 36/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

返回: 无
P58 支持该 API!
注释:
P78 及 P90 使用 S 字库时支持该函数

3.4.18 ScrDrawRect
void ScrDrawRect(int left,int top, int right,int
原型:
bottom);
功能: 画矩形
坐标参数的单位:像素点
left:左
参数: Top:顶
right:右
bottom:底
返回: 无
仅 P58 支持该 API!
注释:
P78 及 P90 在使用 S 字库时支持该 API

3.4.19 ScrClrRect
原型: void ScrClrRect(int left,int top, int right,int bottom);
功能: 清除矩形内容
坐标参数的单位:像素点
left:左
参数: Top:顶
right:右
bottom:底
返回: 无
P58 支持该 API!
注释:
P78 及 P90 使用 S 字库时支持该 API。

3.4.20 ScrSpaceSet
原型: void ScrSpaceSet(int CharSpace, int LineSpace);
功能: 设置显示的行间距和字间距
CharSpace :字间距(单位:像素点)
参数:
LineSpace :行间距(单位:像素点
返回: 无
P58 支持该 API!
注释:
P78 及 P90 使用 S 字库时支持该 API

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 37/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

3.4.21 ScrGetLcdSize
原型: void ScrGetLcdSize(int *width, int *height);
功能: 读取 LCD 显示区域的大小
Width 指向最大显示宽度的值
参数:
Height 指向最大显示高度的值
返回: 无
P58 支持该 API!
注释:
P78 及 P90 使用 S 字库时支持该 API

3.4.22 ScrTextOut
void ScrTextOut(int pixel_X, int pixel_Y, unsigned char
原型:
*txt);
功能: 在指定的屏幕位置显示字符串
Pixel_X 横坐标的值[0-127](对于 P78,P90,横坐标值[-127~127])
参数: Pixel_Y 纵坐标的值[0-63](对于 P78,P90,纵坐标值[-64~64])
Txt 需要显示的字符串
返回: 无
P58 支持该 API!
注释: P78 及 P90 在使用 S 字库时支持该 API
参数非法时函数无动作直接返回

3.5 磁卡读卡器操作函数

本模块内的所有 API 对 P80、P78、P90、P58 均适用,对 R50、R30、R50-M、R100 不


适用!
模块功能说明:本模块是实现磁卡读卡器相关操作 API,详细描述了终端与磁卡的交互
功能。
模块内数据结构如下:
typedef struct{
unsigned char RetCode; /* 应用的处理结果 */
unsigned char track1[256]; /* 磁道 1 信息缓冲区 */
unsigned char track2[256]; /* 磁道 2 信息缓冲区 */
unsigned char track3[256]; /* 磁道 3 信息缓冲区 */
}ST_MAGCARD;

3.5.1 MagOpen
原型: void MagOpen(void)
功能: 打开磁卡阅读器
输入参数: 无
输出参数: 无
百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 38/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

返回: 无
读磁卡数据采用中断方式工作,一旦打开磁卡阅读器,即使不调用读取函
数,只要刷卡,磁头一样能读入磁卡数据,因此在不需要使用磁卡阅读器
注释:
时,最好将磁卡阅读器关闭。
R50、R30、R50-M、R100 不支持该 API

3.5.2 MagClose
原型: void MagClose(void)
功能: 关闭磁卡阅读器
输入参数: 无
输出参数: 无
返回: 无

注释: R50、R30、R50-M、R100 不支持该 API

3.5.3 MagReset
原型: void MagReset(void)
功能: 复位磁头,并清除磁卡缓冲区数据
输入参数: 无
输出参数: 无
返回: 无
在磁头已上电的情况下,该函数复位磁头,清除磁卡缓冲区数据;
在磁头没有上电的情况下,只清除磁卡缓冲区数据。为确保磁头读入的数
注释: 据是最新的数据,在循环检测是否刷卡之前,最好调用该函数一次,以清
除磁卡缓冲数据。
R50、R30、R50-M、R100 不支持该 API

举例:
unsigned char ucRet,Track2[80],Track3[120];

MagOpen();
ScrGotoxy(0,6);
printf(“请刷卡<<<”);
MagReset();
while(MagSwiped()!=0)
{
if(kbhit()==0)
{
if(getkey()==KEYCANCEL)
{
MagClose();
return USER_CANCEL; //用户取消
}
百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 39/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

}
}

3.5.4 MagSwiped
原型: uchar MagSwiped(void)
功能: 检查是否刷过卡
输入参数: 无
输出参数: 无
0x00 有刷卡
返回:
0xff 无刷卡
不管是否刷卡,该函数都会立即返回。
注释:
R50、R30、R50-M、R100 不支持该 API

3.5.5 MagRead
原型: uchar MagRead(uchar *Track1, uchar *Track2, uchar *Track3)
功能: 读取磁卡缓冲区的 1、2、3 磁道的数据
输入参数: 无
*Track1 存放 1 磁道数据的指针 [应用层缓冲区要设为 256]
输出参数: *Track2 存放 2 磁道数据的指针 [应用层缓冲区要设为 256]
*Track3 存放 3 磁道数据的指针 [应用层缓冲区要设为 256]
0x00 读卡错误
其它 bit0 = 1 正确读出 1 磁道数据
bit1 = 1 正确读出 2 磁道数据
返回: bit2 = 1 正确读出 3 磁道数据
bit4 = 1 1 磁道数据有校验错
bit5 = 1 2 磁道数据有校验错
bit6 = 1 3 磁道数据有校验错
 可以通过 GetLastError()函数来读取 errno 变量,可以判断字校验错
还是包校验错。具体表示如下:
errno 的 bit0 表示 1 磁道中有字校验错
errno 的 bit1 表示 2 磁道中有字校验错
errno 的 bit2 表示 3 磁道中有字校验错
errno 的 bit4 表示 1 磁道中有包校验错
errno 的 bit5 表示 2 磁道中有包校验错
注释: errno 的 bit6 表示 3 磁道中有包校验错
 与 MagSwiped 函数配合使用。如果不需要某磁道数据,可以将该
磁道对应的指针置为 NULL,这时将不会输出该磁道的数据。
一般读取符合 ISO7812 标准的磁卡时:
track1 的空间为 79 字节
track2 的空间为 40 字节
track3 的空间为 107 字节
R50、R30、R50-M、R100 不支持该 API

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 40/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

3.6 IC 卡读卡器操作函数

本模块内的所有 API 对 P80、P90、P78、R50、P58、R50-M、R100 均适用,对 R30 不


适用!
模块功能说明:本模块是实现 IC 卡读卡器相关操作 API,详细描述了终端与 IC 卡的交
互功能。
模块内数据结构如下:
发送数据结构:APDU_SEND。
typedef struct{
unsigned char Command[4]; /* CLA, INS, P1, P2 */
unsigned short Lc; /* 发送到 IC 卡的数据长度 */
unsigned char DataIn[512]; /* 发送到 IC 卡的数据 */
unsigned short Le; /* 期望返回数据的长度 */
}APDU_SEND;

接收数据结构:APDU_RESP。
typedef struct{
unsigned short LenOut; /* 实际从 IC 卡返回的数据长度 */
unsigned char DataOut[512]; /* 从 IC 卡返回的数据指针 */
unsigned char SWA; /* IC 卡状态字 1 */
unsigned char SWB; /* IC 卡状态字 2 */
}APDU_RESP;

3.6.1 IccInit
原型: uchar IccInit(uchar slot, uchar *ATR)
功能: 复位 IC 卡片,并返回卡片的复位应答内容。
slot slot - 需要初始化卡通道号
读取 EMV 接触式卡片:0x00-0x05
输入参数: 读取 ISO 接触式卡片:0x80-0x85
读取建设部城市通卡片:0x40-0x45
支持 PPS 协议:slot = slot | 0x20
ATR 卡片复位应答.(至少需要 32+1bytes 的空间)
输出参数:
其内容为长度(1 字节)+复位应答内容
0x00 初始化成功.
0x02 卡拔出
返回: 0x04 通道号错误
0x06 协议错误
其它 通信失败.

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 41/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

 PPS 协议可以使得终端和卡片的通信速度大大增加,但前题是卡片必
须支持 PPS 协议。
 IC 卡的 ATR 信息长度因卡而异,请参考所使用的 IC 卡资料,定义足
够的内存空间(最大长度不超过 33 字节).
 IC 卡通道号 slot 说明:
0 为半没式大卡座(用户卡)
1 为全没式大卡座(商户卡)[P90、R50、R50-M 无此卡座]
2、3、4、5 为 SAM 卡小卡座[P90 只有 2,3 通道,R50 只有 2、3、4
通道]
注:
1) 对于不同型号的机器,卡座的数量、种类可能会有差异,具体卡
座的编号,请参考所用机型的操作手册或咨询专业人员。
2) 对于 PPS 通信参数协商协议支持与否需要根据具体的卡片是否支
持来确定
3)对 SAM 卡的操作,仅保证某时刻一张有效,如果需要操作多张 SAM
卡,必须遵循一张一张的初始化(IccInit)-操作(IccIsoCommand)-关闭
的流程(IccClose)。
比如,使用 2 号通道和 3 号通道的 SAM 卡,正确流程如下:
IccInit( 0x82 );
IccIsoCommand( 0x82, ... );
IccClose( 0x82 );
...
注释: IccInit( 0x83 );
IccIsoCommand( 0x83, ... );
IccClose( 0x83 );
 只有复位卡片成功后,才可对卡片进行命令操作。
 详细的 IC 卡命令操作返回码如下,对于卡片复位,T=0 命令交换及
T=1 卡片命令交换产生的详细错误代码均可作为 0XFF 错误代码处理
(通信失败)。

0x00 成功
0x01 奇偶错误
0x02 无卡
0x03 其它错误
0x04 卡通道错误
0x05 数据长度错误
0x06 协议错误
0x07 没有初始化
0xFF 通信失败

卡片复位详细错误代码
0x31 正反向约定(TS)错误
0x32 复位校验(TCK)错误
0x33 复位等待超时
百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 42/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

0x34 TA1 错误
0X35 TA2 错误
0X36 TA3 错误
0x37 TB1 错误
0x38 TB2 错误
0x39 TB3 错误
0x3A TC1 错误
0x3B TC2 错误
0x3C TC3 错误
0x3D TD1 错误
0x3E TD2 错误
0x3F ATR 数据长度错误

T=0 卡片通信错误详细代码
0x41 等待卡片响应超时
0X42 重发错误
0X43 重收错误
0x44 字符奇偶错误
0X45 状态字节无效

T=1 卡片通信错误详细代码
0x11 字组等待超时(BWT)错误
0x12 字符等待超时(CWT)错误
0x13 异常(ABORT)通信错误
0x14 字组校验码(EDC)错误
0x15 同步通信错误
0x16 字符保护时间(EGT)错误
0x17 字组保护时间(BGT)错误
0x18 NAD 错误
0x19 PCB 错误
0x1A LEN 错误
0x1B IFSC 错误
0x1C IFSD 错误
0x1D 重收发错误字组多次错误
0x1E 字符奇偶错误
0x1F 无效的字组
R30 不支持该 API!

3.6.2 IccClose
原型: void IccClose(uchar slot)
功能: 关闭 IC 卡,对指定卡座中的卡片下电

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 43/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

slot slot - 卡通道号:


EMV 接触式卡片:0x00-0x05
输入参数: ISO 接触式卡片:0x80-0x85
建设部城市通卡片:0x40-0x45
支持 PPS 协议:0x20-0x25
输出参数: 无
返回: 0x00 有刷卡
其他非法值无动作.
注释:
R30 不支持该 API!

3.6.3 IccAutoResp
原型: void IccAutoResp(uchar slot,uchar autoresp)
功能: 设置 IccIsoCommand 函数是否自动发送 GET RESPONSE 指令.
slot slot - 卡通道号:
EMV 接触式卡片:0x00-0x05
ISO 接触式卡片:0x80-0x85
输入参数:
建设部城市通卡片:0x40-0x45
支持 PPS 协议:0x20-0x25
autoresp 标志:1 = 自动发送 0 = 不自动发送
输出参数: 无
返回: 无
系统的默认方式是自动发送 GET RESPONSE 指令.
注释:
R30 不支持该 API!

3.6.4 IccIsoCommand
uchar IccIsoCommand(uchar slot,APDU_SEND *ApduSend,
原型:
APDU_RESP *ApduRecv)
功能: IC 卡读写操作函数.该函数支持 IC 卡通用接口协议(T=0 及 T=1)
slot slot - 卡通道号:
EMV 接触式卡片:0x00-0x05
输入参数: ISO 接触式卡片:0x80-0x85
建设部城市通卡片:0x40-0x45
支持 PPS 协议:0x20-0x25
输出参数: 无
0x00 执行成功
0x01 通信超时
0x02 交易中卡被拨出
0x03 奇偶错误
返回:
0x04 选择通道错误
0x05 发送数据太长(LC)
0x06 卡片协议错误(不为 T=0 或 T=1)
0x07 没有复位卡片

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 44/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

0xff 不能通信或没上电。
APDU_SEND 的结构形式如下:
struct{
unsigned char Command[4];
unsigned int Lc;
unsigned char DataIn[512];
unsigned int Le;
};
其中 Command[] = {CLA,INS,P1,P2}。
Lc = DataIn 的长度。
DataIn = 要发送到 IC 卡的数据指针。
Le = 期望返回数据的长度。
APDU_RESP 的结构形式如下:
注释:
struct{
unsigned int LenOut;
unsigned char DataOut[512];
unsigned char SWA;
unsigned char SWB;
};
其中
LenOut = 实际从 IC 卡返回的数据长度。
DataOut = 从 IC 卡返回的数据指针。
SWA = 状态字节 1。
SWB = 状态字节 2。
R30 不支持该 API!

3.6.5 IccDetect
原型: uchar IccDetect(uchar slot)
检查指定的卡座内是否有卡,对于 0-1 卡座使用到位检测。对于 2-5 卡座
功能:
做上电复位。
slot slot - 卡通道号:
EMV 接触式卡片:0x00
输入参数: ISO 接触式卡片:0x80
建设部城市通卡片:0x40
支持 PPS 协议:0x20
输出参数: 无
0x00 有卡插入
返回:
0xff 没有卡插入
无论卡座是否有卡,该函数立即返回。
调用该函数判断是否有插卡事件的发生。
注释:
注:本接口只支持用户卡在位状态检测。
R30 不支持该 API!

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 45/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

3.7 射频卡读卡器操作函数

本模块内的所有 API 对 R50、R30、R50-M、R100 均适用;PiccLight 函数及 DesFire 相


关 API 不适用 P80;P78、P90、P58 均不适用!
模块功能说明:本模块是实现射频卡读卡器相关操作 API,详细描述了终端与射频卡的
交互功能。
模块内数据结构如下:
typedef struct
{
uchar drv_ver[5]; //驱动程序的版本信息,如:“1.01A”;只能读取,写入无效
uchar drv_date[12]; // 驱动程序的日期信息,如: “2006.08.25”; 只能读取,写入无

uchar a_conduct_w; //A 型卡输出电导写入允许:1--允许,其它值--不允许,
该值不可读
uchar a_conduct_val; // A 型卡输出电导控制变量,有效范围 0~63,超出时视为 63
缺省值为 63;a_conduct_w=1 时才有效,否则该值在驱动内部不
作改变用于调节驱动 A 型卡的输出功率,由此能调节其最大感应
距离
uchar m_conduct_w; //M1 卡输出电导写入允许:1--允许,其它值--不允许,该值不可

uchar m_conduct_val; // M1 卡输出电导控制变量,有效范围 0~63,超出时视为 63;
缺省值为 63;m_conduct_w=1 时才有效,否则该值在驱动内部
不作改变,用于调节驱动 M1 卡的输出功率,由此能调节其最大
感应距离
uchar b_modulate_w; // B 型卡调制指数写入允许:1--允许,其它值—不允许,该值不
可读
uchar b_modulate_val; // B 型卡调制指数控制变量,有效范围 0~63,超出时视为 63
R50 缺省值为 0x04;R30 缺省值为 0x1b;b_modulate_w=1 时才
有效,否则该值在驱动内部不作改变,用于调节驱动 B 型卡的
调制指数,由此能调节其最大感应距离
uchar wait_retry_limit_w; // S(WTX)响应发送次数写入允许:1--允许,其它值--不允
许,该值不可读(仅用于 P80)
ushort wait_retry_limit_val; // S(WTX)响应发送次数最大值,默认为 3;
uchar card_buffer_w; //卡片接收缓冲区大小写入允许:1--允许,其它值--不允许
ushort card_buffer_val; //卡片接收缓冲区大小参数(单位:字节),有效值 1~256。
大于 256 时,将以 256 写入;设为 0 时,将不会写入。
卡片接收缓冲区大小直接决定了终端向卡片发送一个命令串
时是否需启动分包发送、以及各个分包的最大包大小。若待
发送的命令串大于卡片接收缓冲区大小,则需将它切割成小
包后,连续逐次发送。在 PiccDetect( )函数执行过程中,卡片
接收缓冲区大小之参数由卡片报告给终端,一般无需更改此
值。但对于非标准卡,可能需要重设此参数值,以保证传输 有
效进行。

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 46/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

uchar card_type_check_w; //卡片类型检查写入允许:1--允许, 其它值--不允许


该值不可读
uchar card_type_check_val; // 0--检查卡片类型,其他--不检查卡片类型(默认为检查卡
片类型)
uchar card_RxThreshold_w; //卡片接收灵敏度写入允许:1--允许, 其它值--不允许
该值不可读
uchar card_RxThreshold_val;//卡片接收灵敏度
uchar f_modulate_w; // felica 调制深度写入允许:1--允许, 其它值--不允许
该值不可读
uchar f_modulate_val; //felica 调制深度
uchar reserved[88]; // 保留字节,用于将来扩展;写入时应全清零
}PICC_PARA;
typedef struct
{
unsigned char drv_ver[5]; //驱动程序的版本信息,如:"1.01A";只能读取,写入无效
unsigned char drv_date[12]; // 驱动程序的日期信息,如:"2006.08.25"; 只能读取
unsigned char a_conduct_w; //A 型卡输出电导写入允许:1--允许,其它值-不允许
unsigned char a_conduct_val; // A 型卡输出电导控制变量,有效范围 0~63,超出时
视为 63
//a_conduct_w=1 时才有效,否则该值在驱动内部不作改变//用于调节驱动 A 型卡的
输出功率,由此能调节其最大感应距离
unsigned char m_conduct_w; //M1 卡输出电导写入允许:1--允许,其它值-不允许
unsigned char m_conduct_val; // M1 卡输出电导控制变量,有效范围 0~63,超出时
视为 63
//m_conduct_w=1 时才有效,否则该值在驱动内部不作改变 //用于调节驱动 M1 卡
的输出功率,由此能调节其最大感应距离
unsigned char b_modulate_w; // B 型卡调制指数写入允许:1--允许,其它值-不允

unsigned char b_modulate_val; // B 型卡调制指数控制变量,有效范围 0~63,超出时
视为 63
// b_modulate_w=1 时才有效,否则该值在驱动内部不作改变,用于调节驱动 B 型卡
的调制指数,由此能调节其最大感应距离
unsigned char card_buffer_w; //卡片接收缓冲区大小写入允许:1--允许,其它值-
不允许
unsigned short card_buffer_val; //卡片接收缓冲区大小参数(单位:字节) ,有效值
1~256。
//大于 256 时,将以 256 写入;设为 0 时,将不会写入。
//卡片接收缓冲区大小直接决定了终端向卡片发送一个命令串时是否需启动分包发
送、以及各个分包的最大包大小。若待发送的命令串大于卡片接收缓冲区大小,则需将它切
割成小包后,连续逐次发送
//在 PiccDetect( )函数执行过程中,卡片接收缓冲区大小之参数由卡片报告给终端,
一般无需更改此值。但对于非标准卡,可能需要重设此参数值,以保证传输有效进行
unsigned char wait_retry_limit_w;// S(WTX)响应发送次数写入允许:1--允许,其
它值-不允许 (暂不适用)

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 47/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

unsigned short wait_retry_limit_val;//S(WTX)响应最大重试次数, 默认值为 3(暂不


适用)
// 20080617
unsigned char card_type_check_w; // 卡片类型检查写入允许:1--允许,其它值--
不允许,主要用于避免因卡片不规范引起的问题
unsigned char card_type_check_val; // 0-检查卡片类型,其他-不检查卡片类型(默
认为检查卡片类型)
//2009-10-30
unsigned char card_RxThreshold_w; //接收灵敏度检查写入允许:1--允许,其它值
--不允许,主要用于避免因卡片不规范引起的问题
unsigned char card_RxThreshold_val;//天线参数为 5 个字节时,为 A 卡和 B 卡的接
收灵敏度,天线参数为 7 个字节时为 B 卡接收灵敏度
//2009-11-20
unsigned char f_modulate_w; // felica 调制指数写入允许
unsigned char f_modulate_val;//felica 调制指数

//add by wls 2011.05.17


unsigned char a_modulate_w; // A 卡调制指数写入允许:1--允许,其它值-不允许
unsigned char a_modulate_val; // A 卡调制指数控制变量,有效范围 0~63,超出时视
为 63

//add by wls 2011.05.17


unsigned char a_card_RxThreshold_w; //接收灵敏度检查写入允许:1--允许,其它
值--不允许
unsigned char a_card_RxThreshold_val;//A 卡接收灵敏度

//add by liubo 2011.10.25, 针对 A,B 和 C 卡的天线增益


unsigned char a_card_antenna_gain_w;
unsigned char a_card_antenna_gain_val;

unsigned char b_card_antenna_gain_w;


unsigned char b_card_antenna_gain_val;

unsigned char f_card_antenna_gain_w;


unsigned char f_card_antenna_gain_val;

//added by liubo 2011.10.25,针对 Felica 的接收灵敏度


unsigned char f_card_RxThreshold_w;
unsigned char f_card_RxThreshold_val;

unsigned char reserved[76]; //保留字节,用于将来扩展;写入时应全清零

}PICC_PARA;
注意,目前此结构体只适用于 R50 增强版 ,其他机型使用原结构体不变!

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 48/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

模块操作函数返回值列表:
返回值 含义
0x01 参数错误
0x02 射频模块未开启
0x13 卡片未激活
0x14 多卡冲突
0x15 超时无响应
0x16 协议错误
0x17 通信传输错误
0x18 M1 卡认证失败
0x19 扇区未认证
0x1A 数值块数据格式有误,或 DesFire 卡片操作中文件大小错误
0x1B 卡片仍在感应区内
0x1C 卡片状态错误(如 A/B 卡调用 M1 卡接口, 或 M1 卡调用 PiccIsoCommand 接口)
0x1F DesFire 卡片的应答数据错误
0x21 DesFire 卡片操作中应用缓冲区空间不足
0x25 DesFire 卡片应答数据 DES 运算结果不一致
0x26 操作不允许, 例如当前所选文件不是记录文件时,不能执行读记录操作。
0xff 接口芯片不存在或异常
其他 与具体 API 函数有关

3.7.1 PiccOpen
原型: uchar PiccOpen(void)
功能: 对非接触卡模块上电和复位,检查复位后模块初始状态是否正常。
输入参数: 无
输出参数: 无
0x00 成功
返回:
其他 异常错误,1 和 2 表示超时错误
 POS 开机后,非接触卡模块处于缺省的下电不工作状态。在每
次非接触卡交易前应调用该函数一次。
 若感应区内有非接触卡,则调用该函数也会使感应区内的卡复
位。
注释:
 若不调用该函数,则调用 PiccClose( )之外的其它非接触卡函数
均会失败。
 当接触卡模块未安装或出现故障时,调用该函数才会失败。
P78、P90、P58 不支持该 API!
例子:
char tmpc;

tmpc=PiccOpen( );
百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 49/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

if(tmpc)return 1;

3.7.2 PiccSetup
原型: uchar PiccSetup (uchar mode, PICC_PARA *picc_para)
功能: 写入指定的参数,用以适应较特殊的应用环境;或者读取当前的参数设置
mode 用于指定参数设置模式:’r’或‘R’
,表示读取;’w’或‘W’

输入参数: 表示写入。
picc_para 指向参数设置的结构指针。
输出参数: 无
0 成功
1 参数错误(无效的 mode 参数)
返回: 2 模块未开启
0xff 非接触卡模块不存在或异常
其他值 异常错误,目前暂无其它值。
 该接口只有在 PiccOpen()函数之后,PiccDetect()函数之前调用才有效
 PiccOpen()函数调用之后,所有参数将恢复成默认值.
 PICC_PARA 结构主要参数说明如下:
1. 每个可设置的参数均由 xx_w 及 xx_val 组成,例如: m_conduct_w 与
m_conduct_val; xx_w 表明是否写入 xx_val 的值, 只有在 xx_w = 1 时, xx_val
的值才会进行设置.
2.参数 xx_w 为应用控制信息,不可读。
3. a_conduct_val, m_conduct_val, b_modulate_val:这几个参数用于
调节射频卡模块的调制参数, 与读卡距离及读卡性能有关. 一般情况
下, 不需要设置. 若确需修改, 请咨询相关技术支持人员.
4. card_buffer_val: 用于修改卡片可接收最大帧长度. 部分情况下,卡
片回送给终端的最大帧长度不规范,导致卡片不能正确处理较长的数据
注释: 帧, 此时可以通过设置该参数避免错误.
5. wait_retry_limit_val:用于限制终端帧数据重发次数, 仅在 P80 下
有效。其他机型中, wait_retry_limit_val 按 0 处理, 不限制重发次数.
6. card_type_check_val: 用于设置是否按照 TypeA 及 MifareOne 规范
进行卡片类型判断. 部分卡片在回送给终端的数据信息中会出现不规范
的卡片类型值(如 M 卡却返回’A’类型). 默认情况下会执行卡片格式检
查.
7. card_RxThreshold_val: 用于设置卡片的接收灵敏度,与读卡性能有
关。一般情况下,不需要设置。若确需修改,请咨询相关技术支持人员。
8. f_modulate_val: 用于调节 Felica 卡的调节深度,与读卡距离及读
卡性能有关。一般情况下,不需要设置。若确需修改,请咨询相关技术
支持人员。
P78、P90、P58 不支持该 API!

例子 1:改变缺省参数设置(只修改 B 型卡的调制指数)
char tmpc;

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 50/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

PICC_PARA picc_para;

tmpc=PiccOpen();
if(tmpc)return 1;

memset(&picc_para,0x00,sizeof(PICC_PARA));
picc_para.b_modulate_w=1;
picc_para.b_modulate_val=3;
picc_para.card_buffer_w=1;
picc_para.card_buffer_val=64;
tmpc=PiccSetup(‘w’, &picc_para);
if(tmpc)return 2;

例子 2:读取当前的参数设置内容
char tmpc;
PICC_PARA picc_para;

tmpc=PiccOpen();
if(tmpc)return 1;

tmpc=PiccSetup(‘r’, &picc_para);
if(tmpc)return 2;

3.7.3 PiccDetect
uchar PiccDetect(uchar Mode,uchar *CardType,uchar *SerialInfo,uchar
原型:
*CID,uchar *Other)
功能: 按指定的模式搜寻 PICC 卡片;搜到卡片后,将其选中和激活。
Mode(用于 0 先搜寻 A 型卡一次,再搜寻 B 型卡一次;感应
指定卡片 区内不允许有多于 1 张的卡(包括 A 型卡和 B 型卡)
搜寻模式) 该模式是符合 VISA WAVE、Master PayPass 以
及中国银联规定的 PICC 卡片搜寻模式。
‘a’或‘A’ 只搜寻 A 型卡一次;感应区内不允许有多于 1
输入参数: 张的 A 型卡
‘b’或‘B’ 只搜寻 B 型卡一次;感应区内不允许有多于 1
张的 B 型卡
‘m’或‘M’ 只搜寻 M1 卡一次;感应区内不允许有多于 1
张的 M1 卡
其它值 保留

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 51/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

CardType  指向存取卡片类型字节缓冲区;目前均返回一字节的
类型值:
 ‘A’ —搜寻到 A 型卡
 ‘B’ —搜寻到 B 型卡
 ‘M’ —搜寻到 M1 卡
若不想输出卡片类型,可置 CardType 为 NULL。
在寻卡成功的情况下,Mode=0 时可能返回’A’或’B’; Mode=’a’
或 ’A’ 时 只 会 返 回 ’A’ ; Mode=’b’ 或 ’B’ 时 只 会 返 回 ’B’ ;
Mode=’m’或’M’时只会返回’M’。
SerialInfo 指向存取卡片序列号信息的缓冲区首址
该信息依次包含了序列号长度和序列号内容等两项内容。
B 型卡和 M1 卡的序列号均为 4 字节;A 型卡的序列号一般为 4
字节,也有 7 字节或 10 字节的。
输出参数: 采用字节 SerialInfo[0]指示序列号的长度,SerialInfo[1~9]保存序
列号(左对齐)。若需要读取序列号、且是 A 型卡,则要使用和
判断长度字节。
若不想输出序列号信息,可置 SerialInfo 为 NULL;否则应最少
分配 11 字节。
CID 指向存取卡片逻辑通道号的缓冲区,该通道号由驱动内部分配
和指定,取值范围为 0~14。
按照 ISO14443 的规定,感应区内最多可以有 15 张卡片供轮流
操作。
目前的搜寻模式下,仅允许感应区内存在一张卡,故 CID[0]总
是返回为 0x00, 且后续对应用传入的有效的 CID 值(0~14)均按
默认的 0x00 处理.
若不想输出通道号,可置 CID 为 NULL。

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 52/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

Other 指向存取详细错误代码、卡片响应信息等内容的缓冲区
Other[0] : 后续字节的长度
Other[1-2]:返回详细的错误代码(低字节在前);卡搜寻的过程
较为复杂,用此返回值来进行异常错误的准确定位
Other[3…]:
对于 A 型卡,返回: ATQA[2] + SAK1 + [SAK2] + [SAK3]+
ATS_Len + ATS; 其中, ATQA 2 字节, SAK 1 字节, 根据卡片序
列号的长短, 可能存在 SAK2, SAK3 信息, 均为一个字节.
ATS_Len 为 1 个字节. ATS 的长度由 ATS_Len 指定.
对于 B 型卡,返回卡片的 ATQB(Answer To Request B)信息,
其长度为 12 字节
对于 M1 卡,返回: ATQA[2] + SAK1
有关 ATS、ATQB、ATQA 的详细信息请查阅 ISO14443-3、
ISO14443-4 的相关部分。
Other[…299]:尾部的内容为保留字节,用于未来扩展;目前全
输出 0x00
若需要输出该信息, Other 指向的缓冲区大小至少应为 300 字节。
若不想输出该信息,可置 Other 为 NULL。
0 成功
1 参数错误(无效的 mode 参数)
2 模块未开启
返回: 3 未搜寻到卡片(感应区内无指定类型的卡片)

4 感应区内卡片过多(出现通讯冲突)
6 协议错误(卡片应答中出现违反协议规定的数据)
其他值 异常错误, 参考射频卡模块返回码说明部分
 若感应区内没有指定类型的卡片,该函数在搜寻一遍后将出错退出,
不会连续循环地搜寻;连续循环的搜寻过程由应用程序自己完成和
控制。
 A 型卡和 M1 卡在物理层上是相同的;A 型卡存在链路层和会话层,
M1 卡只存在链路层,它们在链路层上不完全相同。
注释:  在搜寻 A 型卡时若放入 M1 卡,会导致搜寻出错;反之,在搜寻 M1
卡时若放入 A 型卡,也会导致搜寻出错。
 调用该函数,可将感应区内的指定类型待机卡片唤醒和激活,之后,
卡片进入激活状态。对于处于已激活状态的卡片,再次调用该函数,
将返回失败,且卡片将转入停机状态。
P78、P90、P58 不支持该 API!

例子:搜寻 A 型卡和 B 型卡
char tmpc;

tmpc=PiccOpen();
if(tmpc)return 1;

ScrPrint(0,2,1, “PLS WAVE CARD…”);


百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 53/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

while(1)
{
tmpc=PiccDetect(0, NULL, NULL, NULL, NULL);
if(!tmpc)break;//Card has been detected successfully
if(tmpc!=3)
{
ScrPrint(0,2,1, “ FAILED TO DETECT CARD:%02X”,tmpc);
Beep();
DelayMs(500);
ScrClrLine(2,3);
ScrPrint(0,2,1, “PLS WAVE CARD…”);
}
If(!kbhit() && getkey()= =KEYCANCEL)return 2;
}//while(1), card detect loop

3.7.4 PiccIsoCommand
uchar PiccIsoCommand(uchar cid,APDU_SEND *ApduSend,APDU_RESP
原型:
*ApduRecv)
功能: 在指定的通道上,向卡片发送 APDU 格式的数据,并接收响应
cid 用于指定卡片逻辑通道号;该通道号由 PiccDetect( )的 CID 参
数项输出,其取值范围为 0~14,目前取值均为 0, 且对 1~14
输入参数:
的 cid 值统一按 0 处理。
*ApduSend 指向 APDU_SEND 的结构指针。
输出参数: *ApduRecv 指向 APDU_RESP 的结构指针。
0 成功
1 参数错误(无效的 mode 参数)
2 模块未开启
返回: 3 对应卡片未激活
4 传输错误(重试超限)
5 协议错误(卡片应答中出现违反协议规定的数据)
其他值 通讯出错, 参考射频卡模块返回码说明部分
 APDU_SEND和APDU_RESP的数据结构与IC卡读写函数接口中定
义的相同,,可参见该处。
注释:  在 PiccDetect( )调用成功后,才可以调用该函数;否则无法成功。
 ApduSend->Lc 应不大于 255,否则会返回参数错误。
P78、P90、P58 不支持该 API!

例子:
char tmpc;
APDU_SEND as;
APDU_RESP ar;

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 54/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

tmpc=PiccOpen();
if(tmpc)return 1;

ScrPrint(0,2,1, “PLS WAVE CARD…”);


while(1)
{
tmpc=PiccDetect(0, NULL, NULL, NULL, NULL);
if(!tmpc)break;//Card has been detected successfully
if(tmpc!=3)
{
ScrPrint(0,2,1, “ FAILED TO DETECT CARD:%02X”,tmpc);
Beep();
DelayMs(500);
ScrClrLine(2,3);
ScrPrint(0,2,1, “PLS WAVE CARD…”);
}
If(!kbhit() && getkey()= =KEYCANCEL)return 2;
}//while(1), card detect loop

ScrPrint(0,2,0x01,"SELECT PPSE...");
as.Command[0]=0x00;
as.Command[1]=0xa4;
as.Command[2]=0x04; //0x00--HANDLE,0x04-FNAME
as.Command[3]=0x00;
as.Lc=14; //2 for HANDLE,14 for FNAME
as.Le=256;
memcpy(as.DataIn,"\x3f\x00",2);
strcpy(as.DataIn,"1PAY.SYS.DDF01");//as card
//strcpy(as.DataIn,"2PAY.SYS.DDF01");//as standard
memset(ar.DataOut,0x00,512);

tmpc = PiccIsoCommand(0,&as,&ar);
if(tmpc)
{
ScrPrint(0,2,1,”FAILED TO SELECT PPSE:%02X”,tmpc);
return 3;
}

3.7.5 PiccRemove
原型: uchar PiccRemove(uchar mode,uchar cid)
依据指定的模式,向卡片发送停机指令;或者发送停机指令,还附加判断卡
功能:
片是否已经移开感应区。

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 55/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

mode(用于指 ‘h’或‘H’ 意为 HALT,仅向卡片发送停机指令后就退出;


定操作模式) 该过程不执行卡移开检测。
‘r’或‘R’ 意为 REMOVE,执行完整的卡移开流程(符合
PayPass 的规定),包括:向卡片发送停机指令、
输入参数: 再连续 3 次向卡片发送唤醒指令、最后退出;
通过执行该完整流程,可确定卡片是否移开感
应区。
cid PiccDetect( )调用中返回的卡片逻辑通道号,目前均为 0, 且对
1~14 的 cid 值统一按 0 处理.。
输出参数: 无
0 成功(‘R’模式时表示卡已移开;‘H’模式时表示通讯成功)
1 参数错误(无效的 mode 或 cid>14)
2 模块未开启
3 卡片未唤醒
返回: 4 传输错误(仅在‘H’模式时返回)
5 协议错误(仅在‘H’模式时返回)
6 卡片未移开感应区(数据链路畅通无错误,仅在‘R’模式时返
回)
其它值 异常错误, 参考射频卡模块返回码说明部分
 交易完成后,若对于卡片是否移开感应区无特别要求,可采用’H’
模式调用该函数;若需要确保卡片移开感应区以免重复扣帐,则需
采用’R’ 模式调用该函数,且当函数返回卡未移开时,应用程序
须重复调用该函数,或者报告错误后中止交易。
注释:
 若‘R’模式时返回“卡片未唤醒”错误,原因为未成功调用过
PiccDetect()或 PiccIsoCommand()调用时出现错误导致卡片被
停机,后一情况下可认为卡已移开。
P78、P90、P58 不支持该 API!

例子:
char tmpc;
APDU_SEND as;
APDU_RESP ar;

tmpc=PiccOpen();
if(tmpc)return 1;

ScrPrint(0,2,1, “PLS WAVE CARD…”);


while(1)
{
tmpc=PiccDetect(0, NULL, NULL, NULL, NULL);
if(!tmpc)break;//Card has been detected successfully
if(tmpc!=3)
{
ScrPrint(0,2,1, “ FAILED TO DETECT CARD:%02X”,tmpc);
百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 56/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

Beep();
DelayMs(500);
ScrClrLine(2,3);
ScrPrint(0,2,1, “PLS WAVE CARD…”);
}
If(!kbhit() && getkey()= =KEYCANCEL)return 2;
}//while(1), card detect loop

ScrPrint(0,2,0x01,"SELECT PPSE...");
as.Command[0]=0x00;
as.Command[1]=0xa4;
as.Command[2]=0x04; //0x00--HANDLE,0x04-FNAME
as.Command[3]=0x00;
as.Lc=14; //2 for HANDLE,14 for FNAME
as.Le=256;
memcpy(as.DataIn,"\x3f\x00",2);
strcpy(as.DataIn,"1PAY.SYS.DDF01");//as card
//strcpy(as.DataIn,"2PAY.SYS.DDF01");//as standard
memset(ar.DataOut,0x00,512);

tmpc = PiccIsoCommand(0,&as,&ar);
if(tmpc)
{
ScrPrint(0,2,1,”FAILED TO SELECT PPSE:%02X”,tmpc);
return 3;
}

while(2)
{
tmpc=PiccRemove(‘R’,0);
if(!tmpc)break;
if(tmpc>3)
{
Beep( );
ScrPrint(0,2,1,”PLS REMOVE CARD”);
DelayMs(500);
}
else
{
ScrPrint(0,2,1,”FAILED TO REMOVE:%02X”,tmpc);
getkey();
return 4;

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 57/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

}
}//while(2), card remove loop

3.7.6 PiccClose
原型: void PiccClose(void);
功能: 关闭非接触卡模块,使该模块处于停机状态
输入参数: 无
输出参数: 无
返回: 无
调用该函数后,非接触卡模块变成关闭状态,模块不再向外面辐射射频
载波。之后,除 PiccOpen( )外的所有其它调用均会失败。
注释: 建议:交易结束后, 调用该函数关闭射频卡模块,下次交易开始前再调用
PiccOpen()函数重新开启射频卡模块。
P78、P90、P58 不支持该 API!

例子:
char tmpc;
APDU_SEND as;
APDU_RESP ar;

tmpc=PiccOpen();
if(tmpc)return 1;

ScrPrint(0,2,1, “PLS WAVE CARD…”);


while(1)
{
tmpc=PiccDetect(0, NULL, NULL, NULL, NULL);
if(!tmpc)break;//Card has been detected successfully
if(tmpc!=3)
{
ScrPrint(0,2,1, “ FAILED TO DETECT CARD:%02X”,tmpc);
Beep();
DelayMs(500);
ScrClrLine(2,3);
ScrPrint(0,2,1, “PLS WAVE CARD…”);
}
If(!kbhit() && getkey()= =KEYCANCEL)return 2;
}//while(1), card detect loop

ScrPrint(0,2,0x01,"SELECT PPSE...");
as.Command[0]=0x00;
as.Command[1]=0xa4;

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 58/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

as.Command[2]=0x04; //0x00--HANDLE,0x04-FNAME
as.Command[3]=0x00;
as.Lc=14; //2 for HANDLE,14 for FNAME
as.Le=256;
memcpy(as.DataIn,"\x3f\x00",2);
strcpy(as.DataIn,"1PAY.SYS.DDF01");//as card
//strcpy(as.DataIn,"2PAY.SYS.DDF01");//as standard
memset(ar.DataOut,0x00,512);

tmpc = PiccIsoCommand(0,&as,&ar);
if(tmpc)
{
ScrPrint(0,2,1,”FAILED TO SELECT PPSE:%02X”,tmpc);
return 3;
}

while(2)
{
tmpc=PiccRemove(‘R’,0);
if(!tmpc)break;
if(tmpc>=3)
{
Beep( );
ScrPrint(0,2,1,”PLS REMOVE CARD”);
DelayMs(500);
}

3.7.7 M1Authority
原型: uchar M1Authority(uchar Type,uchar BlkNo,uchar *Pwd,uchar *SerialNo)
功能: 验证 M1 卡访问时读写相应块需要提交的 A 密码或 B 密码。
Type ’A’或’a’ 提交的是 A 密码
’B’或’b’ 提交的是 B 密码
BlkNo 用于指定访问的块号,对于 1K 容量的 M1 卡,其有效范围为
0~63。
输入参数:
Pwd 输入参数,指向提交的密码缓冲区。
SerialNo 输 入 参 数, 指向 存 放卡片 序 列 号的 缓冲 区 首址; 应 指向
PiccDetect( )调用返回的序列号信息 SerialInfo 中的序列号部
分,即 SerialInfo+1。
输出参数: 无
0 成功
返回:
1 参数错误(无效的 Type 值或空指针)
百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 59/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

2 模块未开启
3 卡片未唤醒
其它值 认证失败(卡移开或密码错误), 参考射频卡模块返回码说明
部分
 M1 卡依次以每四块组成一个扇区;每扇区的最后一块是控制块,存
放着 A 密码、B 密码以及各块的权限控制信息;A 密码和 B 密码均
为 6 字节,每块长度为 16 字节。4 个块的读写仅用两个 6 字节的密
码来保护,故其安全性不能比拟 CPU 卡。
注释:
 在 PiccDetect( ) 调用成功后,才能调用该函数。
 无效块号或密码错误时卡片将停机,需重新进行寻卡操作以唤醒卡
片。
P78、P90、P58 不支持该 API!

例子:验证 A 密码(准备读取块 4)
char tmpc,BlkNo,SerialInfo[11],PwdA[6],PwdB[6];

tmpc=PiccOpen();
if(tmpc)return 1;

ScrPrint(0,2,1, “PLS WAVE M1 CARD…”);


while(1)
{
//--to detect a M1 card
tmpc=PiccDetect(‘M’, NULL, SerialInfo, NULL, NULL);
if(!tmpc)break;//Card has been detected successfully
if(tmpc!=3)
{
ScrPrint(0,2,1, “ FAILED TO DETECT CARD:%02X”,tmpc);
Beep();
DelayMs(500);
ScrClrLine(2,3);
ScrPrint(0,2,1, “PLS WAVE CARD…”);
}
If(!kbhit() && getkey()= =KEYCANCEL)return 2;
}//while(1), card detect loop

ScrPrint(0,2,0x01,"AUTH PASSWORD A...");


BlkNo=4;
memcpy(PwdA,”\xff\xff\xff\xff\xff\xff”,6);
tmpc = M1Authority(‘A’, BlkNo,PwdA,SerialInfo+1);
if(tmpc)
{
ScrPrint(0,2,1,”FAILED TO AUTH A:%02X”,tmpc);
return 3;

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 60/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

}

3.7.8 M1ReadBlock
原型: uchar M1ReadBlock(uchar BlkNo,uchar *BlkValue);
功能: 读取 M1 卡指定块的内容(共 16 字节)。
BlkNo 用于指定访问的块号,对于 1K 容量的 M1 卡,其有效范围为
输入参数:
0~63。
输出参数: BlkValue 指向待存取块内容的缓冲区首址;该缓冲区至少应分配 16 字节。
0 成功
1 参数错误(空指针)
2 模块未开启
返回: 3 卡片未唤醒
4 访问条件不满足(密码未认证通过)
其它值 读取失败(卡片已移开或停机), 参考射频卡模块返回码说明部

 若访问条件不满足时,进行读卡操作,卡片将停机,需重新进行寻
卡操作以唤醒卡片。
 M1 卡中的钱包也是在一个块中按特定格式组成的,读余额就是通过
读取该钱包所在块来实现。钱包格式如下:
BALANCE[4] + ^balance[4] + BALANCE[4] +BLK_NO+
^blk_no+BLK_NO+ ^blk_no
注释: 其中,
BALANCE[4] ——4 字节的余额(低字节在前),在块中共存放两次
^balance[4] ——对余额各字节依次取反码的结果
BLK_NO——钱包所在块号;对于 1K 容量的 M1 卡,其有效范围为
0~63;在块中共存放两次
^blk_no——钱包所在块号的反码;在块中共存放两次
P78、P90、P58 不支持该 API!

例子:验证 A 密码后,读取块 4
char tmpc,BlkNo,SerialInfo[11],PwdA[6],PwdB[6],tmps[16];

tmpc=PiccOpen();
if(tmpc)return 1;

ScrPrint(0,2,1, “PLS WAVE M1 CARD…”);


while(1)
{
//--to detect a M1 card
tmpc=PiccDetect(‘M’, NULL, SerialInfo, NULL, NULL);
if(!tmpc)break;//Card has been detected successfully
if(tmpc!=3)

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 61/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

{
ScrPrint(0,2,1, “ FAILED TO DETECT CARD:%02X”,tmpc);
Beep();
DelayMs(500);
ScrClrLine(2,3);
ScrPrint(0,2,1, “PLS WAVE CARD…”);
}
If(!kbhit() && getkey()= =KEYCANCEL)return 2;
}//while(1), card detect loop

ScrPrint(0,2,0x01,"AUTH PASSWORD A...");


BlkNo=4;
memcpy(PwdA,”\xff\xff\xff\xff\xff\xff”,6);
tmpc = M1Authority(‘A’, BlkNo,PwdA,SerialInfo+1);
if(tmpc)
{
ScrPrint(0,2,1,”FAILED TO AUTH A:%02X”,tmpc);
return 3;
}

ScrPrint(0,2,0x01,"READ BLK %d...",BlkNo);


tmpc= M1ReadBlock(BlkNo,tmps);
if(tmpc)
{
ScrPrint(0,2,1,”FAILED TO READ:%02X”,tmpc);
return 4;
}

3.7.9 M1WriteBlock
原型: uchar M1WriteBlock (uchar BlkNo,uchar *BlkValue);
功能: 向 M1 卡指定块写入指定的内容(共 16 字节)

BlkNo 用于指定访问的块号,对于 1K 容量的 M1 卡,其有效范围为
输入参数:
0~63。
输出参数: BlkValue 指向待存取块内容的缓冲区首址。
0 成功
1 参数错误(空指针)
2 模块未开启
返回: 3 卡片未唤醒
4 访问条件不满足(密码未认证通过)
其它值 写入失败(卡片已移开或停机),参考射频卡模块返回码说明部

注释:  如果写入条件满足(相应密码已认证通过),则调用该函数可在指定

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 62/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

块写入 M1 卡持卡人信息(如卡号)、或写入钱包初始值、或其它流
水信息。
 卡个人化时,也采用该函数更新控制块;此时,应确保其中的 4 字
节块控制字含义及其校验位符合要求。有关控制块的结构和含义请
参阅 M1 卡相关文档。
 若访问条件不满足时,进行写卡操作,卡片将停机,需重新进行寻
卡操作以唤醒卡片。
P78、P90、P58 不支持该 API!

例子:验证 B 密码后,向块 4 写入一个钱包块


char tmpc,BlkNo,SerialInfo[11],PwdA[6],PwdB[6],tmps[16];

tmpc=PiccOpen();
if(tmpc)return 1;

ScrPrint(0,2,1, “PLS WAVE M1 CARD…”);


while(1)
{
//--to detect a M1 card
tmpc=PiccDetect(‘M’, NULL, SerialInfo, NULL, NULL);
if(!tmpc)break;//Card has been detected successfully
if(tmpc!=3)
{
ScrPrint(0,2,1, “ FAILED TO DETECT CARD:%02X”,tmpc);
Beep();
DelayMs(500);
ScrClrLine(2,3);
ScrPrint(0,2,1, “PLS WAVE CARD…”);
}
If(!kbhit() && getkey()= =KEYCANCEL)return 2;
}//while(1), card detect loop

ScrPrint(0,2,0x01,"AUTH PASSWORD B...");


BlkNo=4;
memcpy(PwdB,”\xff\xff\xff\xff\xff\xff”,6);
tmpc = M1Authority(‘B’, BlkNo,PwdB,SerialInfo+1);
if(tmpc)
{
ScrPrint(0,2,1,”FAILED TO AUTH B:%02X”,tmpc);
return 3;
}

ScrPrint(0,2,0x01,"WRITE BLK %d...",BlkNo);


//--to construct a purse with initial balance 1

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 63/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

memcpy(tmps,"\x01\x00\x00\x00”,4);
tmps[4]=~tmps[0];
tmps[5]=~tmps[1];
tmps[6]=~tmps[2];
tmps[7]=~tmps[3];
memcpy(tmps+8,tmps,4);
tmps[12]=tmps[14]=BlkNo;
tmps[13]=tmps[15]=~BlkNo;

tmpc= M1WriteBlock(BlkNo,tmps);
if(tmpc)
{
ScrPrint(0,2,1,”FAILED TO WRITE:%02X”,tmpc);
return 4;
}

3.7.10 M1Operate
uchar M1Operate(uchar Type,uchar BlkNo,uchar *Value,uchar
原型:
UpdateBlkNo);
功能: 对 M1 卡的钱包进行充值或减值操作,最终更新主用钱包或备份钱包。
Type(用于指 ‘+’ 充值,加号
定对钱包的 ‘—’ 减值,减号
操作类型)
‘>’ 转存/备份操作, 大于号
BlkNo 用于指定钱包所在块号,对于 1K 容量的 M1 卡,其有效范围
输入参数: 为 1~63。
Value 指向待充值或减值的金额数缓冲区首址;金额数共 4 字节,
低字节在前;此参数不允许为空。
UpdateBlkNo 指定操作结果最终写入到的块号。M1 卡中一般有主用和备份
两个钱包,用以支持钱包操作时异常掉电后的恢复。对主用
钱包的操作结果,一般写入到备用钱包中。
输出参数: 无
0 成功
1 参数错误(无效的 Type 值, 或空指针)
2 模块未开启
返回: 3 卡片未唤醒
4 访问条件不满足(密码未认证通过或钱包结构非法)
其它值 操作失败(卡片已移开或停机), 参考射频卡模块返回码说明
部分
若访问条件不满足时,进行充值/减值/转存操作,卡片将停机,需重新进
行寻卡操作以唤醒卡片。
注释:
进行转存操作时 Value 参数值无实际意义。
P78、P90、P58 不支持该 API!
百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 64/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

例子:验证 B 密码后,对块 4 的钱包块进行充值,结果保存到备用钱包块 5 中;最后


执行卡移出循环和模块关闭调用
char tmpc,BlkNo,SerialInfo[11],PwdA[6],PwdB[6],tmps[16];
ulong amount;

tmpc=PiccOpen();
if(tmpc)return 1;

ScrPrint(0,2,1, “PLS WAVE M1 CARD…”);


while(1)
{
//--to detect a M1 card
tmpc=PiccDetect(‘M’, NULL, SerialInfo, NULL, NULL);
if(!tmpc)break;//Card has been detected successfully
if(tmpc!=3)
{
ScrPrint(0,2,1, “ FAILED TO DETECT CARD:%02X”,tmpc);
Beep();
DelayMs(500);
ScrClrLine(2,3);
ScrPrint(0,2,1, “PLS WAVE CARD…”);
}
If(!kbhit() && getkey()= =KEYCANCEL)return 2;
}//while(1), card detect loop

ScrPrint(0,2,0x01,"AUTH PASSWORD B...");


BlkNo=4;
memcpy(PwdB,”\xff\xff\xff\xff\xff\xff”,6);
tmpc = M1Authority(‘B’, BlkNo,PwdB,SerialInfo+1);
if(tmpc)
{
ScrPrint(0,2,1,”FAILED TO AUTH B:%02X”,tmpc);
return 3;
}

ScrPrint(0,2,0x01,"ADD VALUE TO BLK %d...",BlkNo+1);


Amount=100;
tmps[0]=amount&0xff;
tmps[1]=(amount>>8)&0xff;
tmps[2]=(amount>>16)&0xff;
tmps[3]=(amount>>24)&0xff;
tmpc= M1Operate(‘+’, BlkNo, tmps, BlkNo+1);
if(tmpc)

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 65/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

{
ScrPrint(0,2,1,”FAILED TO ADD VALUE:%02X”,tmpc);
return 4;
}

while(2)
{
tmpc=PiccRemove(‘R’,0);
if(!tmpc)break;
if(tmpc>=3)
{
Beep( );
ScrPrint(0,2,1,”PLS REMOVE CARD”);
DelayMs(500);
}
else
{
ScrPrint(0,2,1,”FAILED TO REMOVE:%02X”,tmpc);
getkey();
return 4;
}
}//while(2), card remove loop

PiccClose( );
return 0;

3.7.11 PiccLight
原型: void PiccLight(uchar ucLedIndex,uchar ucOnOff);
功能: 控制 RF 模块的 4 个 LED 灯的点亮和熄灭状态
ucLedIndex 灯索引,每位代表一种颜色的灯
输入参数:
ucOnOff 点亮或熄灭标志 0 熄灭,非 0 点亮
输出参数: 无
返回: 无
ucLedIndex 各位取值如下:
BIT0:red
BIT1:green
BIT2:yellow
BIT3:blue
注释: BIT4~BIT7 保留
#define PICC_LED_RED 0x01
#define PICC_LED_GREEN 0x02
#define PICC_LED_YELLOW 0x04
#define PICC_LED_BLUE 0x08
P78、P90、P80、P58 不支持该 API!
百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 66/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

3.7.12 PiccInitFelica
原型: uchar PiccInitFelica(uchar ucRate, uchar ucPol);
功能: 初始化射频卡接口芯片为 FeliCa 调制编码方式
ucRate
设置与卡片交互的传输速率. 0-212Kbps,1-424Kbps

输入参数: 设置 FeliCa 调制方式。


ucPol
 0 为正向调制输出
 1 为反向调制输出
输出参数: 无
0x00 成功
0x02 模块未开启
返回:
0x26 接口芯片不支持 FeliCa 操作
0xff 接口芯片不存在或异常
ucRate(传输速率)取决于实际交互的卡片传输速率,ucPol(调制方式)默认
取正向调制输出;

ret=PiccOpen();//打开射频卡

memset(cmd,0,sizeof(cmd));
memset(Resp,0,sizeof(Resp));
//组装命令
cmd[0]=0x06;
cmd[1]=0x00;
cmd[2]=0xFF;
cmd[3]=0xFF;
cmd[4]=0x01;
cmd[5]=0x00;
slen=6;

PiccInitFelica(0, 0);//采用 212Kbps 速率,正向调制


注释:
memset(Resp,0,sizeof(Resp));
rlen=0;
ret=PiccCmdExchange(slen,cmd,&rlen,Resp);
if(ret==0x15)//无卡或者超时错误
{
continue;
}
else
{
if(ret==0 && rlen>0)
{
ScrPrint(0,0,0x01," READ CARD OK! ");
for(i=0;i<rlen-1;i++)
ScrPrint((i%8)*15,i/8+2,0,"%02X",Resp[i]);
Beep();
DelayMs(3000);
}
}

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 67/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

P78、P80、P90、P58、R30 不支持该 API!

3.7.13 PiccCmdExchange
uchar PiccCmdExchange(uint uiSendLen, uchar* paucInData, uint*
原型:
puiRecLen, uchar* paucOutData)
与卡片进行 APDU 数据交互,终端将 paucInData 中的数据直接发送给卡片,
功能:
并接收卡片的应答数据
uiSendLen 待发送的命令数据长度
输入参数:
paucInData 待发送的命令数据
输出参数: puiRecLen 接收到卡片的数据长度
输出参数: paucOutData 接收到的卡片数据
0x00 成功
返回:
其他 错误,参考返回值列表
注释: P78、P90、P58 不支持该 API!

3.8 打印机操作函数

本模块内的所有 API 对 P58 均适用,对 P80、P90、P78 部分适用,对 R50、R30、R50-M、


R100 不适用!
模块功能说明:本模块是实现打印机相关操作 API,主要包括打印字体设置、走纸、打印
LOGO、查询打印状态、设置边界等功能。
P78 采用的是针式打印机;P80、P90、P58 采用的是热敏打印机。
P78 的打印方法:在调用 打印初始化函数后,进行必要的打印控制设置,并使用打印字符
串函数将打印内容编排好,最后通过启动打印函数进行打印并在打印结束后返回打印状态。
另外也可通过查询打印状态函数进行查询。
打印机的缺省设置:
 字间距为 0、行间距 2;
 左边界为 0;
 字体默认为小字体。
打印特性如下:
 具有 9 个打印针头,可打印 6 X 8,8 X 16,16 X 16,7 X 9 等点阵字符信息,根据
每点阵行最大可打印 180 个点计算,即可每行最多可打印 11 个 16 X 16 汉字,22
个 8 X 16 大 ASCII 码字符,30 个 6 X 8 小写 ASCII 码;
 每页最多可打印 33 行小字符,19 行汉字/33 行韩文;
 若使用韩文字库,每行最多可打印 40 个小字符、20 个小韩文字/大字符、10 个大
韩文字;
 可打印 LOGO,但 LOGO 的最大宽度为 180 个点,超过则会截断;
 当数据包中数据有错误时,出错前的内容将如实打印,并于出错处打印出错标识
(▉) ;
 具有自动换行、换页功能;

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 68/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

 具有进、退纸键,方便用户进纸、退纸,可用于安装打印纸;
 进、退纸键同时按下时打印机将自动进纸,直至纸进到刀口位置。

P80、P90 的打印方法:在调用打印初始化函数后,进行必要的打印控制设置,并使用打
印字符串函数将打印内容编排好,最后通过启动打印函数进行打印并在打印结束后返回打印
状态。另外也可通过查询打印状态函数进行查询。
打印机的缺省设置:
 字间距为 0、行间距 0;
 热敏打印机的默认字体设置:12x24ASCII 码,24x24 汉字;
 如果使用新的打印字库,请应用程序务必把字间距设置为 2,行间距设置为 8
打印特性如下:
 打印点阵信息缓冲区:5000 点阵行,约 200 行 24x24 的汉字;
 基本字体[Width x Height]:8x16ASCII 字体,16x16 汉字字体,12x24ASCII 字体,
汉字字体;
 放大字体:每种基本字体皆可以纵向、横向、整体放大一倍,因此对每种基本字体,
都有三种放大字体,具体如下:
对于 8x16ASCII 字体:8x32、16x16、16x32;
对于 12x24ASCII 字体:12x48、24x24、24x48;
对于 16x16 汉字字体:16x32、32x16、32x32;
对于 24x24 汉字字体:24x48、48x24、48x48;
 容错处理:当数据包中有错误数据时,出错前的内容将如实打印,并于出错处打印
出错标识(▉▉▉) ;
 按以上定义,每行最多可打印 24 个 16x16 汉字、或 48 个 8x16ASCII 字符、或 32
个 12x24ASCII 字符、或 16 个 24x24 汉字;
 可打印 LOGO,但 LOGO 的每行宽度应不大于 384 个点,否则打印时超出部分将被
截断;
 自动换行功能:当一行字符所占列数大于 384 点时,自动加入换行指令,将多余部
分打印在下一行;
 具有手工进纸功能;
模块内数据结构: 无

3.8.1 PrnInit
原型: uchar PrnInit(void)
功能: 打印初始化
输入参数 无
输出参数: 无
0x00 命令执行成功
返回:
其它值 其他错误
P78 针式打印机 P80、P90 热敏打印机
在每次打印数据之前,应进行初始 在每次打印数据之前,应进行初始
注释: 化: 化:
①初始化时必须执行成功; ①初始化时必须执行成功;
②初始化时恢复打印机的缺省设置 ②初始化时恢复打印机的缺省设置

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 69/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

③Ascii 码、扩展码的缺省设置为
小字体;
④字间距的缺省设置为 0、行间距的
缺省设置为 2;
⑤打印机的左边界的缺省设置为 0
R50、R30、R50-M、R100 不支持该 API

3.8.2 PrnFontSet(P78)
原型: void PrnFontSet(uchar Ascii, uchar CFont)
功能: 设置打印的字体
Ascii Ascii 码的字体设置
0  小字体[8x8]
1  大字体[8x16]
其他值不改变原设置
输入参数:
CFont 扩展码的字体设置.
0  小字体[8x8]
1  大字体[8x16、16x16]
其他值不改变原设置
输出参数: 无
返回: 无

①设置后将一直有效,直至下次设置或调用 PrnInit();
注释: ②对于中文等文字,无论 Cfont 设为何值,打印出的都是大字体。
R50、R30、R50-M、R100 不支持该 API

3.8.3 PrnFontSet(P80、P90)
原型: void PrnFontSet(uchar Ascii, uchar CFont)
功能: 设置打印的字体
Ascii Ascii 码的字体设置
0  8x16 字体[基本]
1  12x24 字体[基本]
其他值不改变原设置
输入参数:
CFont 扩展码的字体设置.
0  16x16 字体[基本]
1  24x24 字体[基本]
其他值不改变原设置
输出参数: 无
返回: 无

①在对打印机有效设置后将一直有效,直至下次设置或调用 PrnInit();
注释:
②Ascii 码的打印字体皆默认为 12x24 字体、扩展码的打印字体皆默认为

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 70/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

24x24 字体;
③设置参数中只要存在一个或两个非法值,则该接口均会无操作并立即返回。
R50、R30、R50-M、R100 不支持该 API

3.8.4 PrnSpaceSet
原型: void PrnSpaceSet(uchar x, uchar y)
功能: 设置打印字间距、行间距
x 字间距[即 x*8 点]
输入参数:
y 行间距[点数]
输出参数: 无
返回: 无

P78 针式打印机 P80、P90 热敏打印机


①在对打印机有效设置后将一直有 ①在对打印机有效设置后将一直有
效 , 直 至 下 次 设 置 或 调 用 效 , 直 至 下 次 设 置 或 调 用
PrnInit(); PrnInit();
注释: ②打印机的默认字间距为 0; ②打印机的默认字间距为 0;
③打印机的默认行间距为 2 且小于 2 ③打印机的默认行间距为 0;
则自动设为 2; ④打印机行间距极大值为 255;
④打印机行间距极大值为 255; ⑤打印机的字间距极大值为 255;
⑤打印机的字间距极大值为 60;
R50、R30、R50-M、R100 不支持该 API

3.8.5 PrnStep
原型: void PrnStep(short pixel)
功能: 让打印机走纸 pixel 个像素点
输入参数: pixel 像素点个数

输出参数: 无
返回: 无
pixel 可以为正数或负数,正数为向前走纸;负数打印机并不退纸,而只
是倒退打印指针,这样可以在打印好的字符上再打印图形(比如印章等)
注释: 要实现图形重叠打印在字符串上,必须在打印图形后再调用 PrnStep(),
重新把打印指针指向打印字串的尾部,否则字串会被截断在图形结束后。
R50、R30、R50-M、R100 不支持该 API

3.8.6 PrnStr
原型: uchar PrnStr(char *str,...)
功能: 打印字符串
输入参数: str 打印字符串的指针.

输出参数: 无
返回: 0x00 命令执行成功
百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 71/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

0xfe 打印缓冲溢出或该函数的处理缓冲溢出

P78 针式打印机 P80、P90 热敏打印机


1)支持变参; 1)支持变参;
2)支持打印串中出现’\n’[换行]、 ’ 2 ) 支 持 打 印 串 中 出 现 ’\n’[ 换
\f’[换页]控制字符; 行]、’\f’[换页]控制字符;
3)如果打印数据包过长,则该函数 3)如果打印数据包过长,则该函数
的打印字符串将被截掉; 的打印字符串将被截掉;
注释:
4)如果打印字符串超出打印范围, 4)如果打印字符串超出打印范围,
将自动换行后继续打印; 将自动换行后继续打印;
5)打印‘%’时要在串中加 2 个‘%’
, 5)该函数最大处理缓冲区为 2048
即“%%”。 字节。
6)当前页满时将自动换页。
7)缓冲区最大为 2048 字节。
R50、R30、R50-M、R100 不支持该 API

3.8.7 PrnLogo
原型: uchar PrnLogo(uchar *logo)
功能: 打印图形
输入参数: logo 需打印的 logo 信息的指针.

输出参数: 无
0x00 命令执行成功
返回:
0xfe 打印缓冲溢出

P78 针式打印机 P80、P90 热敏打印机


①形数据的生成办法如下: ①形数据的生成办法如下:
 画 LOGO:可以使用 Windows 中 •画 LOGO:可以使用 Windows 中的
的“开始/程序/附件/画图”工 “开始/程序/附件/画图”工具画图
具画图形,图形的存盘要求为 形,图形的存盘要求为“单色、BMP
“单色、BMP 格式 ”; 格式”;
 使用本公司提供的“图形转换工 •使用本公司提供的“图形转换工具”
具”将该 BMP 图形文件转换成一 将该 BMP 图形文件转换成一个诸如
注释: 个诸如 Logo.h 的头文件[只包 Logo.h 的头文件[选择了多少个 BMP
含一个数组]; 文件,转换后在头文件中将包含相同
 打印机图形大小限制:最宽 180 个数的数组,数组名的定义与 BMP
个象素点,高度不限制; 文件名相关];
②生成的数组可直接作为本函数的 •打印机图形大小限制:最宽 384 个
输入参数; 象素点,高度不限制;
③如果图形的宽度超过打印机的限 ②生成的数组可直接作为本函数的
制,打印机将截去右边多余数据。 输入参数;
④如果打印数据包过长,则该函数的 ③如果图形的宽度超过打印机的限
LOGO 信息将被截掉; 制,打印机将截去右边多余数据。

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 72/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

⑤ 在 显 示 LOGO 之 前 , 可 用 ④如果打印数据包过长,则该函数的
PrnLeftIndent() 设 置 LOGO 打 印 位 LOGO 信息将被截掉;
置; 注:
⑥ 在 LOGO 显 示 完 毕 , 须 用 头文件中图形数组格式说明如下:
PrnLeftIndent()设置回LOGO打印前 首字节[1Byte]:图形的行数;
的位置 第一行图形的字节数[2Bytes,高字
注: 节在前];
头文件中图形数组格式说明如下: 第一行图形的图形数据[一行图形的
首字节[1Byte]:图形的行数; 高度为 8 个点];
第一行图形的字节数[2Bytes,高字 第二行图形的字节数[2Bytes,高字
节在前]; 节在前];
第一行图形的图形数据[一行图形的 第二行图形的图形数据;
高度为 8 个点]; 依次类推 ……
第二行图形的字节数[2Bytes,高字
节在前];
第二行图形的图形数据;
依次类推 ……
R50、R30、R50-M、R100 不支持该 API

3.8.8 PrnStart
原型: uchar PrnStart(void)
功能: 发送数据包给座机并启动打印机进行打印

输入参数:

输出参数: 无
0x00 成功
0x01 打印机忙
0x02 打印机缺纸
0x03 打印数据包格式错
0x04 打印机故障
返回:
0x08 打印机过热
0xf0 打印未完成
0xfc 打印机未装字库
0xfe 打印缓冲溢出
其它值 其它错误

P78 针式打印机 P80、P90 热敏打印机


①在调用该函数后,打印机将进行打 ①在调用该函数后,打印机将进行打
印,直到打印结束后才返回; 印,直到打印结束后才返回;
注释:
②在打印结束后,该函数会返回打印 ②在打印结束后,该函数会返回打印
状态,因此可不必再查询打印状 状态,因此可不必再查询打印状态;
态; ③如果打印机在成功完成打印任务
③如果打印机在成功完成打印任务 后,再次调用该函数,则会将单
百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 73/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

后,再次调用该函数,则会将单据 据重打一遍;
重打一遍;
④若想查询打印实时状态,请调用查
询打印状态函数。
⑤应用层控制打印机图标。
R50、R30、R50-M、R100 不支持该 API

3.8.9 PrnStatus
原型: uchar PrnStatus(void)
功能: 查询当前打印状态。

输入参数:

输出参数: 无
0x00 成功
0x01 打印机忙
0x02 打印机缺纸
0x03 打印数据包格式错
返回: 0x04 打印机故障
0x08 打印机过热
0xf0 打印未完成
0xfc 打印机未装字库
0xfe 打印缓冲溢出

P78 针式打印机 P80、P90 热敏打印机


①若状态为“打印机正忙”,应继续 无
查询;
注释: ②若状态为“打印成功”,则任务成
功完成;
③若为其它状态,则应报错并程序返
回。
R50、R30、R50-M、R100 不支持该 API

3.8.10 PrnLeftIndent
原型: void PrnLeftIndent(ushort Indent)
功能: 设置左边界
Indent 左边界设置,用于一些需要打印在打印纸右边的图形打印,
输入参数:
以此可以节省应用程序存储图形所花费的空间 (x::0 - 336)
输出参数: 无
返回: 无

注释: P78 针式打印机 P80、P90 热敏打印机


①若状态为“打印机正忙”
,应继续 默认边界为 0,本函数对打印 logo
百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 74/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

查询; 函数有效
②若状态为“打印成功”,则任务成
功完成;
③若为其它状态,则应报错并程序返
回。
R50、R30、R50-M、R100 不支持该 API

3.8.11 PrnGetDotLine
原型: int PrnGetDotLine(void)
功能: 取得当前已打印的点阵行,用于单据对齐
输入参数: 无
输出参数: 无
返回: 当前的点阵行数
P80 监控 V21 版及 posapi.a(v12)版以后版本才支持
注释:
P78、R50、R30、R50-M、R100 不支持该 API
例子:
PrnInit();
PrnSpaceSet(2,6);
PrnStr(“测试\n”); //占用 24 点阵行
x= PrnGetDotLine();
则 x 应该为:24 + 6 = 30 //6 为行间距

3.8.12 PrnSetGray(P80)
原型: void PrnSetGray(int Level)
功能: 设置打印黑度等级
Level Level =0 保留
Level =1 缺省黑度,即普通打印单
Level =2 保留
Level =3 双层热敏打印
输入参数: Level >3 保留
Level =[50~500] 黑度按照缺省黑度百分比进行设置,如 50
则把黑度设置为 level=3 的 50%,100-500
即把黑度设置为 level=3
其他值 保留并且更改无效
输出参数: 无
返回: 无
Level =3 时,黑度比 Level =1 会深 2.5 – 3 倍
注释:
P78、R50、R30、R50-M、R100 不支持该 API

3.8.13 PrnSetGray(P90)
原型: void PrnSetGray(int Level)

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 75/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

功能: 设置打印黑度等级
Level Level =0 保留
Level =1 缺省黑度,即普通打印单
Level =2 保留
Level =3 双层热敏打印
输入参数: Level =4 双层热敏打印,比 3 的黑度更高
Level =[50~500] 黑度按照缺省黑度百分比进行设置,如 50
则把黑度设置为默认值的 50%,500 则把
黑度设置为 500%
其他值 保留并且更改无效
输出参数: 无
返回: 无
Level =3 时,黑度比 Level =1 会深 2.5 – 3 倍
Level =4 时,黑度比 Level =1 会深 3.5 – 4 倍
当 Level=50~500 时,黑度为缺省黑度对应百分比,如 Level=50 则黑度为缺省
注释:
的一半,Level=100 则设置为默认,Level 设置为 300 等效于 Level=3,即都是
加大 3 倍黑度。
P78、R50、R30、R50-M、R100 不支持该 API

3.8.14 PrnGetFontDot
原型: int PrnGetFontDot(int FontSize, uchar *str, uchar *OutDot)
功能: 读取指定字符的打印点阵
FontSize 0 小字体(8x16 or 16x16)
输入参数: 1 大字体(12x24 of 24x24)
str 指向需求读取点阵的字符

OutDot( 返 回 返回的点阵占用空间大小:
读取到的点 8x16 16 bytes
输出参数: 阵信息) 16x16 32 bytes
12x24 48 bytes
24x24 72 bytes
返回: 无
<0:未安装打印字库
0:读取成功
注释:
该函数用于特定的环境下的需求
P78、R50、R30、R50-M、R100 不支持该 API

3.8.15 PrnDoubleWidth
原型: void PrnDoubleWidth(int AscDoubleWidth, int LocalDoubleWidth);
功能: 设置打印字体宽度,可实现双倍宽度打印
AscDoubleWidth 单内码字体(1:双倍宽度, 0:正常宽度)
参数:
LocalDoubleWidth 多内码字体(1:双倍宽度, 0:正常宽度
百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 76/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

返回: 无
P80、P78、R50、R30、R50-M、R100 不支持该 API
注释:
P90 在使用 S 字库时支持该函数

3.8.16 PrnDoubleHeight
原型: void PrnDoubleHeight(int AscDoubleHeight, int LocalDoubleHeight);
功能: 设置打印字体高度,可实现双倍高度打印
AscDoubleHeight 单内码字体(1:双倍高度, 0:正常高度)
参数:
LocalDoubleHeight 多内码字体(1:双倍高度, 0:正常高度)
返回: 无
P80、P78、R50、R30、R50-M、R100 不支持该 API
注释:
P90 在使用 S 字库时支持该函数

3.8.17 PrnAttrSet
原型: void PrnAttrSet(int Reverse);
功能: 设置反显打印,缺省为正常打印
参数: Reverse (1: 反显 , 0: 正常)
返回: 无
P80、P78、R50、R30、R50-M、R100 不支持该 API
注释:
P90 在使用 S 字库时支持该函数

3.9 通讯口操作函数

本模块内的所有 API 对 P80、P78、P90、P58、R30、R50-M、R100 均适用,其中 R50


硬 件 版 本 V04 及 以 前 只 有 一 个 串 口 ( COM1 ), 硬 件 版 本 V09 及 以 后 有 两 个 串 口
(COM1&COM2),其中 COM1 作程序下载及通讯用,COM2 作与外置 RF 模块通讯用!
P90 只有一个串口 COM1,当 P90 外接 Modem 的时候,就不能再对 COM1 进行操作,
否则导致 Modem 断线。
模块功能说明:本模块是实现串口通讯相关操作 API,主要包括打开串口、向串口写数
据、接收串口数据等功能。
模块内数据结构: 无

3.9.1 PortOpen
原型: uchar PortOpen(uchar channel, uchar *para)
功能: 打开指定的通讯口

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 77/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

Channel ( 通 通讯口逻辑编号
道号) 0  COM1
1  COM2
2  LANPORT
3  PINPAD
4  MODEM(通常为系统内部使用)
11  P_USB_DEV
输入参数: Para(通讯速 如, “9600,8,n,1”表示:波特率 9600BPS,8 个数据位,无
率和格式串) 校验,1 个停止位
波特率:600,1200,2400,4800,9600,14400,19200,28800,
57600,115200,230400 之一
数据位:7 或 8[R30 只支持 8 位数据位]
校验方式:o-奇校验;e-偶校验;n-无校验
停止位:1 或 2[R30 只支持 1 位停止位]
当端口号为 P_USB_DEV 时,无须关心此参数。
输出参数: 无
0x00 打开成功
0x02 非法通道号
返回: 0x05 无可用的物理端口
0xf0 MODEM 通道正被系统占用(仅针对 channel=MODEM)
0xfe 无效的通讯参数
P78、P80 的物理通讯端口有三个,其中,口一固定给 COM1 使用,口二和口
三通过此函数动态分配给其它逻辑口使用。当物理口二和口三正分配给两个
逻辑口使用时,打开其它的逻辑口,将会失败(0x05)。
P90 的物理通讯端口有三个,其中,口一固定给 COM1 使用,口二作为保留
端口,口三固定给无线模块使用。

P58 的物理通讯端口有三个,其中,口一固定给 MODEM 使用,口二固定给


COM1 使用,口三固定给 PINPAD。(其中 PINPAD 口不能以“7,E,1”的格式
注释:
打开)

R50 硬件版本 V04 及以前只有一个串口(COM1),硬件版本 V09 及以后有两


个串口(COM1&COM2) 。
R30、R100 只有一个物理通讯端口,逻辑端口号为 COM1(0) 。
R50-M 有三个物理串口,其中,COM1 作为程序下载通讯口,COM2 固定给
2.4G 模块使用,GPRS 使用。
R50 增强版有一个串口(COM1)及一个 USB DEVICE

3.9.2 PortClose
原型: uchar PortClose(uchar channel)
功能: 关闭指定的通讯口

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 78/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

Channel ( 通 通讯口逻辑编号
道号) 0  COM1
1  COM2
输入参数: 2  LANPORT
3  PINPAD
4  MODEM(通常为系统内部使用)
11  P_USB_DEV
输出参数: 无
0x00 关闭成功
0x02 非法通道号
0x03 通道未打开且未与任何物理端口连通
返回:
0x0e 通道关闭(只适用于 P_USB_DEV)
0xf0 MODEM 通道正被系统占用(仅针对 channel=MODEM)
0xff 发送缓冲区数据发送异常超时
若发送队列中尚有数据未发完,则关闭操作时会等候所有数据发完后才退出。
某通道关闭后,该通道与物理端口的连接仍然继续维持,不会立即被拆除和
切换掉,一直持续到再打开其它通道。
注释:
通讯口关闭失败无实际意义,只具有指示作用,底层在逻辑上对通道的关闭
总会是成功的。例如:发送缓冲区数据发送异常超时的情况下,该通道仍将
被关闭。

3.9.3 PortSend
原型: uchar PortSend(uchar channel, uchar ch)
功能: 使用指定的通信口发送一个字节的数据
Channel ( 通 通讯口逻辑编号
道号) 0  COM1
1  COM2
2  LANPORT
输入参数: 3  PINPAD
4  MODEM(通常为系统内部使用)
11  P_USB_DEV
ch 待发送的数据(一个字节)

输出参数: 无
0x00 发送成功
0x02 非法通道号
0x03 通道未打开
返回:
0x0e 通道关闭(只适用于 P_USB_DEV)
0xf0 MODEM 通道正被系统占用(仅针对 channel=MODEM)
0x04 发送缓冲区异常错误(持续 500ms 为满状态)
通讯发送缓冲为 8K 字节.
注释: R50 无发送缓冲区,发送大小取决应用需要发送的大小 R50 增强版发送缓冲
区为 16K

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 79/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

3.9.4 PortRecv
原型: uchar PortRecv(uchar channel, uchar *ch, ushort ms)
功能: 从指定的通讯口, 接收一个字节的数据.
Channel ( 通 通讯口逻辑编号
道号) 0  COM1
1  COM2
2  LANPORT
3  PINPAD
输入参数:
4  MODEM(通常为系统内部使用)
11  P_USB_DEV
ms 接收超时时间(毫秒)

ch 放接收到字符的指针.

输出参数: 无
0x00 接收字节成功
0x02 非法通道号
0x03 通道未打开
返回:
0x0e 通道关闭(只适用于 P_USB_DEV)
0xf0 MODEM 通道正被系统占用(仅针对 channel=MODEM)
0xff 接收失败(超时)
注释: 若接收超时设为 0,则当接收缓冲区为空时,立即返回接收失败(0xff)

3.9.5 PortReset
原型: uchar PortReset(uchar channel)
功能: 复位通讯口,该函数将清除串口接收缓冲区中的所有数据
Channel ( 通 通讯口逻辑编号
道号) 0  COM1
1  COM2
输入参数: 2  LANPORT
3  PINPAD
4  MODEM(通常为系统内部使用)
11  P_USB_DEV
输出参数: 无
0x00 复位成功
0x02 非法通道号
返回: 0x03 通道未打开
0x0e 通道关闭(只适用于 P_USB_DEV)
0xf0 MODEM 通道正被系统占用(仅针对 channel=MODEM)
注释: 该函数不会清除串口发送缓冲区中数据

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 80/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

3.9.6 PortSends
原型: uchar PortSends(uchar channel,uchar *str,ushort str_len)
功能: 使用指定的通讯口发送若干字节的数据
Channel ( 通 通讯口逻辑编号
道号) 0  COM1
1  COM2
2  LANPORT
3  PINPAD
输入参数:
4  MODEM(通常为系统内部使用)
11  P_USB_DEV
str 待发送的数据串指针

str_len 待发送数据串的字节数

输出参数: 无
0x00 发送成功
0x02 非法通道号
0x03 通道未打开
返回:
0x04 本次发送数据过长(若发送,将会导致当前发送缓冲区溢出)
0x0e 通道关闭(只适用于 P_USB_DEV)
0xf0 MODEM 通道正被系统占用(仅针对 channel=MODEM
通讯发送缓冲为 8K 字节, R50 增强版发送缓冲区为 16K。该函数在实现多字
注释:
节发送时,调用简便,操作速度快;可取代单字节的发送函数 PortSend ( )。

3.9.7 PortTxPoolCheck
原型: uchar PortTxPoolCheck(uchar channel)
功能: 检查指定通讯口的发送缓冲区是否已无数据待发送
Channel ( 通 通讯口逻辑编号
道号) 0  COM1
1  COM2
输入参数: 2  LANPORT
3  PINPAD
4  MODEM(通常为系统内部使用)
11  P_USB_DEV
输出参数: 无
0x00 发送缓冲区已空
0x01 发送缓冲区未空(尚余数据待发送)
返回:
0x02 非法通道号
0x03 通道未打开
0x0e 通道关闭(只适用于 P_USB_DEV)
注释: 、R30 的 PortTxPoolCheck 恒返回 0
R50(硬件第九版本之前)

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 81/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

3.9.8 PortRecvs
int PortRecvs(uchar channel,uchar *pszBuf,,ushort usRcvLen,ushort
原型:
usTimeOut)
功能: 使用指定的通讯口接收若干字节的数据
Channel ( 通 通讯口逻辑编号
道号) 0  COM1
11  P_USB_DEV
输入参数:
pszBuf 待接收数据串的缓冲区

usRcvLen 待接收数据串的字节数

usTimeOut 超时时间(MS)为单位

输出参数: 无
>=0 发送成功,返回发送的字节数
-2 非法通道号
返回: -3 通道未打开
-0xff 超时
-0x0e 通道关闭(只适用于 P_USB_DEV)
只适用于 R50 增强版。通讯串口 COM1 接收缓冲为 16K 字节,USB DEVICE 设备的
注释: 接收缓冲为 64K。该函数在实现多字节接收时,调用简便,操作速度快;可取代
单字节的接收函数 PortRecv ( )。

3.10 MODEM 通讯函数

本模块内的所有 API 对 P80、P78、P58、有外置 MODEM 的 R50(硬件第九版本之后)、


P90 均适用,对 R50(硬件第九版本之前)、R30、R50-M、R100 不适用!
模块功能说明:本模块是实现 MODEM 通讯相关操作 API,详细描述了 MODEM 通讯方式、
MODEM 拨号、MODEM 收发数据等功能。
模块内数据结构如下:
typedef struct{
unsigned char DP;
unsigned char CHDT;
unsigned char DT1;
unsigned char DT2;
unsigned char HT;
unsigned char WT;
unsigned char SSETUP;
unsigned char DTIMES;
unsigned char TimeOut; //(unit = 10 seconds, 0 – no timeout)
unsigned char AsMode;
}COMM_PARA;

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 82/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

在拨号之前应将该结构变量赋值。结构各项含义如下表:
表 3-1 COMM_PARA 结构变量含义说明
0x00 双音多频拨号
0x01 脉冲拨号方式 1(脉冲速率 10/s;断续比 1.6:1;号间间隔>=500ms)
DP
0x02 脉冲拨号方式 2(脉冲速率 10/s;断续比 2:1;号间间隔>=600ms)
其它值 保留
D0 = 0 检测拨号音
D0 = 1 不检测拨号音
D1 = 0 主叫拨号
D1 = 1 被叫/来铃应答
D2 = 0 检测并线电话占用(主叫拨号、非发号转人工接听方式时)
D2 =1 不检测并线电话占用(主叫拨号、非发号转人工接听方式时)
CHDT D5 = 0 被叫应用时采用 AT 状态报告接口
D5 = 1 被叫应用时采用 PAX 远程下载状态报告接口
D6 = 0 维持 SSETUP 之低三位表示的超时时长
D6 = 1 将 SSETUP 之低三位表示的超时时长加倍
D7 = 0 异步 2400bps 连接采用标准 ITU V.22bis 连接
D7= 1 异步 2400bps 连接采用非标准的 FastConnect 快速连接方式
其它位 保留
DT1 摘机后等候拨号音的最长时间(单位:100ms,最小值和缺省值为 20,有效
范围 20~255)
。在此期间,只要检测到拨号音,就退出等候。
拨外线时“,”等待时间(单位:100ms)。此值要根据实际应用环境的情况设
DT2
定,在应用程序中最好要留出手工设置的接口。 [范围 0~255]
HT 双音拨号单一号码保持时间(单位:1ms,有效范围 50~255)
WT 双音拨号两个号码之间的间隔时间(单位:10ms,有效范围 5~25)
通讯字节的设置
D7:异步同步选择
0 — 同步
1 — 异步
D6D5:设置波特率
00 — 1200
01 — 2400
10 — 9600
11 — 14400
SSETUP
D4D3:线路制式(应答音检测方式)
10 — BELL(仅适用于 1200BPS)
11 — CCITT
0X —CCITT
D2D1D0:等待应答音的超时时间(0~7)
000 为 5 秒
001 为 8 秒
010 为 11 秒
011 为 14 秒

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 83/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

100 为 17 秒
101 为 20 秒
110 为 23 秒
111 为 26 秒
循环拨号总次数(若为 0 则被转换成 1),拨完拨号串的所有号码为一次循环
DTIMES
[有效范围 1~255]
规定的时间内没有应用层数据交换,MODEM 则挂断。以 10 秒为单位,为 0
TimeOut
时无超时。最大值 65,即 650 秒。
异步通讯的速率(高 4 位)
、字符格式(低四位)
D3D2D1D0:
0 –“8,n,1”
1 –“8,e,1”
2 –“8,o,1”
3 –“7,n,1” 注:该格式所有使用 conexant modem 的
机型都不支持,但 P60S1、P70 可以支持。
4 –“7,e,1”
5 –“7,o,1”
8 – FSK 使用 B202 通信协议
9 – FSK 使用 V23C 通信协议
注:要使用 8、9 功能,SSETUP 最高位必须为 1(异步)
D7D6D5D4:
0 –由 SSETUP 的 D6D5 位决定
AsMode 1 –1200 bps
2 –2400 bps
3 –4800 bps
4 –7200 bps
5 –9600 bps
6 –12000 bps
7 –14400 bps
8 –19200 bps
9 –24000 bps
10 –26400 bps
11 –28800 bps
12 –31200 bps
13 –33600 bps
14 –48000 bps
15 –56000 bps
在异步通讯中,SSETUP 字段含有速率信息,AsMode 字段也可能含有速率信
息;当后者的高 4 位非 0 时,则只有后者的设定有效。在同步通讯中,只有
前者的设定有效(若设定为 14400BPS,则驱动程序自动调整为 1200BPS) ;
注释: 在异步通讯中,若所设速率超过当前 MODEM 所支持的最高速率,驱动程序
将自动限定到其所能支持的最高速率。
R50(硬件第九版本之前) 、R30、R50-M、R100 无 MODEM 模块,故不支持
该结构体

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 84/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

3.10.1 ModemReset
原型: uchar ModemReset(void)
功能: 清除异步通讯接收缓冲区的数据
输入参数: 无
输出参数: 无
0x00 复位成功
返回:
其他值 复位失败
在异步通讯中,清空当前接收缓冲区的数据。
注释:
,R30、R50-M、R100 不支持该 API
R50(硬件第九版本之前)

3.10.2 ModemDial
原型: uchar ModemDial(COMM_PARA *MPara, uchar *TelNo, uchar mode)
设置 modem 参数,同时拨号。等待拨号结果(mode=1)时,可以按“CANCEL”
功能:
键退出。
mode(是否立 0  立即返回(用于预拨号)
即返回标志) 1  等待拨号结果
TelNo 电话号码
输入参数:
mPara Modem 拨号参数,mPara==NULL 时,使用缺省参数拨号,
缺 省 拨 号 方 式 为 : 同 步 、 1200 、 DTMF 、 CCITT 方 式
("\x00\x00\x14\x0a\x46\x08\x02\x01\x06\x00")
输出参数: 无
0x00:成功
0x03:电话线未接好或并线电话占用 [线电压不为 0,但过低]
0x33:电话线未接[线电压为 0]
0x83:旁置电话、并线电话均空闲(仅用于发号转人工接听方式)
0x04:线路载波丢失(同步建链失败)
0x05:拨号无应答
0x06:已开始发号(仅用于发号转人工接听方式)
返回: 0x0a:正在拨号
0x0b:正常挂机和空闲
0x0c:接收数据请求被拒绝(接收缓冲区为空)
0x0d:被叫线路忙
(主 CPU)已无可用的通讯口(两个动态分配端口正全被其它通讯口使
0xf0:
用)
0xfd:CANCEL 键按下(Modem 将终止拨号操作)
其它:异常错误
电话号码中的代码含义:
0-9,*, #,A~D — 电话号码
, — 拨号延时
注释:
; — 传输下一个电话号码
. — 号码结束符,用于发号后继续连通应用
.. — 扩展的号码结束符,用于发号后转人工接听应用。
百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 85/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

此函数也可用来将 MODEM 设置为被叫方式。


电话图标由驱动程序控制。连接过程中,显示挂机状态的图标;连通后和挂
机后立即再拨的切换等候时间,显示摘机图标。
连通后,扬声器图标闪烁一定次数,表示实际连接速率。次数和速率的对应
关系与 AsMode 的高 4 位表示的数一致。
R50(硬件第九版本之前) 、R30、R50-M、R100 不支持该 API
P90 不支持同步“9600”拨号,不支持异步拨号。
举例:
一般的主叫拨号应用:
unsigned char ucRet;

OnHook();
CommPara. DP=0x00;
CommPara. CHDT=0x00;
CommPara. DT1=0x05;
CommPara. DT2=0x05;
CommPara. HT=0x64;
CommPara. WT=0x06;
CommPara. SSETUP=0x03;
CommPara. DTIMES=0x02;

while(1)
{
ucRet=ModemDial(&CommPara,“3546393.”,1);
if(ucRet == 0xfd) return USER_CANCEL //用户取消
if(ucRet == 0) break; //已拨通
if(ucRet==0x03)
{
//未接电话线
}
if(ucRet==0x0d)
{
//电话占线
}
//其他错误处理
}
如果使用缺省参数拨号,可去掉对 CommPara 参数的初始化语句,而直接采用
下面的语句:
ucRet=ModemDial(NULL,“3546393.”,1);
被叫应用:
OnHook();

CommPara. CHDT=0x02;//指定为被叫
CommPara. SSETUP=0x83;//异步

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 86/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

CommPara. AsMode=0x50;//9600BPS、8N1

ModemDial(&CommPara,“.”,1);

FSK 主叫拨号应用:
unsigned char ucRet;

OnHook();

CommPara.DP = 0;
CommPara.CHDT = 0; //可以根据实际需要选择 0、1
CommPara.DT1 = 20;
CommPara.DT2 = 10;
CommPara.HT = 70;
CommPara.WT = 5;
CommPara.SSETUP = 0x87;
CommPara.DTIMES = 1;
CommPara.TimeOut = 6;
CommPara.AsMode = 0x08; //可以根据实际需要选择 0x08、0x09
//选择 B202 用 0x08,V23C 用 0x09

while(1)
{
ucRet=ModemDial(&CommPara,“3546393.”,1);
if(ucRet == 0xfd) return USER_CANCEL //用户取消
if(ucRet == 0) break; //已拨通
if(ucRet==0x03)
{
//未接电话线
}
if(ucRet==0x0d)
{
//电话占线
}
//其他错误处理
}

FSK 不能直接使用默认参数。

FSK 被叫应用:
OnHook();

CommPara. CHDT=0x02;//指定为被叫
CommPara. SSETUP=0x87;//异步

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 87/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

CommPara. AsMode=0x08; //可以根据实际需要选择 0x08、0x09


//选择 B202 用 0x08,V23C 用 0x09
ModemDial(&CommPara,“.”,1);

3.10.3 ModemCheck
原型: uchar ModemCheck(void)
功能: 检测 MODEM 及电话线路的状态,该函数立即返回
输入参数: 无

输出参数: 无
0x00:成功
0x01:发送缓冲区满
0x02:旁置电话占用
0x03:电话线未接好或并线电话占用 [线电压不为 0,但过低]
0x33:电话线未接[线电压为 0]
0x83:旁置电话、并线电话均空闲(仅用于发号转人工接听方式)
0x04:线路载波丢失
0x05:拨号无应答
返回: 0x06:已开始发号(仅用于发号转人工接听方式)
0x08:接收缓冲区非空(接收到远端数据)
0x09:发送缓冲区满和接收缓冲区非空
0x0a:正在拨号
0x0b:正常挂机和空闲
0x0d:被叫线路忙
(主 CPU)已无可用的通讯口(两个动态分配端口正全被其它通讯口使
0xf0:
用)
其它:异常错误码
预拨号后,用此函数来检测预拨号是否已经拨通。
异常错误码是出于完备性和可维护性而制定的代码,实际正常应用中
出现频率较少,应用中一般无需关心其含义,出错处理时显示其代码值即可。
主叫拨号时,异常错误码的取值范围是 0xD0—0xEF(同步/异步拨号连
接失败) 、0x10—0x13(同步链路握手失败),拨号中的异常错误导致拨号过程
自动中断。较常见代码含义如下:
D0--给 MODEM 的第一条 AT 指令发送不出去或发送后未收到 MODEM 应答,
一般原因为与 MODEM 的通讯通路有硬件故障或 MODEM 模块硬件故障;
注释:
若上电时 MODEM 初始化不通过,则拨号时会出现此错误。
E8--MODEM 模块报告无拨号音,一般原因为 MODEM 模块有硬件故障或拨
号过程中主叫电话线被突然拔掉。
EF--MODEM 模块报告拨号异常故障,一般原因为 MODEM 模块有硬件故障
或拨号线为数字线。
同步通讯时,异常错误码的取值范围是 0x14—0x19(不可恢复或重试
的错误)、0x41—0x4A(发送失败或重试超限),同步通讯中的异常错误导致
同步通讯过程自动中断,拨号线路也被自动挂断。较常见代码含义如下:
百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 88/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

15—同步通讯过程中主叫电话线被突然拔掉
19—同步发送数据馈送不足,一般原因为 CTS 流控制信号上硬件故障
R50(硬件第九版本之前)
、R30、R50-M、R100 不支持该 API

举例:预拨号联机交易
unsigned char ucRet;

OnHook();
ucRet=ModemDial(NULL,“9,3546393.”,0);
/*输入消费金额,等待用户输入密码等操作*/
while(1)
{
ucRet=ModemCheck();
if(ucRet == 0) break; //已拨通
if(ucRet == 0x0a) continue; //正在拨号
if(kbhit()==0)
{
if(getkey()==KEYCANCEL) return USER_CANCEL //用户取消
}
if(ucRet==0x03)
{
//未接电话线
}
if(ucRet==0x0d)
{
//电话占线
}
//其他错误处理
}

3.10.4 ModemTxd
原型: uchar ModemTxd(uchar *SendData, ushort len)
功能: 通过 MODEM 发送数据包
输入参数: len 发送数据包的长度

输出参数: SendData 发送数据包指针


0xfe:无效的数据长度(len=0 或 len>2048)
返回:
其它值:同 ModemCheck()
一次最大可发送 2048 字节
注释:
R50(硬件第九版本之前) 、R30、R50-M、R100 不支持该 API

3.10.5 ModemRxd
原型: uchar ModemRxd(uchar *RecvData, ushort *len)
百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 89/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

功能: 接收 modem 返回数据包。


RecvData 接收数据包的指针[缓冲区大小可根据实际定义]。
输入参数:
len 接收数据包长度指针。

输出参数: 无
返回: 同 ModemCheck( )函数
一次最大可发送 2048 字节
注释:
R50(硬件第九版本之前) 、R30、R50-M、R100 不支持该 API

举例:MODEM 发送、接收数据
unsigned char buff[512];
unsigned int len;
unsigned char ucRet;

//发送数据
while(1)
{
ucRet=ModemTxd(buff,100);
if(ucRet == 0) break //发送成功
//发送数据出错,返回错误
return 0xff;
}
//接收数据
while(1)
{
ucRet=ModemRxd(buff,&len);
if (ucRet == 0) break //接收数据成功
if (ucRet==0x0c) continue; /* 继续接收*/
//接收数据出错,返回错误
return 0xff;
}
Onhook();
//处理接收数据

3.10.6 ModemAsyncGet
原型: uchar ModemAsyncGet(uchar *ch)
功能: 异步通信时,接收返回数据,一次只能接收一个字节。该函数立即返回。
输入参数: ch 接收数据的指针

输出参数: 无
返回: 同 ModemRxd()函数
使用时要判断返回值为 0x00 的情况下,ch 值才可用。
注释:
R50(硬件第九版本之前)、R30、R50-M、R100 不支持该 API

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 90/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

3.10.7 OnHook
原型: uchar OnHook(void)
功能: MODEM 挂机或终止 MODEM 的拨号操作
输入参数: 无

输出参数: 无
0x00:正常挂机
返回:
其他值:挂机失败
挂机后若马上重新拨号,则驱动程序自动先等候 3 秒后才开始再拨号,以便
注释: 交换机完成挂线动作和重新输送拨号音。
、R30、R50-M、R100 不支持该 API
R50(硬件第九版本之前)

3.10.8 ModemExCommand
ushort ModemExCommand(uchar *CmdStr, uchar *RespData,
原型:
ushort *Dlen,ushort Timeout10ms)
扩展 MODEM 操作接口,目前仅用于某些拨号参数(如发号电平、扩展连接时)
功能:
的设置
CmdStr 指向需要额外设置的命令串(带尾部’\0’)。
目前支持的命令串首部需要是”AT”或”WT=”, 分述如下:
 ”AT”命令串表示在 MODEM 进行拨号操作时,该命令将
在所有内部设置之后和发号之前被发送给 MODEM 芯
片去执行。每个命令串的最大长度为 100 字节(不含尾
部’\0’)。
 ”WT=” 命令串用于设置连接超时。如果调用该命令,该
设 置 将 覆 盖 和 取 代 COMM_PARA.SSETUP 和
COMM_PARA.CHDT 中关于连接超时的设置;如果不
输入参数:
调 用 该 命 令 , 则 COMM_PARA.SSETUP 和
COMM_PARA.CHDT 中关于连接超时的设置有效。该
命令串在 82D 版本开始支持。命令头后跟连接超时值,
单位为秒,有效范围 5~255。
RespData 指向输出响应的缓冲区,目前不会输出任何响应。

Dlen 输出响应的长度指针,目前不会输出响应。

Timeout10ms 有输出响应时的响应等候超时时长,单位:10 毫秒;目前暂


不用。
输出参数: 无
0:成功
1:ModemExCommand 连续调用次数过多(大于 100 次),超过了内部缓冲区
返回: 的容限
2:设置的命令串 CmdStr 过长(大于 100 字节)
3:不支持的命令串(前两字节不是”AT”)
挂机后若马上重新拨号,则驱动程序自动先等候 3 秒后才开始再拨号,
注释:
以便交换机完成挂线动作和重新输送拨号音。
百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 91/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

 额外设置的命令串是芯片支持的所有 AT 命令串,应用中一般根据需要来
使用(如调整发号电平)。不作额外设置时, 驱动内部使用缺省值。具
体 AT 命令串的含义请参考相关 MODEM 手册或遵照内部建议。
 当额外设置的命令串不是芯片支持的命令串时,MODEM 拨号将失败。
 目前,此函数应在挂机之后和拨号之前调用,且只对本次拨号和通讯过
程有效。本次拨号或通讯过程终止后,其设置失效。若在拨号或通讯过
程中调用,则该拨号或通讯过程将被中止,之后,此函数的设置会保存
下 来 备 下 次 拨 号 使 用 ; 任 意 时 刻 调 用 OnHook(), 其 之 前 的 所 有
ModemExCommand( )设置均被清除。
 当设置的命令串均有效时,此函数最多可连续调用 100 次。有相同的设
置项存在时,后面的有效。
 此函数调用后,其设置参数先存放在驱动内部的缓冲区中,只有等到调
用 ModemDial( )后,才真正生效。
R50(硬件第九版本之前) 、R30、R50-M、R100 不支持该 API

用例:
ushort dn,rn,tmpu,
COMM_PARA modem_config;

OnHook();

tmpu=ModemExCommand(“ATS91=10”, pool, &rn, 0); // 设置发号电平=


-10dB
if(tmpu)return 1;

tmpu=ModemExCommand(“ATS0=0”, pool, &rn, 0); // 设置 MODEM 为


主叫方式
if(tmpu)return 2;

tmpu=ModemExCommand(“WT=100”, NULL, NULL, 0); // 设置连接超


时为 100 秒
if(tmpu)return 3;

tmpc=ModemDial(&modem_config, “8712”,1);
if(tmpc)return 4;

dn=100;
memset(pool,0x55,dn);
tmpc=ModemTxd(pool, dn);
if(tmpc)return 5;

while(1)
{
tmpc=ModemRxd(tmps, &rn);

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 92/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

if(!tmpc)break;
if(tmpc!=0x01 && tmpc!=0x0c)return 6;
}
OnHook();

return 0;

3.10.9 将 P80 POS 设置成为一个外置 MODEM 的方法


将 P80 POS 设置成为一个外置 MODEM 后,就可以采用通用工具软件(如: HyperTerm)
来访问 P80 的內置 MODEM,而整个 P80 整体看起来好像一个外置 MODEM。这样,
ModemExCommand( )的设置效果就可以验证到。
采用通用工具软件时,要注意关闭软件和硬件流控制。
以下是设置方法代码样例:
char tmpc, cc;
ushort dn,rn,

OnHook();

tmpc=PortOpen(COM1,”115200,8,n,1”);// COM1 is used for external


access
if(tmpc)return 1;

tmpc=PortOpen(MODEM,”115200,8,n,1”);
if(tmpc)return 2;

while(1)
{
tmpc=PortRecv(COM1,&cc, 0);
if(!tmpc)PortSend(MODEM,cc);

tmpc=PortRecv(MODEM,&cc,0);
if(!tmpc)PortSend(COM1,cc);

if(!kbhit() && getkey()==KEYCANCEL)break; // abort the external


access mode
}
PortClose(COM1);
PortClose(MODEM);

return 0;
在 HyperTerm 工具中,采用”ATS91?”命令,可以检查先前 ModemExCommand(“ATS0=0”,
百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 93/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

pool, &rn, 0) 的设置效果。

3.11 无线模块操作函数

本模块内的所有 API 对 P90 均适用,对 P80 部分适用,由于 R50-M 使用 S 系列无线模


块接口,故对 R50-M 请参照 S 系列应用开发手册无线模块部分,对 P78、R50、P58、R30、
R100 不适用!
模块功能说明:本模块是实现无线模块(CDMA、GPRS)通讯相关操作 API,详细描述了
无线模块通讯方式及注意事项等。
模块内数据结构:无

3.11.1 WNetInit
原型: uchar WNetInit(void)
变量初始化、检查无线模块是否已经准备好接收 AT 指令、检查模块类型
功能: (CDMA/GPRS)。在使用无线模块前,应该先调用此函数,以确认模块已经
准备好接受 AT 指令。
输入参数: 无

输出参数: 无
RET_OK 0X00 初始化完成
RET_NOBOARD 0X17 模块转接板没插上(暂时去掉了该回返值)
RET_RSPERR 0X03 模块返回"ERROR"
返回: RET_NORSP 0X02 模块无应答,可能是模块没接上
RET_PORTERR 0XFD 串口出错
RET_PORTINUSE 0XFE 串口被占用
RET_ABNORMAL 0XFF 异常错误

如果返回 RET_RSPERR,可能是因为没插入 SIM/UIM 卡。


注释: P78、R50、P58、R30、R100 不支持该 API
R50-M 请参照 S 系列应用开发手册无线模块部分

3.11.2 WNetCheckSignal
原型: uchar WNetCheckSignal(uchar *pSignalLevel)
查询网络信号强度,函数返回 RET_OK 后,再通过参数 pSignalLevel 获取信
功能:
号强度值。通常在拨号前调用此函数。
pSignalLevel 信号强度值
0x05(99 or 0):网络无信号
0x04(1~7):信号很弱
输入参数: 0x03(8~13):信号较弱
0x02(14~19):信号一般
0x01(20~25):信号较强
0x00(26~31):信号很强
百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 94/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

输出参数: 无
RET_OK 0X00 成功返回
RET_RSPERR 0X03 模块返回"ERROR"
RET_NORSP 0X02 模块无应
返回: RET_UNKNOWNTYPE 0X18 未知类型,可能没有做初始化
RET_PORTERR 0XFD 串口出错
RET_PORTINUSE 0XFE 串口被占用
RET_ABNORMAL 0XFF 异常错误

模块刚启动时信号会相对较弱,甚至短时间内接收不到信号,需要等模块稳
定下来,通常 CDMA 模块需要三、四秒钟,GPRS 模块需要五、六秒钟。
注释:
P78、R50、P58、R30、R100 不支持该 API
R50-M 请参照 S 系列应用开发手册无线模块部分

3.11.3 WNetCheckSim
原型: uchar WNetCheckSim(void)
功能: 检查 SIM 卡的状态,在拨号前应先调用此函数来确定 SIM 卡能正常使用。
输入参数: 无

输出参数: 无
RET_OK 0X00 SIM 卡可以正常使用
RET_NOSIM 0X04 SIM 卡不存在
RET_NEEDPIN 0X05 需要输入 PIN 码
RET_NEEDPUK 需要输入 PUK 码
0X06
RET_RSPERR 模块返回"ERROR",如果没有插入 SIM
0X03
卡,模块总返回"ERROR"
返回:
RET_NORSP 0X02 模块无应
RET_SIMERR 0X08 SIM 卡出错
RET_UNKNOWNTYPE 0X18 未知类型,可能没有做初始化
RET_PORTERR 0XFD 串口出错
RET_PORTINUSE 0XFE 串口被占用
RET_ABNORMAL 0XFF 异常错误
SIM/UIM 卡不支持热插拔,如果检测到 SIM 卡不存在,需要先关掉机器,将
卡插入,然后再打开机器。
注释:
P78、R50、P58、R30、R100 不支持该 API
R50-M 请参照 S 系列应用开发手册无线模块部分

3.11.4 WNetSimPin
原型: uchar WNetSimPin(uchar *pin)
输入 SIM 卡的 PIN 码,当 WNetCheckSim()函数提示需要输入 PIN 码时,调
功能:
用此函数。
输入参数: pin PIN 码(4~8 个字符)

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 95/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

输出参数: 无
RET_OK 0X00 操作成功
RET_PARAMERR 0X0B 参数出错(PIN 码长度有误)
RET_NOSIM 0X04 SIM 卡没插入或检测不到
RET_NEEDPUK 0X06 需要 PUK 码
RET_SIMBLOCKED 0X07 SIM 卡已被锁住
RET_PINERR 0X09 PIN 码错误
返回:
RET_RSPERR 0X03 模块返回"ERROR"
RET_NORSP 0X02 模块无应
RET_UNKNOWNTYPE 0X18 未知类型,可能没有做初始化
RET_PORTERR 0XFD 串口出错
RET_PORTINUSE 0XFE 串口被占用
RET_ABNORMAL 0XFF 异常错误
P78、R50、P58、R30、R100 不支持该 API
注释:
R50-M 请参照 S 系列应用开发手册无线模块部分

3.11.5 WNetUidPwd
原型: uchar WNetUidPwd(uchar *Uid, uchar *Pwd)
功能: 设定用户名及密码,在拨号之前需要先设定用户名/密码。
Uid 用户名(少于 64 个字符)
输入参数:
Pwd 密码(少于 16 个字符)

输出参数: 无
RET_OK 0X00 操作成功
RET_PARAMERR 0X0B 参数出错(用户名/密码长度有误)
RET_RSPERR 0X03 模块返回"ERROR"
RET_NORSP 0X02 模块无应
返回:
RET_UNKNOWNTYPE 0X18 未知类型,可能没有做初始化
RET_PORTERR 0XFD 串口出错
RET_PORTINUSE 0XFE 串口被占用
RET_ABNORMAL 0XFF 异常错误
模块每次重起之后需要重新设置用户名/密码再进行拨号
注释: P78、R50、P58、R30、R100 不支持该 API
R50-M 请参照 S 系列应用开发手册无线模块部分

3.11.6 WNetDial
原型: uchar WNetDial(uchar *DialNum, uchar * reserved1, uchar * reserved2)
发送拨号指令,要检查是否已经拨通,需要调用 WNetCheck()函数(也可以
功能:
调用 WNetLinkCheck()函数来检查)
DialNum 拨号号码(CDMA 为#777,GPRS 为 cmnet)
输入参数:
reserved1 保留

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 96/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

Reserved2 保留

输出参数: 无
RET_OK 0X00 拨号请求已接纳
RET_NOSIM 0X04 SIM 卡不存在
RET_LINKCLOSED 0X0E 网络无载波,No Carrier
RET_PARAMERR 0X0B 参数出错(拨号码长度有误)
RET_SIMERR 0X08 SIM 卡出错
RET_SNLTOOWEAK 0X0D 信号太弱
返回: RET_DETTACHED 0X15 模块找不到网络
RET_RSPERR 0X03 模块返回"ERROR"
RET_NORSP 0X02 模块无应
RET_UNKNOWNTYPE 0X18 未知类型,可能没有做初始化
RET_PORTERR 0XFD 串口出错
RET_PORTINUSE 0XFE 串口被占用
RET_ABNORMAL 0XFF 异常错误
对于目前的 GPRS 和 CDMA,POS 上电第一次拨号失败的概率较大,即使等
待 20 秒以后再拨号,为解决这个问题,要求应用程序在开机的 60 秒之内,
注释: 如果第一次拨号失败后,能够有自动重拨号功能。
P78、R50、P58、R30、R100 不支持该 API
R50-M 请参照 S 系列应用开发手册无线模块部分

3.11.7 WNetCheck
原型: uchar WNetCheck(void)
查询拨号连接的结果(成功或失败)
,在函数 WNetDial()返回 RET_OK 后调
功能:
用,否则没有任何意义。此函数内部不作延时,延时处理由应用来实现。
输入参数: 无

输出参数: 无
RET_NOTDIALING 0X0A 模块不在拨号状态
RET_LINKOPENED 0X0F 已成功建立拨号连接
RET_LINKCLOSED 0X0E 拨号失败(可能信号太弱)
返回: RET_NORSP 0X02 模块无应
RET_UNKNOWNTYPE 0X18 未知类型,可能没有做初始化
RET_PORTERR 0XFD 串口出错
RET_ABNORMAL 0XFF 异常错误

拨号时,WNetDial 与 WNetCheck 应配合使用,一般来说 GPRS 拨号大约 3


秒就能连上,CDMA 拨号大约 6 秒左右才能连上。在发送拨号请求后,应用
需要调用 WNetCheck 来检查拨号是否成功,如果返回 RET_NORSP,说明模
注释: 块还没有返回,需要作延时并再次调用,直到返回其它值或超出规定的时间
(一般设定为 10 以上) 。如果拨号超时(即规定时间内仍然没有返回) ,可以
重起模块并重新拨号。
P78、R50、P58、R30、R100 不支持该 API

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 97/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

R50-M 请参照 S 系列应用开发手册无线模块部分

3.11.8 WNetTcpConnect
原型: uchar WNetTcpConnect(uchar *DestIP, uchar *DestPort)
功能: 与指定的目标地址和目标端口建立 TCP 连接
DestIP IP 地址(*.*.*.*,其中 0≤*≤255)
输入参数:
DestPort 端口号(0≤*≤65535)

输出参数: 无
RET_TCPOPENED 0X12 TCP 连接已经成功建立
RET_TCPCLOSED 0X11 TCP 连接失败
RET_PARAMERR 0X0B 参数出错(IP 地址或端口号有误)
RET_LINKCLOSED 0X0E 网络不在连接状态,需要重新拨号
RET_LINKOPENING 0X10 模块正在拨号
返回: RET_RSPERR 0X03 模块返回"ERROR"
RET_NORSP 0X02 模块无应
RET_UNKNOWNTYPE 0X18 未知类型,可能没有做初始化
RET_PORTERR 0XFD 串口出错
RET_PORTINUSE 0XFE 串口被占用
RET_ABNORMAL 0XFF 异常错误
 对于 CDMA 模块,如果连接超时,可以先调用 WNetTcpCheck 函数检查
TCP 连接状态,如果返回 RET_TCPOPENED,说明 TCP 已连接;如果
返回 RET_TCPCLOSED,则需要再次调用 WNetTcpConnect 函数;如果
返回 RET_TCPOPENING,说明模块正在尝试打开 socket,一般都需要比
较长的时间,这种情况下,可以先调用 WNetTcpClose 函数,然后再调用
WNetTcpConnect 函数来重新打开 TCP Socket。
 对于 GPRS 模块,如果连接超时,则应该调用 WNetReset 函数重起模块,
注释: 然后再次拨号和打开 TCP Socket
( GPRS 模 块 连 接超 时, 如 果 调 用 WNetTcpCheck 函 数 , 将会 返 回
RET_TCPOPENED,其实模块还没有成功打开 socket,这是一个假连接,
但这个假连接不能用 WNetTcpClose 来关掉,只能重起模块,否则需要等
待很长的时间)
 如果总是连接不成功,请先检查目标主机是否可连接。
P78、R50、P58、R30、R100 不支持该 API
R50-M 请参照 S 系列应用开发手册无线模块部分

3.11.9 WNetTcpTxd
原型: uchar WNetTcpTxd(uchar *TxData, ushort txlen)
功能: 将指定长度的数据以 TCP 方式发送出去
输入参数: TxData 要发送的数据

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 98/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

txlen 数据长度
CDMA 一次发送最大长度为 1024 字节
GPRS 一次发送最大长度为 1370 字节
输出参数: 无
RET_OK 0X00 数据已成功发送
RET_PARAMERR 0X0B 参数出错(IP 地址或端口号有误)
RET_LINKCLOSED 0X0E 网络不在连接状态,需要重新拨号
RET_LINKOPENING 0X10 模块正在拨号
RET_TCPCLOSED 0X11 TCP 连接失败
RET_TCPOPENING 0X13 模块正在打开 TCP 连接
返回:
RET_RSPERR 0X03 模块返回"ERROR"
RET_NORSP 0X02 模块无应
RET_UNKNOWNTYPE 0X18 未知类型,可能没有做初始化
RET_PORTERR 0XFD 串口出错
RET_PORTINUSE 0XFE 串口被占用
RET_ABNORMAL 0XFF 异常错误
在发送数据前,必须先建立拨号连接并打开 TCP Socket 待很长的时间)
如果总是连接不成功,请先检查目标主机是否可连接。
注释:
P78、R50、P58、R30、R100 不支持该 API
R50-M 请参照 S 系列应用开发手册无线模块部分

3.11.10 WNetTcpRxd
原型: uchar WNetTcpRxd(uchar *RxData, ushort *prxlen, ushort ms)
功能: 接收数据,接收成功后,数据长度存放于*prxlen,数据存放于 RxData
RxData 接收到的数据

输入参数: prxlen 接收到的数据长度

ms 超时时间

输出参数: 无
RET_OK 0X00 数据已成功接收
RET_NORSP 0X02 模块无应
RET_UNKNOWNTYPE 0X18 未知类型,可能没有做初始化
返回: RET_PORTERR 0XFD 串口出错
RET_PORTINUSE 0XFE 串口被占用
RET_ABNORMAL 0XFF 异常错误
RET_TCPCLOSED 0X11 TCP 协议栈出错,连接被挂断

P78、R50、P58、R30、R100 不支持该 API


注释:
R50-M 请参照 S 系列应用开发手册无线模块部分

3.11.11 WNetTcpClose
原型: uchar WNetTcpClose(void)

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 99/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

功能: 关闭已打开的 TCP Socket


输入参数: 无

输出参数: 无
RET_LINKCLOSED 0X0E 网络不在连接状态,需要重新拨号
RET_LINKOPENING 0X10 模块正在拨号
RET_TCPCLOSED 0X11 TCP 连接断开
RET_RSPERR 0X03 模块返回"ERROR"
返回: RET_NORSP 0X02 模块无应
RET_UNKNOWNTYPE 0X18 未知类型,可能没有做初始化
RET_PORTERR 0XFD 串口出错
RET_PORTINUSE 0XFE 串口被占用
RET_ABNORMAL 0XFF 异常错误
如果返回 RET_TCPCLOSED,说明 TCP 连接已经断开;如果返回 RET_OK
说明 TCP 连接尚未真正断开,只是已经将断开指令发送给模块(这是应用要
注释: 求的) 。
P78、R50、P58、R30、R100 不支持该 API
R50-M 请参照 S 系列应用开发手册无线模块部分

3.11.12 WNetClose
原型: uchar WNetClose(void)
功能: 断开拨号连接
输入参数: 无

输出参数: 无
RET_LINKCLOSED 0X0E 拨号连接已断开
RET_RSPERR 0X03 模块返回"ERROR"
RET_NORSP 0X02 模块无应
返回: RET_UNKNOWNTYPE 0X18 未知类型,可能没有做初始化
RET_PORTERR 0XFD 串口出错
RET_PORTINUSE 0XFE 串口被占用
RET_ABNORMAL 0XFF 异常错误

如果返回 RET_LINKCLOSED,说明拨号连接已经断开;如果返回 RET_OK


说明拨号连接尚未真正断开,只是已经将断开指令发送给模块(这是应用要
注释: 求的) 。
P78、R50、P58、R30、R100 不支持该 API
R50-M 请参照 S 系列应用开发手册无线模块部分

3.11.13 WNetLinkCheck
原型: uchar WNetLinkCheck(void)
功能: 查询拨号连接状态(连接、断开或正在拨号)
,此函数可在任何时候调用
输入参数: 无

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 100/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

输出参数: 无
RET_LINKOPENED 0X0F 模块处于在线状态
RET_LINKCLOSED 0X0E 网络不在连接状态
RET_LINKOPENING 0X10 模块正在拨号
RET_RSPERR 0X03 模块返回"ERROR"
返回: RET_NORSP 0X02 模块无应
RET_UNKNOWNTYPE 0X18 未知类型,可能没有做初始化
RET_PORTERR 0XFD 串口出错
RET_PORTINUSE 0XFE 串口被占用
RET_ABNORMAL 0XFF 异常错误
如果返回 RET_TCPCLOSED,说明 TCP 连接已经断开;如果返回 RET_OK
说明 TCP 连接尚未真正断开,只是已经将断开指令发送给模块(这是应用要
注释: 求的) 。
P78、R50、P58、R30、R100 不支持该 API
R50-M 请参照 S 系列应用开发手册无线模块部分

3.11.14 WNetTcpCheck
原型: uchar WNetTcpCheck(void)
功能: 检查 TCP 的连接状态,此函数也可以在任何时候调用
输入参数: 无

输出参数: 无
RET_TCPOPENED 0X12 已建立 TCP 连接
RET_TCPCLOSED 0X11 TCP 连接已断开
RET_TCPOPENING 0X13 正在建立 TCP 连接
RET_RSPERR 0X03 模块返回"ERROR",拨号连接断开之后,
该函数总返回 RET_RSPERR
返回:
RET_NORSP 0X02 模块无应
RET_UNKNOWNTYPE 0X18 未知类型,可能没有做初始化
RET_PORTERR 0XFD 串口出错
RET_PORTINUSE 0XFE 串口被占用
RET_ABNORMAL 0XFF 异常错误
GPRS 模块没有 RET_TCPOPENING 这项返回值
注释: P78、R50、P58、R30、R100 不支持该 API
R50-M 请参照 S 系列应用开发手册无线模块部分

3.11.15 WNetReset
原型: uchar WNetReset(void)
功能: 复位模块,复位完成后需要调用 WNetInit()函数来进行初始化设置
输入参数: 无

输出参数: 无

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 101/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

RET_OK 0X00 复位完成


返回: RET_PORTINUSE 0XFE 串口被占用

复位功能一般只在出现异常的情况下使用
GPRS 模块在 TCP Socket 连接超时的情况下,最好先复位一下模块再重新进
注释: 行连接
P78、R50、P58、R30、R100 不支持该 API
R50-M 请参照 S 系列应用开发手册无线模块部分

3.11.16 WNetSendCmd
原型: uchar WNetSendCmd(uchar *cmd, uchar *rsp, ushort rsplen, ushort ms)
功能: 使应用能直接向无线模块发送 AT 指令
cmd AT 指令(以’\r’结尾)

rsp 无线模块的返回信息

输入参数: rsplen 指定要接收的最大字节数, (注:在使用 GMR,GMI,GMM 或


CGMR,CGMI,CGMM)返回长度不受 rsplen 限制,作为 rsp
做接收缓冲区时缓冲区应大于 100 字节。
ms 接收模块返回的超时时间

输出参数: 无
RET_OK 0X00 复位完成
RET_PARAMERR 0X0B 参数错误
RET_RSPERR 0X03 模块返回"ERROR"
返回: RET_NORSP 0X02 模块无应
RET_PORTERR 0XFD 串口出错
RET_PORTINUSE 0XFE 串口被占用
RET_UNKNOWNTYPE 0X18 未知类型,可能没有做初始化
P78、R50、P58、R30、R100 不支持该 API
注释:
R50-M 请参照 S 系列应用开发手册无线模块部分

3.11.17 WNetMTcpConnect
原型: uchar WNetMTcpConnect(int *psocket, uchar *DestIP, uchar *DestPort)
功能: 与指定的目标地址和目标端口建立 TCP 连接,并返回 socket 连接号。
Psocket socket 连接号

输入参数: DestIP IP 地址(*.*.*.*,其中 0≤*≤255)

DestPort 端口号(0≤*≤65535)

输出参数: 无

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 102/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

RET_TCPOPENED 0X12 TCP 连接已经成功建立


RET_TCPCLOSED 0X11 TCP 连接失败
RET_PARAMERR 0X0B 参数出错(IP 地址或端口号有误)
RET_LINKCLOSED 0X0E 网络不在连接状态,需要重新拨号
RET_LINKOPENING 0X10 模块正在拨号
返回: RET_RSPERR 0X03 模块返回"ERROR"
RET_NORSP 0X02 模块无应
RET_UNKNOWNTYPE 0X18 未知类型,可能没有做初始化
RET_PORTERR 0XFD 串口出错
RET_PORTINUSE 0XFE 串口被占用
RET_ABNORMAL 0XFF 异常错误
对于中兴的 CDMA 模块 MG815,支持 5 个多连接。
对于摩托罗拉 GPRS 模块 G20/G24,支持 2 个多连接。
注释:
P78、R50、P58、R30、R100 不支持该 API
R50-M 请参照 S 系列应用开发手册无线模块部分

3.11.18 WNetMTcpTxd
原型: uchar WNetMTcpTxd(int socket, uchar *TxData, ushort txlen)
功能: 将指定长度的数据以 TCP 方式发送出去(通过连接号 socket)
Socket 发送的 socket

TxData 要发送的数据
输入参数:
txlen 数据长度
CDMA 一次发送最大长度为 1024 字节
GPRS 一次发送最大长度为 1370 字节
输出参数: 无
RET_OK 0X00 数据已成功发送
RET_PARAMERR 0X0B 参数出错(IP 地址或端口号有误)
RET_LINKCLOSED 0X0E 网络不在连接状态,需要重新拨号
RET_LINKOPENING 0X10 模块正在拨号
RET_TCPCLOSED 0X11 TCP 连接失败
RET_TCPOPENING 0X13 模块正在打开 TCP 连接
返回:
RET_RSPERR 0X03 模块返回"ERROR"
RET_NORSP 0X02 模块无应
RET_UNKNOWNTYPE 0X18 未知类型,可能没有做初始化
RET_PORTERR 0XFD 串口出错
RET_PORTINUSE 0XFE 串口被占用
RET_ABNORMAL 0XFF 异常错误
在发送数据前,必须先建立拨号连接并打开多连接 TCP Socket
注释: P78、R50、P58、R30、R100 不支持该 API
R50-M 请参照 S 系列应用开发手册无线模块部分

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 103/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

3.11.19 WNetMTcpRxd
uchar WNetMTcpRxd(int socket, uchar *RxData, ushort maxlen, ushort
原型:
*prxlen, ushort ms)
基于连接 socket 接收数据,接收成功后,数据长度存放于*prxlen,数据存放
功能:
于 RxData。
Socket socket 连接号

maxlen 存储缓冲的最大程度
输入参数:
prxlen 接收到的数据长度

ms 超时时间

输出参数: RxData 接收到的数据


RET_OK 0X00 数据已成功接收
RET_NORSP 0X02 模块无应
RET_UNKNOWNTYPE 0X18 未知类型,可能没有做初始化
返回: RET_PORTERR 0XFD 串口出错
RET_PORTINUSE 0XFE 串口被占用
RET_ABNORMAL 0XFF 异常错误
RET_TCPCLOSED 0X11 TCP 协议栈出错,连接被挂断
P78、R50、P58、R30、R100 不支持该 API
注释:
R50-M 请参照 S 系列应用开发手册无线模块部分

3.11.20 WNetMTcpClose
原型: uchar WNetMTcpClose(int socket)
功能: 关闭已打开的 TCP Socket(多连接)
输入参数: Socket socket 连接号

输出参数: 无
RET_OK 0x00 关闭请求已接纳
RET_LINKCLOSED 0X0E 网络不在连接状态,需要重新拨号
RET_LINKOPENING 0X10 模块正在拨号
RET_TCPCLOSED 0X11 TCP 连接断开
RET_RSPERR 0X03 模块返回"ERROR"
返回: RET_NORSP 0X02 模块无应
RET_UNKNOWNTYPE 0X18 未知类型,可能没有做初始化
RET_PORTERR 0XFD 串口出错
RET_PORTINUSE 0XFE 串口被占用
RET_ABNORMAL 0XFF 异常错误
RET_PARAMERR 0X0B 参数错误,socket 非 2 至 4 时会报错
P78、R50、P58、R30、R100 不支持该 API
注释:
R50-M 请参照 S 系列应用开发手册无线模块部分

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 104/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

3.11.21 WNetMTcpCheck
原型: uchar WNetMTcpCheck(int socket)
功能: 检查 TCP 的连接状态,此函数也可以在任何时候调用
输入参数: Socket socket 连接号

输出参数: 无
RET_TCPOPENED 0X12 已建立 TCP 连接
RET_TCPCLOSED 0X11 TCP 连接已断开
RET_TCPOPENING 0X13 正在建立 TCP 连接
RET_RSPERR 0X03 模块返回"ERROR",拨号连接断开之后,
该函数总返回 RET_RSPERR
返回: RET_NORSP 0X02 模块无应
RET_UNKNOWNTYPE 0X18 未知类型,可能没有做初始化
RET_PORTERR 0XFD 串口出错
RET_PORTINUSE 0XFE 串口被占用
RET_ABNORMAL 0XFF 异常错误
RET_PARAMERR 0X0B 参数错误,socket 非 2 至 4 时会报错
GPRS 模块没有 RET_TCPOPENING 这项返回值
注释: P78、R50、P58、R30、R100 不支持该 API
R50-M 请参照 S 系列应用开发手册无线模块部分

3.11.22 WPhoneCall
原型: uchar WPhoneCall(uchar *PhoneNum)
功能: 主动进行语音功能呼叫。
对方电话号码,字符串形式,以 0x00 结尾,长度
输入参数: PhoneNum
范围[1,50]。

输出参数: 无

RET_OK 拨号成功
RET_PARAMERR 参数错误,电话号码长度不合法
RET_RSPERR 模块返回”ERROR”
RET_NORSP 模块超时无应答,但可能电话仍能接通
RET_PORTERR 串口出错
RET_PORTINUSE 串口被占用
RET_ABNORMAL 异常错误
返回:
RET_UNKNOWNTYPE 未知类型,可能没有做初始化
RET_SIMERR SIM 卡错误或者需要输入 PIN 码。
RET_SNLTOOWEAK 信号太弱
RET_DETTACHED 模块找不到网络
RET_DIALING 拨号失败,有一个拨号正在进行。
RET_BUSY 拨号失败,正在语音通话过程。
RET_RING 拨号失败,模块接收到被叫信息还未处理。
注释: 拨号成功指的是发送电话号码给网络被确认,不代表对方接听。
百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 105/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

不支持多方通话功能。
每次拨号需与上次通话挂断有 1 秒以上的间隔。
P80、P78、R50、P58、R30、R50-M、R100 不支持该 API

3.11.23 WPhoneHangUp
原型: uchar WPhoneHangUp(void)
功能: 主动挂断语音通话。可挂断呼入、呼出和正在呼入但未接听的通话。

输入参数: 无

输出参数: 无

RET_OK 挂断成功
RET_RSPERR 模块返回”ERROR”
RET_NORSP 模块无应答
返回: RET_PORTERR 串口出错
RET_PORTINUSE 串口被占用
RET_ABNORMAL 异常错误
RET_UNKNOWNTYPE 未知类型,可能没有做初始化
每次挂断需与下次通话有 1 秒以上的间隔。
注释:
P80、P78、R50、P58、R30、R50-M、R100 不支持该 API

3.11.24 WPhoneStatus
原型: uchar WPhoneStatus(void)
功能: 检测语音线路呼叫状态。

输入参数: 无

输出参数: 无

RET_OK 语音通道无动作(可拨号状态)

RET_RSPERR 模块返回”ERROR”
RET_NORSP 模块无应答
RET_PORTERR 串口出错
RET_PORTINUSE 串口被占用
返回:
RET_ABNORMAL 异常错误
RET_UNKNOWNTYPE 未知类型,可能没有做初始化
RET_DIALING 有一个拨号正在进行。
RET_BUSY 正在语音通话过程。
RET_RING 模块接收到被叫信息,等待接听或者挂断。
此函数用户检查是否有来电、检测通话过程状态。
注释:
P80、P78、R50、P58、R30、R50-M、R100 不支持该 API

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 106/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

3.11.25 WPhoneAnswer
原型: uchar WPhoneAnswer(void)
功能: 接听语音呼叫。

输入参数: 无

输出参数: 无

RET_OK 接听成功
RET_RSPERR 模块返回”ERROR”或者非来电状态。
RET_NORSP 模块无应答
返回: RET_PORTERR 串口出错
RET_PORTINUSE 串口被占用
RET_ABNORMAL 异常错误
RET_UNKNOWNTYPE 未知类型,可能没有做初始化
注释: P80、P78、R50、P58、R30、R50-M、R100 不支持该 API

3.11.26 WPhoneMicGain
原型: uchar WPhoneMicGain(uchar Level)
功能: 调节话筒音量。
话筒音量等级,范围[0,3]。值越大音量越高,超过
输入参数: Level
范围按最大值处理。

输出参数: 无

RET_OK 执行成功
RET_RSPERR 模块返回”ERROR”
RET_NORSP 模块无应答
返回: RET_PORTERR 串口出错
RET_PORTINUSE 串口被占用
RET_ABNORMAL 异常错误
RET_UNKNOWNTYPE 未知类型,可能没有做初始化
注释: P80、P78、R50、P58、R30、R50-M、R100 不支持该 API

3.11.27 WPhoneSpkGain
原型: uchar WPhoneSpkGain(uchar Level)
功能: 调节听筒音量。
听筒音量等级,范围[0,4]。值越大音量越高,超过
输入参数: Level
范围按最大值处理。

输出参数: 无

RET_OK 执行成功
返回:
RET_RSPERR 模块返回”ERROR”
百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 107/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

RET_NORSP 模块无应答
RET_PORTERR 串口出错
RET_PORTINUSE 串口被占用
RET_ABNORMAL 异常错误
RET_UNKNOWNTYPE 未知类型,可能没有做初始化
注释: P80、P78、R50、P58、R30、R50-M、R100 不支持该 API

3.11.28 WPhoneSendDTMF
原型: uchar WPhoneSendDTMF(uchar DTMFNum, ushort DurationMs)
功能: 语音通话中发送双音多频信号。
所 要 发 送 的 DTMF 信 号 , 取 值 ’0’~’9’,
DTMFNum
‘A’~’D’、’*’、’#’。
输入参数:
发送 DTMF 时间长度,单位 ms,范围 [0,60000],
DurationMs
建议值 100ms。强烈建议非必要时不要修改此值。
输出参数: 无
RET_OK 执行成功
RET_PARAMERR 参数错误,非双音多频值。
RET_RSPERR 模块返回"ERROR"或者不在通话状态。
RET_NORSP 模块无应答
返回:
RET_PORTERR 串口出错
RET_PORTINUSE 串口被占用
RET_ABNORMAL 异常错误
RET_UNKNOWNTYPE 未知类型,可能没有做初始化
每次只能发送一个 DTMF 信号,若要发送多个则循环调用此函数。
注释: 该功能可用户语音提示的呼叫应用,如电话充值。
P80、P78、R50、P58、R30、R50-M、R100 不支持该 API

3.11.29 无线模块注意事项
数据发送完成后应只执行接收返回的数据操作,不要在接收过程中或者接收前执行其它
无线模块(包括语音功能)API,否则可能导致接收数据丢失。
从网络的延迟特性来看,接收超时设置为不低于 60 秒为好。若能允许少部分(2%左右)
的超时错误,则超时也不应该低于 30 秒。
接收数据包 GPRS(G20)最大为 1372 字节,CDMA(MG815)最大为 536 字节。如应用接
收到最大长度应根据其它条件(如通过包内信息计算数据包实际长度)判断是否接收到了足
够的长度,如果不够则应再次调用接收函数进行拼包操作,接收剩下的数据,直到接收到足
够长度。因为拼包实际为独立的多个数据包接收,因此每次再接收数据应设置同样的超时时
间,不应缩短超时时间。在连续接收数据期间不能执行其它无线模块 API。
为提高交易成功率,应重试拨号 3 次,tcp 连接 3 次。

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 108/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

3.11.30 无线模块数据功能 API 使用范例


本范例简单说明了常用接口的使用,仅供参考,在开发时还需要根据实际情况并参考上
面的接口函数说明,对各种不同的返回值做相应的处理。
//必须先初始化
WNetInit();
//检测 SIM 卡
WNetCheckSim();
//检测信号
WNetCheckSignal(&SignalLevel);
//设置用户密码
WNetUidPwd("uid", "pwd");
//拨号、TCP 连接、发数据、收数据、断开 TCP 连接、断开拨号
//1.拨号
WNetSendCmd("at+gmi\r", rsp, 50, 2000);
if(ucRet == RET_OK)
{
if( strstr((char *)rsp, "ZTEiT MODEM") )
WNetType = WNET_CDMA;
else if( strstr((char *)rsp, "Motorola") )
WNetType = WNET_GPRS;
else
{
Lcdprintf("模块类型错误");
getkey();
return;
}
}
else
{
Lcdprintf("异常错误");
getkey();
return;
}
if(WNetType == WNET_CDMA)
ucRet = WNetDial("#777", "", "");
else if(WNetType == WNET_GPRS)
ucRet = WNetDial("cmnet", "", "");
else
{
Lcdprintf("模块类型错误");getkey(); return;
}
for(i=0; i<30; i++) //30 为拨号等待时间,可根据实际需要进行设置,
建议值为 30,一般来说 CDMA 为 6 秒左右,GPRS 为 3 秒左右
{
百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 109/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

Lcdprintf("%d", i); //显示第几次,相当于时间(s)


ucRet = WNetCheck();
if(ucRet == RET_LINKOPENED)
break;
if(ucRet == RET_NORSP)
{
DelayMs(1000); //可根据需要采用不同的延时方法
continue;
}
switch(ucRet)
{
case RET_NOTDIALING:
Lcdprintf("模块不在拨号状态");
break;
case RET_LINKCLOSED:
Lcdprintf("拨号失败");
break;
case RET_PORTERR:
Lcdprintf("串口出错");
break;
case RET_ABNORMAL:
Lcdprintf("异常错误");
break;
default:
Lcdprintf("default");
break;
}
getkey();return;
}
if(i==30)
{
Lcdprintf("拨号超时");
getkey();return;
}
ScrSetIcon(1,1);
//2.TCP 连接
ucRet = WNetTcpConnect("218.17.93.165", "60180");
//3.数据发送
WNetTcpTxd("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcd
efghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz0123", 128);
//4.数据接收
WNetTcpRxd(RxData, &rxlen, 8000);
if(ucRet != RET_OK){

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 110/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

getkey(); return;
}
//5.关闭 TCP 连接
ucRet = WNetTcpClose();
if(ucRet != RET_TCPCLOSED)
{ getkey();return;
}
//6.断开拨号
ucRet = WNetClose();
if(ucRet != RET_LINKCLOSED)
{ getkey(); return;
}
ScrSetIcon(1,0);
}

void ResetModule(void)
{
unsigned char ucRet;
int i;
ucRet = WNetReset();
if(ucRet != RET_OK)
{ getkey(); return;
}
DelayMs(3000);
WNetInit();
}

3.11.31 无线模块语音功能 API 使用范例


本范例简单说明了常用接口的使用,仅供参考,在开发时还需要根据实际情况并参考上
面的接口函数说明,对各种不同的返回值做相应的处理。
本范例模拟一个最简单的电话应用,可提示来电、接听、挂断、拨号、DTMF 输入(可应
用于充值或者按语音提示选择路径)等功能。仅供演示,实际效果需要调制。
//必须先初始化
WNetInit();
//检测 SIM 卡
WNetCheckSim();
//检测信号
WNetCheckSignal(&SignalLevel);

void TestWPhoneSimulate(void)
{
uchar ret,status;
uchar CallNow=2;
uint ret_event;
百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 111/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

uchar PhoneNum[100];

ScrCls();
ScrPrint(0, 0, 0x80, " Simulate Phone App ");
ScrSetIcon(1, CallNow);
memset(PhoneNum, 0, sizeof(PhoneNum));
while(1)
{
status = WPhoneStatus();
if(status == RET_RING)
{
Beep_Prompt();
ScrPrint(0, 7, 0x00, "Ring... ");
}
else if(status == RET_BUSY)
{
CallNow = 1;
ScrSetIcon(1, CallNow);
ScrPrint(0, 7, 0x00, "In Use ");
}
else if(status == RET_OK)
{
CallNow = 2;
ScrSetIcon(1, CallNow);
ScrPrint(0, 7, 0x00, "Ready ");
}
else if(status == RET_DIALING)
{
ScrPrint(0, 7, 0x00, "Dailing ");
}

ret = 0;
ret_event= PowerSave(EVENT_OVERTIME |
EVENT_KEYPRESS, 100);
if(ret_event & EVENT_KEYPRESS)
{
ret = getkey();
}
if(ret == KEYUP) ret = '*';
if(ret == KEYDOWN) ret = '#';
if(ret == KEYCLEAR) memset(PhoneNum, 0,
sizeof(PhoneNum));
if(ret == KEYCANCEL)
{

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 112/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

if(status == RET_OK) return; // return


else
{
memset(PhoneNum, 0, sizeof(PhoneNum));
WPhoneHangUp();
}
}
if(ret == KEYENTER)
{
if(status == RET_RING)
{
WPhoneAnswer();
}
if(status == RET_OK)
{
ScrPrint(0, 6, 0x00, "Dial...");
WPhoneCall(PhoneNum);
memset(PhoneNum, 0, sizeof(PhoneNum));
}
}
if(ret=='*' || ret=='#' || (ret>='0' && ret<='9'))
{
PhoneNum[strlen(PhoneNum)] = ret;
if(status == RET_BUSY)
WPhoneSendDTMF(ret, 100);
}
ScrClrLine(2, 6);
ScrPrint(0, 2, 0x00, "%s",PhoneNum);
}
}

3.12 PPP 协议接口函数

本模块内的所有 API 对 P80 均适用,对 P78、P90 部分适用,对 R50、P58、R30、R50-M、


R100 不适用!
模块功能说明:本模块是实现 PPP 协议相关操作 API。
PPP 协议,是一个通俗和笼统的叫法,实际上是指基于 PPP 链路层协议的 TCP/IP 协议簇。
P78 的 PPP 链路层在物理拨号线上实现,其应用调用过程是先调用原有 MODEM 拨号接口,
建立好异步物理连接,再调用一组 PPP 新增函数来与远端交换数据。
目前 P78 的 PPP 实现是采用阻塞方式进行的,接口中预留了非阻塞方式的操作处理。
通过选项设置,本地端可以工作于客户机方式(一般应用情况) ,也可工作于服务器方
式(特殊应用情况) 。
本地端不提供 PING 远端的操作,但可以支持远端 PING 本地端的操作。
百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 113/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

模块内数据结构如下:
1) typedef struct
{
uchar connected; //指定的连接句柄是否处于连接状态,1-是,0-否
uchar remote_closed; //指定连接中的远端是否已关闭, 1-是,0-否
uchar has_data_in; //指定的连接上接收缓冲区是否有数据,1-是,0-否
uchar outbuf_emptied; //指定的连接上发送缓冲区是否为空, 1-是,0-否
ushort left_outbuf_count; //当前能发送的最大字节数
uchar remote_addr[4]; //远端 IP 地址
uchar reserved1[30]; //保留字段 1
int link_state; //底层的链路状态:
// -23-线路已断,-24-未登录,0-正常
uchar local_addr[4]; //本地 IP 地址
uchar dns1_addr[4]; //DNS1 的 IP 地址
uchar dns2_addr[4]; //DNS1 的 IP 地址
uchar gateway_addr[4]; //网关 IP 地址
uchar subnet_mask[4]; //子网掩码
uchar reserved2[30]; //保留字段 2
}PPP_NET_INFO;
2) typedef struct
{
uchar IsSync; // 0—异步连接,1—同步连接
uchar ConnectTimeout;//连接超时时长,0-表示默认值 45 秒
uchar SpeedType;//0-表示 GSM 的默认最大速度,对于 // G20/G24 默认最大速度
是 9600 bps
// 1-1200,2-2400,3-4800,4-7200,5-9600,6-12000, 7- // 14400,8-19200,9-24000,
10-26400, 11-28800, 12-31200,// 13-33600,14-48000, 15-56000bps, 0xff-自动
波特率
uchar AsyncFormat; // 0-8N1,1-8E1,2-8O1, 3-N71,4-7E1,// 5-7O1
uchar IdleTimeout;//连接空闲自动挂机时长值单位:10 秒,// 填 0 表示不自动挂机
uchar DialTimes; // 拨号时长,0—表示默认值 1
uchar DisableXonXoff;// XonXoff 软件流控,0-使能,1-禁// 止
uchar ServiceType; // 服务类型:0-PPP,1-通用异步,其他// 值保留
uchar Reserved[50]; // 保留,需全部填 0
}GSM_CALL;

3.12.1 NpppLogin
原型: int NpppLogin(char *user_name,char *user_password)
初始化 PPP 链路和网络参数;将 MODEM 数据通道切换到 PPP 处理通道,并
功能: 建立 PPP 链路:先建立 LCP 链路,再进行用户名/密码认证,最后进行 IPCP
交互通讯。
输入参数: user_name 用于输入用户名称,最长 32 字节。

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 114/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

user_password 用于输入用户密码,最长 32 字节。

输出参数: 无
1-成功
1-255—拨号失败的返回码,同 ModemDial
300—PPP 网络初始化失败
400—PPP 端口初始化失败
490--用户名称大于 32 字节
491--用户密码大于 32 字节
501—MODEM 处于非连接的空闲状态
502--MODEM 处于同步连接状态
503—接收用户名称输入提示超时(超时时长为 10 秒)
504--接收到用户名称输入提示后,线路中断
505--接收用户密码输入提示超时(超时时长为 3 秒)
返回: 506--接收到用户密码输入提示后,线路中断
507—通道切换异常错误
-23—线路已断
-27—LCP 链路建立失败(LCP:Link Control Protocol)
-28—用户名/密码认证失败
-29—IPCP 交互通讯错误(IPCP:IP Control Protocol)
其它—异常错误
P80 的 V81K 版本开始,由于改变了登录方式,去掉下列返回码:
//503--接收用户名称输入提示超时(超时时长为 18 秒)
//504--接收到用户名称输入提示后,线路中断
//505--接收用户密码输入提示超时(超时时长为 3 秒)
//506--接收到用户密码输入提示后,线路中断
 应紧跟在拨号函数后面进行调用。若先前的拨号是预拨号,则在此函数
中先等候连通后,再进行登录处理。
注释:  此函数调用成功后,若再调用 ModemTxd( )数据发送函数,将不能成功;
但调用 ModemRxd( )数据接收函数可以监听到(不是夺取)线路数据。
R50、P58、R30、R50-M、R100 不支持该 API

例子:
char tmpc;
int tmpd;

memset(&modem_config,0x00,sizeof(modem_config));
modem_config.SSETUP=0x87; //Async connection and 26s connection
timeout
modem_config.AsMode=0xd0;//Expect 33.6kbps connection speed

tmpc=ModemDial(&modem_config, “9,96169”,1);
if(tmpc)return 1;

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 115/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

tmpd=NpppLogin(“96169”, “96169”);
if(tmpd)return 2;

3.12.2 NpppOpen
int NpppOpen(uchar *remote_addr,ushort remote_port, ushort
原型:
local_port,uchar mode)
功能: 以客户机或服务器方式与远端建立一个 TCP/IP 或 UDP/IP 连接
remote_addr 用于指定远端 IP 地址或远端名称;如作服务器,则一般设
为“*”,表示可以守候和服务支持来自任意客户端的连接请
输入参数: 求。
remote_port 用于指定远端端口号;端口号由 TCP 协议层使用;如作服
务器,则应设为 0。
local_port 用于指定本地端口号。

mode 用于指定连接模式,一般置 0,表示阻塞方式、TCP/IP 协议


簇。
D0—0:阻塞方式,1:非阻塞方式
D2D1—00:TCP/IP,01:UDP/IP,
其它值:保留
其它位—保留,应置 0
输出参数: 无
>=0:成功;返回的是连接句柄,用于其后的数据访问操作。
-12:操作超时
返回:
-23:线路已断
其它<0 值:打开失败
 一旦登录成功,就可调用该函数。
 可采用不同的参数调用多次,建立多个(最多 50 个)连接;每个连接相互
注释: 独立。
 相应地,调用此函数建立的连接,可采用 PppClose( )进行关闭。
R50、P58、R30、R50-M、R100 不支持该 API

例子 1:一般应用,作客户机
char tmpc;
int tmpd,hd;

tmpc=ModemDial(&modem_config, “9,96169”,1);
if(tmpc)return 1;

tmpd=NpppLogin(“96169”, “96169”);
if(tmpd)return 2;

hd=NpppOpen( “192.128.0.125”,2005,100,0);
if(hd<0)return 3;
百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 116/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

例子 2:特殊应用,作服务器
char tmpc;
int tmpd,hd;

tmpc=ModemDial(&modem_config, “9,96169”,1);
if(tmpc)return 1;

tmpd=PppLogin(“96169”, “96169”);
if(tmpd)return 2;

hd=PppOpen( “*”,0,100,0);
if(hd<0)return 3;

3.12.3 NpppWrite
原型: int NpppWrite(int connect_handle,uchar *buf,ushort len)
功能: 在指定的连接上,向远端发送一块指定长度的数据
connect_handle 用于指定一个已建立的连接句柄

输入参数: buf 指向待发送的数据块头部

len 用于指定待发送数据块的字节数

输出参数: 无
>0:成功;返回的是本次实际成功发送的字节数
=0:发送失败
返回: -12:操作超时
-23:线路已断
其它<0 值:发送错误

 只有指定的连接句柄当前有效(已建立、且未被关闭),调用该函数才能
成功。
 一次能发送的最大数据块长为 1518 字节;若待发数据块过大,宜切分成
注释:
多个小于 1518 字节的数据块后,再依次逐块发送;并在每次发送前一直
检查发送缓冲区,直到其为空时才开始发送
R50、P58、R30、R50-M、R100 不支持该 API

例子:
char tmpc, pool[2000];
int tmpd,hd;
ushort dn;

tmpc=ModemDial(&modem_config, “9,96169”,1);

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 117/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

if(tmpc)return 1;

tmpd=NpppLogin(“96169”, “96169”);
if(tmpd)return 2;

hd=NpppOpen( “192.128.0.125”,2005,100,0);
if(hd<0)return 3;

dn=1000;
memset(pool,0x55,dn);
tmpd=NpppWrite(hd, pool, dn);
if(tmpd!=dn)return 4;

3.12.4 NpppRead
原型: int NpppRead(int connect_handle,uchar *out_data,ushort len)
功能: 在指定的连接上,从远端接收一块指定最大长度的数据
connect_handle 用于指定一个已建立的连接句柄
输入参数:
len 用于指定待接收数据块的字节数

输出参数: out_data 指向一数据缓冲区头部,用于输出待接收数据


>0:成功;返回的是本次实际成功发送的字节数
=0:发送失败
返回: -12:操作超时
-23:线路已断
其它<0 值:发送错误

 只有指定的连接句柄当前有效(已建立、且未被关闭),调用该函数才能
成功。
 一次能接收到的最大数据块长为 1518 字节;若要接收超过此限的数据块
注释:
或者远端非连续地发送,则需要多次调用此读取函数,并依次拼接各数
据块。
R50、P58、R30、R50-M、R100 不支持该 API

例子:
char tmpc, pool[2000],tmps[2000];
int tmpd,hd;
ushort dn,rn;

tmpc=ModemDial(&modem_config, “9,96169”,1);
if(tmpc)return 1;

tmpd=NpppLogin(“96169”, “96169”);
if(tmpd)return 2;

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 118/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

hd=NpppOpen( “192.128.0.125”,2005,100,0);
if(hd<0)return 3;

dn=1000;
memset(pool,0x55,dn);
tmpd=NpppWrite(hd, pool, dn);
if(tmpd!=dn)return 4;

while(1)
{
tmpd=NpppRead(hd,tmps,sizeof(tmps));
if(tmpd<0)return 5;
if(tmpd>0)break;
}
rn=tmpd;

3.12.5 NpppCheck
原型: void NpppCheck(int connect_handle,PPP_NET_INFO *pi)
功能: 读取相关节点地址、子网掩码、以及指定连接的状态
输入参数: connect_handle 用于指定一个连接句柄

pi 指向 PPP_NET_INFO 结构缓冲区,用于输出当前网络和
输出参数:
当前连接的状态
返回: 无

 若当前未登陆或线路已断,则调用该函数返回的信息中只有 link_state 有
效。
 若指定的连接句柄当前无效(未建立、或已被关闭) ,则调用该函数返回
的信息中只有 link_state 及其后面的诸字段有效。
注释:
 只有指定的连接句柄当前有效(已建立、且未被关闭),调用该函数才能
返回当前连接的状态。也就是 connected=1 时,本结构中的字段(除保留
字段外)才均有效。
R50、P58、R30、R50-M、R100 不支持该 API

例子:
char tmpc, pool[2000],tmps[2000];
int tmpd,hd;
ushort dn,rn,i;
PPP_NET_INFO pi;

tmpc=ModemDial(&modem_config, “9,96169”,1);
if(tmpc)return 1;

tmpd=NpppLogin(“96169”, “96169”);
百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 119/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

if(tmpd)return 2;

NpppCheck(-1,&pi);// 读取相关节点地址、子网掩码

hd=NpppOpen( “192.128.0.125”,2005,100,0);
if(hd<0)return 3;

dn=1000;
memset(pool,0x55,dn);
tmpd=NpppWrite(hd, pool, dn);
if(tmpd!=dn)return 4;

i=0;
while(1)
{
NpppCheck(hd,&pi);// 读取连接和缓冲区状态
if(pi.has_data_in)
{
tmpd=NpppRead(hd,tmps+i,1);
if(tmpd!=1)return 5;
i++;
if(i>=dn)break;
}
}
rn=tmpd;

3.12.6 NpppClose
原型: int NpppClose(int connect_handle)
功能: 关闭指定的连接
输入参数: connect_handle 用于指定一个已建立连接句柄

输出参数: 无
0:成功
-12:操作超时
-23:线路已断
返回:
-24:未登录和初始化
-25:未打开的连接号
其它<0 值:失败
 只有指定的连接句柄当前有效(已建立、且未被关闭),调用该函数才能
成功。
注释:  指定的连接被关闭后,再对其进行访问(读、写、检查状态等)将失败。
 指定的连接被关闭,只涉及该连接,而 PPP 链路将继续保持在开通状态。
 对于已建立的所有连接,访问完成后,最好连续调用该函数将这些连接
百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 120/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

一一关闭,再实施挂机关断物理链路,以免让远端陷入异常状态。
R50、P58、R30、R50-M、R100 不支持该 API
例子:
char tmpc, pool[2000],tmps[2000];
int tmpd,hd;
ushort dn,rn,

tmpc=ModemDial(&modem_config, “9,96169”,1);
if(tmpc)return 1;
tmpd=NpppLogin(“96169”, “96169”);
if(tmpd)return 2;
hd=NpppOpen( “192.128.0.125”,2005,100,0);
if(hd<0)return 3;
dn=1000;
memset(pool,0x55,dn);
tmpd=NpppWrite(hd, pool, dn);
if(tmpd!=dn)return 4;
while(1)
{
tmpd=NpppRead(hd,tmps,sizeof(tmps));
if(tmpd<0)return 5;
if(tmpd>0)break;
}
rn=tmpd;
NpppClose(hd);
OnHook();
return 0;

3.12.7 NpppProcess
原型: void NpppProcess(void)
用于非阻塞方式时,执行一次各协议层的数据包处理过程,进行相关拆包、
功能:
封装、包传递的操作。
输入参数: 无

输出参数: 无
返回: 无

 若采用阻塞方式来操作,则不必关注和调用此函数。
 当前的 PPP 实现除了物理层采用中断来实现外,其它各层协议均采用单进
的轮询方式来进行。
注释:
 所以,如果采用非阻塞方式来操作,需要频繁调用该轮询处理函数,已维

各协议层的正常运转。
R50、P58、R30、R50-M、R100 不支持该 API

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 121/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

3.12.8 GsmCallModem
原型: int GsmCallModem(GSM_CALL *CallPara, uchar *TelNo, uchar *ErrMsg)
功能: 完成基于 GSM 模块的远程 modem 回路交换数据调用
CallPara 指向 GSM_CALL 结构体的呼叫调用输入参数
如果指针*CallPara 被赋值为 NULL,则表示该指针
结构中的所有成员变量取值都为 0。
ConnectTimeout 成员只用于连接建立超时时间,并
不包含模块初始化和模块注册检测时间,因此通常情况下
该时间非常短,例如不超过 200 毫秒。
该函数目前仅支持 MOTOROLA G20 or G24 GSM 模
块,该函数可工作于 9600bps 或者 4800bps 在线连接速度。
输入参数: SpeedType 成员说明 GSM 模块和远程 modem 的在线连接
速率的需要。对于当前模块 0、6 和 7 是有效的值,如果
赋予其他无效的值那么会自动赋予值 7。
在基于 GSM 连接的 PPP 通讯中,ServiceType 成员
被设置成 0。但是,在一般的基于 GSM 连接请求的远程
modem 异步通讯中,当函数 PortSends( )和 PortRecv( )使
用于直接访问 GSM 模块和远程 modem 之间的数据流时,
ServiceType 被设置成 1。
AsyncFormat 成员目前只支持 0 值,例如 8N1 格式。
TelNo 表示电话号吗,TelNo 指向以‘\0’结尾的字符串。
该字符串可以存放多个电话号码,每个电话号码之间
使用分号“;”隔开,例如“12345678;87654321”

另外该字符串不能是空字符串。
ErrMsg 错误信息输出,该指针要么为 NULL 要么至少有 50
个字节的缓冲,当该指针为 NULL 时表示不输出错误信
息。
在拨号和连接建立期间,GSM 信号图标以每秒钟一定
的频率持续闪动,在连接建立起来以后,蜂鸣器图标闪动
几次表明实际的相应连接速率,SpeedType 域用于当前连
接。例如,闪动 4 次表示建立的连接速度是 4800bps,5
次表示当前连接速度是 9600bps。
输出参数:
如果 GSM 连接在调用该函数后已经建立起来,第二次
调用该函数的时候见返回失败的结果柄挂断当前的连接。
如果给予任何通道的 PPP 连接已经建立,例如 modem
通道,其它的通道(如 GSM 通道)调用将失败。
在执行该函数期间,用户可以按“取消”键中断该函
数调用。
在拨号期间或者连接建立起来之后,LANPORT通道会被持
续占用,除非调用GsmOnHook()接口释放资源。

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 122/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

0—成功,呼叫连接已建立;
1—指针 TelNo 为空,或者是 TelNo 所指的字符串为空串;
2—GSM 已经连接;
3—PPP 连接已被其他连接占用;
4—打开端口失败,两个物理端口也许被其他资源占用了;
5—初始化 GSM 模块失败;
10—无 SIM 卡
11—需要 SIM 卡的 PIN 密码
返回: 12—需要 SIM 卡的 PUK 码,SIM 卡需要解锁才能使用;
32—网络注册已退出;
33—网络注册被拒绝;
34—不能注册
39—网络注册重试超限
50—按取消键异常
51—无载波,很有可能是失效代码
52—呼叫忙
其它—保留
GSM_CALL 的定义如下:
typedef struct
{
uchar IsSync; // 0—异步连接,1—同步连接
uchar ConnectTimeout;//连接超时时长,0-表示默认值 45 秒
uchar SpeedType;//0-表示 GSM 的默认最大速度,对于 // G20/G24 默认最
大速度是 9600 bps
// 1-1200,2-2400,3-4800,4-7200,5-9600,6-12000, 7- // 14400,8-19200,
9-24000 , 10-26400 , 11-28800 , 12-31200 , // 13-33600 , 14-48000 ,
注释: 15-56000bps, 0xff-自动波特率
uchar AsyncFormat; // 0-8N1,1-8E1,2-8O1, 3-N71,4-7E1,// 5-7O1
uchar IdleTimeout;//连接空闲自动挂机时长值单位:10 秒,// 填 0 表示不自
动挂机
uchar DialTimes; // 拨号时长,0—表示默认值 1
uchar DisableXonXoff;// XonXoff 软件流控,0-使能,1-禁// 止
uchar ServiceType; // 服务类型:0-PPP,1-通用异步,其他// 值保留
uchar Reserved[50]; // 保留,需全部填 0
}GSM_CALL;
P78、R50、P58、R30、R50-M、R100 不支持该 API

例子:
char tmpc, pool[2000],tmps[2000];
int tmpd,hd;
ushort dn,rn,
GSM_CALL cfg;

memset(&cfg, 0x00, sizeof(cfg) );

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 123/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

cfg.ConnectTimeout=60;//set a timeout longer than default value


cfg.ServiceType=0;//Select PPP service based on GSM link

tmpd=GsmCallModem(&cfg, “96169”,tmps);
if(tmpd)
{
ScrPrint(0,4,0,”GSM CALL FAILED:%d”,tmpd);
ScrPrint(0,5,0,”%s”,tmps);
DelayMs(3000);
return 1;
}

tmpd=NpppLogin(“96169”, “96169”);
if(tmpd)return 2;

hd=NpppOpen( “219.134.185.73”,2000,3000,0);
if(hd<0)return 3;

dn=1000;
memset(pool,0x55,dn);
tmpd=NpppWrite(hd, pool, dn);
if(tmpd!=dn)return 4;

tmpd=NpppRead(hd,tmps,sizeof(tmps));
if(tmpd<=0)return 5;

rn=tmpd;

NpppClose(hd);

GsmOnHook( );
return 0;

3.12.9 GsmCheck
原型: int GsmCheck(void);
功能: 检查当前 GSM 模块和远程 modem 的回路交换数据连接的连接状态。
输入参数: 无

输出参数: 无
0--GSM 模块是当前远程连接;
返回: 0x0b—GSM 模块不是当前的任何连接;
其他值---保留
 不需要输入参数。
注释:
 GSM 模块和远程 modem 连接建立起来以后,该状态会因为远程的挂起或者
百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 124/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

信号丢失而中断。驱动能够自动实时检测连接事件。
 在使用 PPP 进行通讯应用的时候,无需使用该函数。
 在 GSM 数据通讯应用的直接端口访问中,该函数可用于在发送或者接收
数据前检测当前连接状态。
P78、R50、P58、R30、R50-M、R100 不支持该 API

例子:
char tmpc, pool[2000],tmps[2000];
int tmpd,hd;
ushort dn,rn,
GSM_CALL cfg;

memset(&cfg, 0x00, sizeof(cfg) );
cfg.ConnectTimeout=60;//set a timeout longer than default value
cfg.ServiceType=1;//Select generic asynchronous communication
service based on GSM link
cfg.DisableXonXoff=1;//disable XON/XOFF software flow control
between the driver and
//GSM module

tmpd=GsmCallModem(&cfg, “96169”,tmps);
if(tmpd)
{
ScrPrint(0,4,0,”GSM CALL FAILED:%d”,tmpd);
ScrPrint(0,5,0,”%s”,tmps);
DelayMs(3000);
return 1;
}

//--to send 1000 bytes


tmpd=GsmCheck();
if(tmpd ==0x0b)return 2;//link is broken

dn=1000;
memset(pool,0x55,dn);
tmpc=PortSends(LANPORT,pool,dn);
if(tmpc)return 3;

//--to receive 1000 bytes


rn=0;
while(1)
{
tmpd=GsmCheck();
if(tmpd ==0x0b)return 4;//link is broken

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 125/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

tmpc=PortRecv(LANPORT,tmps+rn,0);
if(!tmpc)
{
rn++;
If(rn>=dn)break;
}
}

GsmOnHook( );
return 0;

3.12.10 GsmOnHook
原型: int GsmOnHook(void);
断开 GSM 模块和远程 modem 间的回路交换,然后关闭 GSM 模块先前占用
功能:
的物理端口和设置给 PPP 连接的 modem 通道。
输入参数: 无

输出参数: 无
0:通过摘机指令成功将 GSM 模块和远程 modem 断开;
1:打开 GSM 通道失败,通过硬件复位断开连接
返回:
2:未能完成摘机指令,通过硬件复位断开连接
其他:保留
 不需要输入参数。
 在通讯会话结束时,该函数至少要被调用一次,否则 GSM 模块和远程
modem 仍然保持连接并且所占资源未被释放。
注释:  即使该函数的返回值不为 0,断开连接和释放占用资源的行动仍然一直是
成功的,这就意味着在摘机过程中无论发生什么错误,通常应用程序都可
以忽略该函数的返回值。
P78、R50、P58、R30、R50-M、R100 不支持该 API
例子:
char tmpc, pool[2000],tmps[2000];
int tmpd,hd;
ushort dn,rn,
GSM_CALL cfg;

memset(&cfg, 0x00, sizeof(cfg) );
cfg.ConnectTimeout=60;//set a timeout longer than default value
cfg.ServiceType=0;//Select PPP service based on GSM link

tmpd=GsmCallModem(&cfg, “96169”,tmps);
if(tmpd)
{
ScrPrint(0,4,0,”GSM CALL FAILED:%d”,tmpd);
百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 126/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

ScrPrint(0,5,0,”%s”,tmps);
DelayMs(3000);
return 1;
}

tmpd=NpppLogin(“96169”, “96169”);
if(tmpd)return 2;

hd=NpppOpen( “219.134.185.73”,2000,3000,0);
if(hd<0)return 3;

dn=1000;
memset(pool,0x55,dn);
tmpd=NpppWrite(hd, pool, dn);
if(tmpd!=dn)return 4;

tmpd=NpppRead(hd,tmps,sizeof(tmps));
if(tmpd<=0)return 5;

rn=tmpd;

NpppClose(hd);

return 0;

3.12.11 NpppSetAuth
原型: int NpppSetAuth(ulong authent)
功能: 设置 PPP 登陆方式。
authent PPP 登陆方式
如下 4 种登陆方式:
#define PPP_ALG_PAP 0x1 /* PAP */
输入参数:
#define PPP_ALG_CHAP 0x2 /* CHAP */
#define PPP_ALG_MSCHAPV1 0x4 /* MS-CHAPV1 */
#define PPP_ALG_MSCHAPV2 0x8 /* MS-CHAPV2 */
输出参数: 无
0:成功
返回:
其他:参数错误
注释: P90、P78、R50、P58、R30、R50-M、R100 不支持该 API

例子:
NpppSetAuth(PPP_ALG_PAP | PPP_ALG_CHAP);

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 127/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

3.13 文件系统操作函数

本模块内的所有 API 对 P80、P90、P58 均适用,部分适用 R50、P78、R50-M 和 R30、


R100!
模块功能说明:本模块是实现文件系统相关操作的 API,主要包括创建文件、读、写、
删除文件、获取文件大小、获取文件信息、文件转换等功能。
P80 和 R50 使用文件系统的方式对内存进行管理,可以存放参数文件、交易记录、黑名
单等。在文件系统中保留一个系统参数文件(文件名为 SysPara,只能被 monitor 访问),用于
存放系统环境变量。P80 文件系统有(29+32)*64k bytes,最多能管理 256 个文件(0-255) ,
包括系统文件。系统文件有:系统参数文件、字库文件。
P80 和 R50 支持多应用,其中对文件操作的函数也有权限管理,某个应用只能访问其自
己的文件,调用时要注意每个函数的操作权限。每个应用都有各自的参数文件,文件名为
EnvFile。
当文件操作失败(返回-1)时,从全局变量 errno 中可读取失败的具体原因,errno 错误信
息编码宏定义如下表:
表 3-2 errno 错误信息编码宏定义说明
宏定义 值 注释
#define FILE_EXIST 1 文件已存在
#define FILE_NOEXIST 2 文件不存在
#define MEM_OVERFLOW 3
#define TOO_MANY_FILES 4 文件太多
#define INVALID_HANDLE 5 无效的文件句柄
#define INVALID_MODE 6
#define FILE_NOT_OPENED 8
#define FILE_OPENED 9
#define END_OVERFLOW 10
#define TOP_OVERFLOW 11
#define NO_PERMISSION 12
#define FS_CORRUPT 13
#define O_RDWR 0x01
#define O_CREATE 0x02
#define O_TRUNC 0x04
#define SEEK_CUR 0
#define SEEK_SET 1
#define SEEK_END 2

模块内数据结构如下:
typedef struct
{
unsigned char fid; /* 文件标识号 */
unsigned char attr; /* 文件的属主 */
unsigned char type; /* 文件类型 */
char name[17]; /* 文件名 */
百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 128/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

unsigned long length; /* 文件长度 */


} FILE_INFO;

3.13.1 open
原型: int open(char *filename, uchar mode)
功能: 只能打开当前应用的文件
filename 文件名,最多可以是 16 个字符,以‘\x00’结尾,超过
16 个字符的只取前 16 个。
输入参数:
mode 文件打开方式,O_RDWR 表示打开文件用于读/写,
O_CREATE 表示创建一个新的文件。
输出参数: 无
>=0:成功,返回句柄号(0—255)
-1:失败,错误码放在errno中(参照errno错误信息编码宏定义说明)
INVALID_MODE:mode 不为 O_RDWR/O_CREATE
FILE_NOEXIST:文件不存在
返回:
FILE_EXIST:当文件存在时以 O_CREATE 的方式打开
MEM_OVERFLOW:空间不足
TOO_MANY_FILES:文件句柄太多,超过 255,无法创建新文件
FILE_OPENED:文件已打开
如果以 O_CREATE | O_RDWR 的方式打开文件,若文件已存在,则以
注释: O_RDWR 的方式打开,否则创建该文件。已打开的文件可以重复打开,每次
打开后,文件指针移到文件开头。

3.13.2 ex_open
原型: int ex_open(char *filename, uchar mode,uchar* attr)
可以通过设置 attr 来访问应用管理器的文件,应用管理器也可以访问相应的
功能:
一般应用的文件。一个普通应用不能访问另一普通应用中的文件。
filename 文件名,最多可以是 16 个字符,以‘\x00’结尾,
超过 16 个字符的只取前 16 个。
mode 文件打开方式,O_RDWR 表示打开文件用于读/写,
输入参数: O_CREATE 表示创建一个新的文件。

Attr attr[0]设为 0x00 则访问应用管理器的文件,如果设


为 AppNum 则访问相应的应用文件。

输出参数:

返回: 同 open 函数的返回


以 O_CREATE 创建文件时只能创建当前应用的文件。
attr[0]表示文件的属主,attr[1]表示文件的类型。
文件属主值:
注释:
0xFF:监控程序(monitor)
0x00:应用管理器
0x01:应用 1
百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 129/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

0x02:应用 2

0x23:应用 23

文件类型:
Type 文件类型
0 应用程序管理器
1 应用程序
2 字库
3 库函数
4 用户文件
5 系统参数文件(固定名字)
6 应用参数文件
R30、R100 不支持该 API!

3.13.3 read
原型: int read(int fid, uchar *dat, int len)
功能: 读文件
fid 文件句柄号,最多可以有 256 个文件,所以 fid 可以取值
输入参数: 0—255。
len 要读取的数据字节数。

输出参数: dat 数据缓冲区,由应用程序来分配空间。


>=0:读取成功,返回实际读到的字节数。
-1:失败,错误码放在errno中(参照errno错误信息编码宏定义说明)
返回:
FILE_NOT_OPENED:文件未打开
INVALID_FILEID:无效的文件句柄
注释: 无

3.13.4 write
原型: int write(int fid, uchar *dat, int len)
功能: 写文件
fid 文件句柄号,最多可以有 256 个文件,所以 fid 可以取值
0—255。
输入参数: len 要写入的数据字节数。

dat 要写入的数据缓冲区。

输出参数: 无

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 130/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

>=0:写入成功,返回实际写入的字节数。
-1:失败,错误码放在errno中(参照errno错误信息编码宏定义说明)
返回: INVALID_FILEID:无效的文件句柄
FILE_NOT_OPENED:文件未打开
MEM_OVERFLOW:空间不足或文件句柄太多
注释: 无

3.13.5 close
原型: int close(int fid)
功能: 关闭文件
fid 文件句柄号,最多可以有 256 个文件,所以 fid 可以取值
输入参数:
0—255。
输出参数: 无
0:成功关闭文件
返回: -1:失败,错误码放在errno中。(参照errno错误信息编码宏定义说明)
INVALID_FILEID:无效的文件句柄
注释: 无

3.13.6 seek
原型: int seek(int fid, long offset, uchar fromwhere)
功能: 定位文件指针
fid 文件句柄号,最多可以有 256 个文件,所以 fid 可以取值
0—255。
fromwhere fromwhere 可 以 取 值 SEEK_CUR 、 SEEK_SET 和
SEEK_END。SEEK_CUR 表示从当前文件指针开始;
输入参数:
SEEK_SET 表示从文件头开始;SEEK_END 表示从文件
尾开始。
offset 从 fromwhere 指定的位置到要移到的位置的字节数(有符
号值) 。
输出参数: 无
0:成功
-1:失败,错误码放在errno中。(参照errno错误信息编码宏定义说明)
INVALID_FILEID:无效的文件句柄
返回:
FILE_NOT_OPENED:文件未打开
END_OVERFLOW:后移时超出文件长度的偏移
TOP_OVERFLOW:前移时出错
注释: 无

3.13.7 filesize
原型: long filesize(char *filename)
功能: 获取文件大小
百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 131/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

filename 文件名,最多可以是 16 个字符,以‘\x00’结尾,超过


输入参数:
16 个字符的只取前 16 个。
输出参数: 无
0:成功关闭文件
返回: -1:失败,错误码放在errno中。(参照errno错误信息编码宏定义说明)
INVALID_FILEID:无效的文件句柄
注释: 无

3.13.8 remove
原型: int remove(const char *filename)
功能: 删除文件
filename 文件名,最多可以是 16 个字符,以‘\x00’结尾,超过
输入参数:
16 个字符的只取前 16 个。
输出参数: 无
0:成功
-1:失败,错误码放在errno中。(参照errno错误信息编码宏定义说明)
返回:
FILE_OPENED:文件已打开
FILE_NOEXIST:文件不存在
注释: 无

3.13.9 freesize
原型: long freesize(void)
功能: 文件系统剩余存储空间大小
输入参数: 无

输出参数: 无
返回: 返回文件系统总共剩余的空间大小(字节数)

注释: 无

3.13.10 InitFileSys
原型: void InitFileSys(void)
功能: 文件系统初始化,P70-S 应用程序中不必调用.
输入参数: 无

输出参数: 无
返回: 无


注释:
R50、R30、R50-M、R100 不支持该 API!

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 132/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

3.13.11 Truncate
原型: int Truncate(int fid, int len)
功能: 截短文件
fid 文件句柄号,最多可以有 256 个文件,所以 fid 可以取值
输入参数: 0—255。
len 截短后的文件长度(字节为单位)。

输出参数: 无
0:成功截断。
-1:失败,错误码放在errno中。(参照errno错误信息编码宏定义说明)
NO_FILESYS:文件系统未建立
返回: INVALID_FILEID:无效的文件句柄
FILE_NOT_OPENED:文件未打开
TOP_OVERFLOW:长度小于 0
END_OVERFLOW:长度超出文件长度
该函数将文件截断为 len 长度,原文件中从 len 到结尾的内容全被截去。文件
注释:
指针移至截短后的文件的最后。

3.13.12 fexist
原型: int fexist(char *filename)
功能: 检查文件是否存在
filename 文件名,最多可以是 16 个字符,以‘\x00’结尾,超过
输入参数:
16 个字符的只取前 16 个。
输出参数: 无
-1:在当前应用中没有指定的文件
返回:
其它(0-255):文件序号
注释: 无

3.13.13 GetFileInfo
原型: int GetFileInfo(FILE_INFO* finfo[])
功能: 获取全部文件信息
输入参数: 无
finfo 存放返回的文件信息的缓冲区地址指针,调用函数必须分
输出参数: 配足够大的缓冲区以容纳可能返回的最大的文件数信息。
(sizeof(FILE_INFO)×256=7680 bytes)
>0:返回的文件数。
返回: -1:失败,错误码放在errno中。(参照errno错误信息编码宏定义说明)
NO_FILESYS :文件系统未建立
注释: 无

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 133/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

3.13.14 FileToApp
原型: int FileToApp(BYTE *strFileName)
功能: 将数据文件转换成应用程序,原有数据文件不会被删除。
输入参数: strFileName 数据文件名,此数据文件必须是应用程序的“bin”文件。

输出参数: 无
0:成功
-1:文件名指针 strFileName 为空
-2:读文件错误
-3:定位文件 strFileName 错误
-4:打开文件 strFileName 错误
返回:
-5:该普通文件不是应用程序文件
-6:没有应用程序存储空间
-7:创建应用程序文件错误
-8:打开应用程序文件错误
-9:定位应用程序文件错误
注释: 无

3.13.15 FileToParam
原型: int FileToParam(uchar *strSrcFileName, uchar *strAppName, int mode)
功能: 将数据文件转换成指定应用的参数文件(或者数据文件)

strSrcFileName 要转换的文件,转换后的参数文件(或者数据文件名)仍
然是 strSrcFileName
strAppName 转换后的参数文件(或者数据文件)所属应用程序名
输入参数: mode 转换方式
1:表示转换成参数文件
2:表示转换成数据文件
其他值:错误
输出参数: 无
0:表示转换成功
-1:文件名 strSrcFileName 为空
-2:文件名 strAppName 为空
-3:参数 mode 错误
返回:
-4:打开文件 strSrcFileName 错误
-5:应用程序 strAppName 不存在
-6:创建临时文件错误
-7:创建参数/数据文件错误
如果 mode=1,转换成参数文件的话,参数 strSrcFileName 要转换的文件名一
注释:
定是“EnvFile”。

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 134/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

3.13.16 FileToMonitor
原型: int FileToMonitor(BYTE *strFileName)
将数据文件转换成监控程序(覆盖原有监控程序),在转换的过程中会提示禁
功能:
止关机,转换成功后会提示用户关机。转换完成后原有数据文件让仍然存在。
输入参数: strFileName 要转存的普通文件名

输出参数: 无
0:成功
-1:文件名指针 strFileName 为空
-2:读文件错误
-3:定位文件 strFileName 错误
返回: -4:打开文件 strFileName 错误
-5:文件 strFileName 不是监控程序文件
-6:将监控程序写入 flash 时发生错误,可能是 flash 损坏了
-7:文件 strFileName 过大,不能转换成监控程序
-8:不符合安全要求
注释: 此函数成功执行后将不返回,重新启动后运行新的监控

3.13.17 ReadFontLib
原型: int ReadFontLib(ulong Offset,uchar *FontData, int ReadLen)
功能: 从字库文件中读取字库数据
Offset 文件偏移
输入参数:
ReadLen 需要读取的长度

输出参数: FontData 存储字库数据的缓冲


0:成功
返回:
-1:没有字库文件
读出的字库数据由应用程序处理。
注释:
R30、R100 不支持该 API!

3.13.18 DelAppFile
原型: int DelAppFile(uchar *AppName);
功能: 删除终端的一个应用和该应用所属的参数文件和用户文件
输入参数: AppName 删除的应用的名称,区分大小写。最大 32byte,0x00 结尾

输出参数: 无
0:成功
返回: -1:参数错误
-2:找不到该应用
注释: 应用名称与应用程序项目中 AppInfo 设定的一致。英文区分大小写。
百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 135/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

如果删除的应用是当前的应用,则在重新启动后,无法装载该应用。
P80 已增加
R50、R30、R50-M、R100 不支持该 API!

3.14 环境变量操作函数

本模块内的所有 API 对 P80、P90、P78、R50、P58、R50-M、R30 均适用!


模块功能说明:本模块是实现环境变量相关操作的 API,主要包括读、写环境变量功能。
在 P80、P90、P78、R50、R50-M 系统中,有专门的参数变量文件来存放应用的变量。
应用可以使用系统提供的两个函数来使用设置好的变量。环境变量是存放在文件系统中的一
个文件中,该文件名为 EnvFile。每个应用都有这个文件名的文件,每个应用只能对当前应用
的参数文件进行读写。为了方便使用环境变量,提供对环境变量读写的函数,而不用对文件
进行操作。
环境变量文件内容的格式是:以记录来存放。每条记录的格式为:参数名称(8 字节),
包括‘\0’字符结尾;参数值(120 字节),包括‘\0’字符结尾。
模块内数据结构:无

3.14.1 GetEnv
原型: uchar GetEnv(char *name, uchar *value)
功能: 无
name 参数名称,最多可以是 7bytes,超过 7bytes 的名称只取前
输入参数:
7bytes
输出参数: value 参数值,空间由应用程序分配
0:成功
返回:
1:该参数名称没找到
注释: 无

3.14.2 PutEnv
原型: uchar PutEnv(char *name, uchar *value)
功能: 无
name 参数名称,最多可以是 7bytes,超过 7bytes 的名称只取前
输入参数: 7bytes
value 参数值,空间由应用程序分配

输出参数: 无
0:成功
返回: 1:参数非法
2:空间不足
注释: 如果写入的环境变量已存在,则覆盖。参数 name 的值不允许为 NULL 或“”

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 136/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

3.15 加解密函数

本模块内的所有 API 对 P80、P90、P78、R50、P58、R50-M 均适用,对 R30、R100 部


分适用!
模块功能说明:本模块是实现加解密相关操作的 API,主要包括 DES、HASH 和 RSA 加密
算法。
模块内数据结构:无

3.15.1 des
原型: void des(uchar *input, uchar *output,uchar *deskey, int mode)
功能: 计算 8 字节的 des 加解密运算
Input 8 字节的输入数据。
输入参数: deskey 8 字节 des 密钥
mode 0:解密;1:加密
输出参数: output 8 字节的输出数据。
返回: 无
注释: 该函数根据 flag 选择进行加密或解密运算

3.15.2 Hash
原型: void Hash(uchar* DataIn, uint DataInLen, uchar* DataOut)
功能: 对任一长度的输入数据,输出 20 字节的 hash 结果
DataIn 输入数据缓冲区指针
输入参数:
DataInLen 输入数据长度(以字节为单位)
输出参数: DataOut 输出数据缓冲区指针
返回: 无
该函数采用安全 Hash 算法 SHA-1(根据 ISO/IEC 10118-3 或 FIPS 180-1)
注释:
R30、R100 不支持该 API!

3.15.3 RSARecover
int RSARecover(uchar *pbyModule,uint dwModuleLen,uchar *pbyExp,
原型:
uint dwExpLen,uchar *pbyDataIn,uchar *pbyDataOut)
功能: 进行 RSA 加解密运算
pbyModule 存放 RSA 运算的模缓冲区指针。 高位在前,低位在后
dwModuleLen 模长度(以 unsigned char 为单位,取值范围是 1~256) 。
pbyExp 存放 RSA 运算的指数缓冲区指针。高位在前,低位在后。
输入参数:
dwExpLen 指 数 长 度 ( 以 unsigned char 为 单 位 , 必 须 满 足
dwExpLen <= dwModuleLen)
pbyDataIn 输入数据缓冲区指针,长度与模长度同
输出参数: pbyDataOut 输出数据缓冲区指针,长度与模长度同

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 137/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

0:表示成功
-1:表示输入参数错误,输入参数的指针为空,错误;
-2:表示输入的模的长度 dwModuleLen 或者指数长度 dwExpLen 为 0,错误;
返回:
-3:表示模的长度 dwModuleLen 或者指数的长度 dwExpLen 过大,错误;
-4:表示大数 pbyDataIn 大于或者等于大数 pbyModule,错误;
-5:表示 dwExpLen 大于 dwModuleLen,错误
该函数进行 RSA 加密或解密运算,加密或解密通过选用不同的密钥实现。
如(pbyModule, pbyExp)选用私有密钥,则进行加密;如选用公开密钥,则进
行解密。上面各缓冲区参数均为高位在前,以 unsigned char(8 bits)为单位,该
注释: 函数可实现长度不超过 2048 bits(256 字节) 的 RSA 运算。
大 数 DataIn 必 须 小 于 大 数 Modul ( 即 满 足 memcmp(DataIn,Modul,
ModulLen)<0),否则不能得到正确的运算结果。
R30、R100 不支持该 API!

3.16 PED 函数

本模块内的所有 API 对 P80、P58 均适用,对 P90 部分适用,对 P78、R50、R30、R50-M、


R100 不适用!

模块功能说明:本模块是实现 PED 操作的 API。

PED 存储密钥的内存分为“主密钥区”、“DES 密钥区”、“工作密钥区”,其中:

 主密钥区有 800 个字节,可存储 100 个单 DES 或 50 个 3DES(16 字节) 或 33 个 3DES(24


字节)主密钥;

 工作密钥区有 800 个字节,可存储 100 个单 DES 或 50 个 3DES(16 字节) 或 33 个


3DES(24 字节)工作密钥;

 DES 密钥区有 800 个字节,可存储 100 个单 DES 或 50 个 3DES(16 字节) 或 33 个


3DES(24 字节)工作密钥。

密钥索引(keyID)是 PED 存储的主密钥或工作密钥的索引。

 密钥索引(keyID)和实际的物理存储器之间存在着一一对应的映射关系。假设 keyid
为主密钥,则 keyid=1 对应主密钥区开始的 8 个字节存储空间,keyid=2 对应主密钥
区的第二个 8 字节存储空间,以此类推,keyid=100 对应主密钥区的最后 8 字节存储
空间。对于工作密钥、DES 密钥有着同样的映射关系,如假设 keyid 为工作密钥,则
keyid=1 对应工作密钥区开始的 8 个字节存储空间,keyid=2 对应工作密钥区的第二
个 8 字节存储空间,以此类推,keyid=100 对应工作密钥区的最后 8 个字节存储空间。
其他的索引值为非法。

注意事项:

 PED 中的密钥是存在 SRAM 中,应用层无法随机访问该区域,并且在每次 POS 更新


与添加应用时都会先自动删除 SRAM 中现有的密钥,达到密钥的安全保护。

 PED 中所有有关输入接口规定:先由应用层清显示屏,并显示提示信息,再调用
百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 138/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

SCRGOTOXY 光标定位函数来设定输入字符所占用的行数与对齐方式(当 X<64 时


采用左对齐方式,否则为右对齐方式);对于有超时限定的要求请先调用输入操作超
时设置,最后调用相应的输入接口函数。

模块内数据结构:无

3.16.1 PEDInputTimeOut
原型: void PEDInputTimeOut(ulong timeoutsec)
功能: 设置输入操作(如金额,PIN,字符)时间隔超时间(单位:秒)
timeoutsec =0:无超时
输入参数:
>0:超时时间(单位:秒)
输出参数: 无
返回: 无
 系统默认为无超时
注释:  设置该函数同时会对 GETSTRING 接口起作用
P78、R50、R30、R50-M、R100 不支持该 API!

3.16.2 PEDInput
原型: uchar PEDInput(uchar *str, uchar min, uchar max, uchar mode)
功能: 在 PED 屏幕上用 mode 方式输入大于等于 min,小于等于 max 的字符串
min 必须输入的长度
max 最大能输入的长度 [最大 40]
输入参数:
mode =1:输入时,输入时只显示‘*’
=0:输入时,输入并显示该字符
输出参数: str 输出的字符串,以‘\0’结尾
0x00 正确
0x03 非法模式
0x05 字符串可输入长度范围非法
返回:
0x06 操作员[或用户]取消输入
0x07 输入超时
0xce PED 已锁
可用来输入明文 PIN,显示符号用“*”表示。
注释: 由于该接口存在不安全隐患,今后会取消该函数。
P78、R50、R30、R50-M、R100 不支持该 API!

3.16.3 PEDGetPwd
uchar PEDGetPwd(uchar PinKeyID, uchar min, uchar max, uchar *cardno,
原型:
uchar *pin,uchar TwiceInput)
功能: 在 PED 屏幕上输入长度为[min,max]的密码
TwiceInput =0:PED 提示输入 1 次密码
输入参数: =1[非 0]:PED 提示输入 2 次密码
PinKeyID 计算 PIN 的工作密钥

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 139/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

min 密码可输入最小长度 [0=<min<=14]


max 密码可输入最大长度 [0=<max<=14 && max>=min]
cardno 经过移位处理的 16 位卡号 [ASCII 码]
输出参数: pin 加密的密码
0x00 正确
0x02 密钥索引非法
0x03 非法模式
0x05 字符串可输入长度范围非法
0x06 操作员[或用户]取消输入
返回:
0x07 输入超时
0x09 两次密码不一致
0x0a 用户未输入密码(输入密码的长度为 0)
0x0b 指定的密钥不存在
0xce PED 已锁
 TwiceInput=0 时,该函数触发用户输入账户密码。在输入密码并按“确
认”键后,密码键盘用 ANSI X9.8 标准和 PinKeyID 指定的 PIN 密钥来对
PIN 进行加密。
 TwiceInput=1 时,该函数触发用户输入账户密码,在输入密码并按“确
认”键后,用户需再输一遍密码,如果两次输入的密码一样,则密码键
盘用 ANSI X9.8 标准和选定的工作密钥来对 PIN 进行加密,否则报错。
注释:  如果 min=0 且无任何输入时,在 PED 上直接按“确认键” ,函数将返回
0x0a。
 显示屏提示信息由应用层自由决定,该函数只读取当前光标所处的行值,
并 在 该 行 显 示 大 字 字 符 的 星 号 ( 占 两 行 )。 在 使 用 该 函 数 前 调 用
ScrGotoxy(x,y)光标定位函数来设定输入字符所占用的行号。
 卡号的长度必须达到 16 位。
P78、R50、R30、R50-M、R100 不支持该 API!

3.16.4 PEDGetPwd_3Des
uchar PEDGetPwd_3Des(uchar PinKeyID, uchar min, uchar max, uchar
原型:
*cardno, uchar *bPinLen,uchar *pin)
功能: 输入长度为[min,max]的密码,采用 3DES 加密。
PinKeyID 计算 PIN 的工作密钥(工作密钥区)
min 密码可输入最小长度[0=<min<=14]
输入参数:
max 密码可输入最大长度[0=<max<=14 && max>=min]
cardno 经过移位处理的 16 位卡号(ASCII 码)
bPinLen 密码长度[min=<bPinLen <=max]。
输出参数:
pin 加密的密码
0x00 正确
0x02 密钥索引非法
返回:
0x03 非法模式
0x05 字符串可输入长度范围非法

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 140/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

0x06 操作员[或用户]取消输入
0x07 输入超时
0x09 两次密码不一致
0x0a 用户未输入密码(输入密码的长度为 0)
0x0b 指定的密钥不存在
0xce PED 已锁
0xff 读密钥错误
注释: P78、R50、R30、R50-M、R100 不支持该 API!

3.16.5 PEDWriteMKey
原型: uchar PEDWriteMKey(uchar KeyID, uchar mode, uchar *Key)
功能: 将主密钥 Key[明文]存储在 KeyID 指定的主密钥区中
KeyID 存储主密钥的索引 [1~100]
mode =0x01:Key 为单 DES 密钥 [8 字节]
输入参数: =0x03:Key 为 3DES 密钥 [16 字节]
=0x07:Key 为 3DES 密钥 [24 字节]
Key 密钥值
输出参数: 无
0x00 正确
0x02 密钥索引非法
返回: 0x03 非法模式
0xce PED 已锁
0xf0 校验密钥空间失败(写入失败)
注释: P78、R50、R30、R50-M、R100 不支持该 API!

3.16.6 PEDWriteDKey
原型: uchar PEDWriteDKey(uchar DESKeyID, uchar mode, uchar *Key)
功能: 将 DES 密钥 Key[明文]存储在 DESKeyID 指定的 DES 密钥区中
DESKeyID 存储 DES 密钥的索引 [1~100]
mode =0x01:Key 为单 DES 密钥 [8 字节 ]
输入参数: =0x03:Key 为 3DES 密钥 [16 字节]
=0x07:Key 为 3DES 密钥 [24 字节]
Key 密钥值
输出参数: 无
0x00 正确
0x02 密钥索引非法
返回: 0x03 非法模式
0xce PED 已锁
0xf0 校验密钥空间失败(写入失败)
注释: P78、R50、R30、R50-M、R100 不支持该 API!

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 141/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

3.16.7 PEDWriteWKey
uchar PEDWriteWKey(uchar MKeyID, uchar WKeyID, uchar mode, uchar
原型:
*Key)
用 MKeyID 指定的主密钥对工作密钥 Key(密文)进行 mode 方式的解密后,
功能:
将结果存储在 WKeyID 指定的工作密钥区中
MKeyID: 主密钥的索引 [1~100 或 0]
WKeyID: 存储工作密钥的索引 [1~100]
Mode =0x01:DES 加密
=0x03:3DES(16 字节)加密
输入参数: =0x07:3DES(24 字节)加密
=0x81:DES 解密
=0x83:3DES(16 字节)解密
=0x87:3DES(24 字节)解密
Key 密钥值
输出参数: 无
0x00 正确
0x02 密钥索引非法
0x03 非法模式
返回:
0x0b 指定的密钥不存在
0xce PED 已锁
0xf0 校验密钥空间失败(写入失败)
MkeyID=0 时,不对 Key 进行加解密,而直接将 Key 存储到 WKeyID 指定的
注释: 位置
P78、R50、R30、R50-M、R100 不支持该 API!

3.16.8 PEDDeriveKey
uchar PEDDeriveKey(uchar MKeyID, uchar WKeyID1, uchar WKeyID2,
原型:
uchar mode)
用[MKeyID&0x7F]指定的主密钥或工作密钥对 WKeyID1 指定的工作密钥进
功能:
行 mode 方式的分散后,将结果存储在 WKeyID2 指定的工作密钥区中。
MKeyID 主密钥或工作密钥的索引号[1~100]与标志位相或标志位是用
MKeyID 的最高位来区分的,即
如果 MKeyID =索引号,则用主密钥来发散
如果 MKeyID =索引号|0x80,则用工作密钥来发散
WKeyID1 需分散的工作密钥的索引(1~100)
WKeyID2 存储工作密钥的索引(1~100)
输入参数:
mode =0x01:DES 加密
=0x03:3DES(16 字节)加密
=0x07:3DES(24 字节)加密
=0x81:DES 解密
=0x83:3DES(16 字节)解密
=0x87:3DES(24 字节)解密

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 142/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

输出参数: 无
0x00 正确
0x02 密钥索引非法
返回: 0x03 非法模式
0xce PED 已锁
0x0b 指定的密钥不存在
当使用工作密钥来发散时,不支持 3des 算法。
注释:
P78、R50、R30、R50-M、R100 不支持该 API!

3.16.9 PEDDes
uchar PEDDes(uchar DESKeyID, uchar mode, uchar *datain, uchar
原型:
*dataout)
用 DESKeyID 指定的 DES 密钥对 datain 进行 mode 方式的加密/解密,结果存
功能:
储在 dataout 中
DESKeyID: 工作密钥的索引 [1~100]
mode =0x01:DES 加密
=0x03:3DES(16 字节)加密
=0x07:3DES(24 字节)加密
输入参数:
=0x81:DES 解密
=0x83:3DES(16 字节)解密
=0x87:3DES(24 字节)解密
datain 需加密的数据
输出参数: dataout 加密结果
0x00 正确
0x02 密钥索引非法
返回: 0x03 非法模式
0xce PED 已锁
0x0b 指定的密钥不存在
注释: P78、R50、R30、R50-M、R100 不支持该 API!

3.16.10 PEDMac
uchar PEDMac(uchar WKeyID, uchar mode, uchar *datain, ushort inLen,
原型:
uchar *macout, uchar flag)
用 WKeyID 指定的工作密钥对 datain 进行 MAC 运算,将结果存储在 macout
功能:

WKeyID: 工作密钥的索引(1~100)
datain 需进行 MAC 运算的数据包 [输入]
inLen MAC 运算的数据包的长度 [inLen <2048]
输入参数: mode MAC 算法:
0x01:DES 加密
0x03:3DES(16 字节)加密
0x07:3DES(24 字节)加密

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 143/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

flag 0x00:算法 1
非 0:算法 2
输出参数: macout MAC 输出(8 字节)
0x00 正确
0x01 数据包长度非法
0x02 密钥索引非法
返回: 0x03 非法模式
0xce PED 已锁
0x0b 指定的密钥不存在
0x0c 内存中的密钥校验错误
 将报文数据分割成若干 8 个字节的 BLOCK,最后一个 BLOCK 不满 8 个
字节则后补 0x00。
 算法 1: 将 BLOCK1 用 MAC 密钥做 DES/3DES 加密,加密结果与 BLOCK2
进行逐位异或后再用 MAC 密钥做 DES/3DES 加密,依次进行得到 8 字
注释: 节的加密结果。
 算法 2:将 BLOCK1 和 BLOCK2 进行逐位异或,异或结果与 BLOCK3
进行逐位异或,依次进行,最后得到 8 字节的异或结果,将该结果用 MAC
密钥进行 DES/3DES 加密运算。
P78、R50、R30、R50-M、R100 不支持该 API!

3.16.11 EPSPEDAmount
uchar EPSPEDAmount(uchar point_mode, uchar prompt_mode, uchar min,
原型:
uchar max, uchar *Amt)
功能: [EPS 专用函数] 输入金额
min 字符串最小长度 [为 0 且没有任何输入时,按 ENTER 键将返
回]
max 字符串最大长度 [max<=14&&max>=min]
输入参数: point_mode 0X00:小数点后有两位小数;
0X01:小数点后有三位小数;
0X02:无小数点;
prompt_mode 该参数暂时无效[由于无提示信息,可为任意值]。

输出参数: Amt 输入的金额


0x00 正确
0x02 无密钥索引输入参数
0x03 非法模式
返回: 0x05 字符串可输入长度范围非法
0x06 操作员[或用户]取消输入
0x07 输入超时
0xce PED 已锁

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 144/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

 当 min=0 且没有输入时直接在 PED 上按“确定键”,这时返回的金额如下:


 当 Point_mode=0x00 时,Amt 中的内容为“0.00”
注释:  当 Point_mode=0x01 时,Amt 中的内容为“0.000”
 当 Point_mode=0x02 时,Amt 中的内容为“0”
P78、P90、R50、R30、R50-M、R100 不支持该 API!

3.16.12 EPSPEDLoadTMK
uchar EPSPEDLoadTMK(uchar WkeyID1, uchar *TmpKey, uchar *KTMK,
原型:
uchar *ReferCode)
[EPS 专用函数] 由 POS 产生临时 TmpKey,上传主机,取回密文 KTMK, 和临
时加密参考值 ReferCode,由临时 KEY 对密文 KTMK 解密,得 TMK,明文 TMK
功能:
应符合奇校验;TMK 对"\x12\x34\x56\x78\x90\x12\x34\x56"加密,加密后的
结果应与加密参考值应相等;之后将明文 TMK 写入 WkeyID1 指定的位置。
WkeyID1 TMK 将写入的位置序号(1—100)。
TmpKey POS 产生临时 KEY[8 Bytes]。
输入参数: KTMK 从主机取回密文[8 Bytes]。
ReferCode 主机用 KTMK 的明文加密
"\x12\x34\x56\x78\x90\x12\x34\x56"后,返回的值[8 Bytes]。
输出参数: 无
0x00 正确
0x02 密钥索引非法
0x0d 奇校验错
返回:
0x0e TMK 错
0xce PED 已锁
0x0b 指定的密钥不存在
EPS 的主密钥(TMK)、PIN 密钥(TPK)、MAC 密钥(MAK)都放在工作密钥区,
注释: 因此在编排密钥序号时必须注意这种情况,否则可能将其它的密钥冲掉。
P78、P90、R50、R30、R50-M、R100 不支持该 API!

3.16.13 EPSPEDLoadKey
原型: uchar EPSPEDLoadKey(uchar WKeyID1, uchar WKeyID2, uchar *KKEY)
[EPS 专用函数] 用 WkeyID1 处的 TMK 对主机下传的新的密文解密,明文应
符合奇校验,之后将明文结果写入 WkeyID2 位置。有两种情况,分别如下:
1.更新 TMK[WkeyID1 等于 WkeyID2 时]:主机下传新的密文 KKEY,用
WKeyID1 指定的明文 TMK 对 KKEY 解密,得到明文 TMK2,TMK2 应符合
功能:
奇校验,之后将明文 TMK2 写入 WkeyID2 位置,即覆盖明文 TMK1。
2.下载 TPK[WkeyID1 不等于 WkeyID2 时]:主机下传新的密文 KKEY,用
WkeyID1 处的 TMK 对其解密,得到的明文为 TPK,TPK 应符合奇校验,
之后将明文 TPK 写入 WkeyID2 位置。
WkeyID1 用来解密或被更新的 TMK 的位置序号(1~100)。
输入参数: WkeyID2 待装载密钥的位置序号(1~100)。
KKEY 主机下传的密文[8 Bytes]。

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 145/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

输出参数: 无
0x00 正确
0x02 密钥索引非法
返回: 0x0d 奇校验错
0xce PED 已锁
0x0b 指定的密钥不存在
EPS 的主密钥(TMK)、PIN 密钥(TPK)、MAC 密钥(MAK)都放在工作密钥区,
注释: 因此在编排密钥序号时必须注意这种情况,否则可能将原密钥冲掉。
P78、P90、R50、R30、R50-M、R100 不支持该 API!

3.16.14 EPSPEDGetMAC1
原型: uchar EPSPEDGetMAC1(uchar MKeyID, uchar *Random)
[EPS 专用函数] 由 POS 送入 Random[8bytes,符合奇校验,
用做“输出 MAK”],
功能:
用 MkeyID 处的 TMK 对其加密,结果仍存放在 Random[8bytes]中。
MkeyID 用来加密的 TMK 的位置序号(1—100)。
输入参数:
Random 随机数[输入数据]或返回的加密结果 [输出数据] [8bytes]。
输出参数: Random 随机数[输入数据]或返回的加密结果 [输出数据] [8bytes]。
0x00 正确
0x02 密钥索引非法
返回: 0x0d 奇校验错
0xce PED 已锁
0x0b 指定的密钥不存在
注释: P78、P90、R50、R30、R50-M、R100 不支持该 API!

3.16.15 EPSPEDUpdateTPK
uchar EPSPEDUpdateTPK(uchar WKeyID1,uchar WKeyID2, uchar
原型:
*pin_block, uchar *ISN, uchar *new_TPK)
[EPS 专用函数] 当加密的数据包上送主机后,如果主机端的 TPK 已经被更改
或需要重新计算 pin block 时,将调用此函数。具体过程为:
1.WKeyID1 与 WKeyID2 相等时[即 WKeyID1 为 TPK 的位置序号],PED 用原 TPK
对 pin_block 按 X3.92 解密得到明文 PIN,之后用原 TPK、ISN 对明文 PIN
按 X3.92 加密,返回新的 pin_block.。
功能:
[注:由于不更换 TPK,所以参数 new_TPK 中可以不填充任何数据]
2.当 WKeyID1 与 WKeyID2 不相等时[即 MKeyID1 为 TMK 的位置序号、WKeyID2
为 TPK 的位置序号], PED 用原 TPK 对 pin_block 按 X3.92 解密得到明文 PIN,
再用 TMK 解密 new_TPK 得到明文 TPK[应符合奇校验]并覆盖原 TPK,之后用
明文 TPK,ISN 对明文 PIN 按 X3.92 加密,返回新的 pin_block.。
WKeyID1 TMK / TPK 的位置序号(1—100)。
WKeyID2 TPK 的位置序号(1—100)。
输入参数: pin_block PIN 加密包[8bytes]。更新后的密码加密包也由它返回 [输入、输
出数据]。
ISN 交易序列号[6bytes 的 ASCII 码]。

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 146/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

new_TPK 主机下传的更新的 TPK 密文[8bytes]。


pin_block PIN 加密包[8bytes]。更新后的密码加密包也由它返回 [输入、输
输出参数:
出数据]。
0x00 正确
0x02 密钥索引非法
返回: 0x0d 奇校验错
0xce PED 已锁
0x0b 指定的密钥不存在
EPS 的主密钥(TMK)、PIN 密钥(TPK)、MAC 密钥(MAK)都放在工作密钥区,
注释: 因此在编排密钥序号时必须注意这种情况,否则可能将原密钥冲掉。
P78、P90、R50、R30、R50-M、R100 不支持该 API!

3.16.16 EPSPEDSetMAC2
uchar EPSPEDSetMAC2(uchar WKeyID1,uchar WKeyID2,uchar *MAC2,
原型:
uchar *rsp_data, uchar rsp_data_len, uchar *rsp_MAC)
[EPS 专用函数] 如果主机端的 MAC2[“输入 MAK”]已经被更改,在主机返回
数据时则应先将调用此函数。具体过程为:
功能: 用 WKeyID1 处的 TMK 对主机下传的新的密文 MAC2 解密,明文 MAC2 应符
合奇校验,用明文 MAC2 对主机下传的数据 rsp_data 做 MAC 运算,其结果前
4byte 应与主机下传的 rsp_MAC 值相等,之后将明文 MAC2 写入 WKeyID2 位置。
WKeyID1 用来解密的 TMK 的位置序号(1~100)。
WKeyID2 MAC2 的位置序号(1~100)。
MAC2 主机下传的新的 MAC2 密文[8bytes]
输入参数:
rsp_data rsp_data_len Bytes 主机下传的数据。
rsp_data_len 下传数据 rsp_data 的长度[rsp_data_len<=233]。
rsp_MAC 主机下传的用来比较的数据[8 字节,ASCII 码串]。
输出参数: 无
0x00 正确
0x01 数据包长度非法
0x02 密钥索引非法
返回: 0x0d 奇校验错
0x0f "输入 MAC"错
0xce PED 已锁
0x0b 指定的密钥不存在
 如果要使用该功能,则在使用 PEDMac()函数时,Mac 运算数据包的长度
应不超过 233 个字节。
 EPS 的主密钥(TMK)、PIN 密钥(TPK)、MAC 密钥(MAK)都放在工作密钥区,
注释: 因此在编排密钥序号时必须注意这种情况,否则可能将原密钥冲掉。
 在得到主机下传的用来比较的数据后,则需将其前 4 个字节转换成 ASCII
码串,然后将这 8 字节的 ASCII 码拷贝到参数 rsp_MAC。
P78、P90、R50、R30、R50-M、R100 不支持该 API!

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 147/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

3.16.17 EPSPEDVerifyTMK
原型: uchar EPSPEDVerifyTMK(uchar MKeyID, uchar *VerifyData)
[EPS 专用函数]用 MkeyID 指定的 TMK 对"\x12\x34\x56\x78\x90\x12\x34\x56"
功能:
加密,并返回结果。
输入参数: MkeyID 用来加密的 TMK 的位置序号(1~100)。
输出参数: VerifyData 加密后的结果(8byte)
0x00 正确
0x02 密钥索引非法
返回:
0xce PED 已锁
0x0b 指定的密钥不存在
注释: P78、P90、R50、R30、R50-M、R100 不支持该 API!

3.16.18 EPSPEDGetPwd
uchar EPSPEDGetPwd(uchar PinKeyID, uchar min, uchar max, uchar *ISN,
原型:
uchar *pin)
功能: [EPS 专用函数]输入长度为[min,max]的密码
PinKeyID 计算 PIN 的工作密钥 (1~100)
min 密码可输入最小长度 [0=<min<=6]
输入参数:
max 密码可输入最大长度 [0=<max<=6&&min<=max]
ISN 交易流水号 ISN [6 Bytes,ASCII 码串]。
输出参数: pin 加密的密码输出 [输出数据,8bytes]
0x00 正确
0x02 密钥索引非法
0x05 字符串可输入长度范围非法
0x06 操作员[或用户]取消输入
返回:
0x07 输入超时
0x0a 用户未输入密码(输入密码的长度为 0)
0xce PED 已锁
0x0b 指定的密钥不存在
注释: P78、P90、R50、R30、R50-M、R100 不支持该 API!

3.16.19 PED_PassWordEncrypt
原型: uchar PED_PassWordEncrypt(uchar deskeyid,uchar *oldpin,uchar *despin)
[EPS 应用]用 DESKEYID 指定的 DES 密钥与 PED 中固定的 KEY 对 OLDPIN 进行 DES
功能:
加密,并将结果存在 DESPIN 中。
deskeyid PED 中 DES 密钥索引号
输 入 参
oldpin 没有加密的 PWD 串(ASCII 码,长度<=16)
数:

输 出 参 despin 加密的 PWD 串(8 字节)


数:
02 密钥索引号错误
返回:
05 参数(PWD 串)非法
百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 148/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

00 成功
 由于 EPS 应用禁止当 LCD 显示敏感字符或图形字符(PIN,PASSWORD,密
码)时通过按键来获取未加密的数据。
 该函数与下面输入函数配合使用来达到输入修改用户管理密钥功能。
注释:
 该函数将初始化明文管理密码加密成与输入接口获得的数据进行密码比
较与确认。
P78、P90、R50、R30、R50-M、R100 不支持该 API!

3.16.20 PED_PassWordInput
Uchar PED_PassWordInput(uchar deskeyid,uchar min,uchar max,uchar
原型:
*inpin)
[EPS 应用]用 DESKEYID 指定的 DES 密钥与 PED 中固定的 KEY 对输入的 PWD 进
功能:
行 DES 加密,并将结果存在 INPIN 中。
deskeyid PED 中 DES 密钥索引号
min 指定输入的 PWD 的最小字节数。
输入参数:
max 指定输入的 PWD 的最大字节数(<=16)

输出参数: inpin 加密的 PWD 串(8 字节)


02 密钥索引号错误
05 参数非法
0A 输入密钥长度为 0
返回:
06 操作员取消输入
07 输入超时
00 成功

注释: P78、P90、R50、R30、R50-M、R100 不支持该 API!

3.16.21 SYLPEDGetPwd
uchar SYLPEDGetPwd(uchar PinKeyID, uchar min, uchar max, uchar
原型:
*bPinLen,uchar *pin_block)
功能: [深银联专用函数] 在 PED 上输入长度为[min,max]的密码
PinKeyID 计算 PIN 的工作密钥(1~100)
输入参数: min 密码可输入最小长度:[0=<min<=6]
max 密码可输入最大长度:[0=<max<=6&&min<=max]
bPinLen 密码长度:[0=<bPinLen <=6]。
输出参数:
pin_block 加密的密码输出[8bytes]
0x00 正确
0x02 密钥索引非法
0x05 字符串可输入长度范围非法
返回:
0x06 操作员[或用户]取消输入
0x07 输入超时
0xce PED 已锁

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 149/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

0x0b 指定的密钥不存在
 深银联自定义的算法:密码长度不超过 6Bytes,PIN_BLOCK 格式为
“FFFFFFFFFFPPPPPP”
,密码右对齐,如果密码长度为 0,则密码用 6
个‘0’填充,否则不足 6Bytes 则用‘F’填充,将 PIN_BLOCK 转换成
注释:
BCD 码后用 PIN 密钥加密,结果存放在 pin_block 中;
 该函数会返回密码的长度,方便应用程序对非法密码长度的控制。
P78、R50、R30、R50-M、R100 不支持该 API!

3.16.22 SYLPEDVerifyDerive
uchar SYLPEDVerifyDerive(uchar MKeyID, uchar WKeyID, uchar
原型:
*new_WKey, uchar *KeyCv, uchar mode)
[深银联专用函数] 用 MKeyID 指定的主密钥对 new_WKey 进行 mode 方式的
加解密,得到新密钥,用此密钥对“\x00\x00\x00\x00\x00\x00\x00\x00”作 DES
功能:
加密,将结果与密钥校验数据比较,如果相同则将新密钥写入 WkeyID 指定
的工作密钥区。
MKeyID 存储主密钥的索引(1~100)
WKeyID 发散后的密钥存储索引(1~100)
new_WKey 用来验证和发散的密钥[8Bytes,密文]
KeyCv 密钥校验数据[8Bytes]。
mode 加解密模式:
输入参数: 0x01:DES 加密
0x03:3DES(16 字节)加密
0x07:3DES(24 字节)加密
0x81:DES 解密
0x83:3DES(16 字节)解密
0x87:3DES(24 字节)解密
输出参数: 无
0x00 正确
0x02 密钥索引非法
0x03 非法模式
返回:
0x11 密钥检验不合法
0xce PED 已锁
0x0b 指定的密钥不存在
注释: P78、R50、R30、R50-M、R100 不支持该 API!

3.16.23 SYLPEDCalcPinBlock
uchar SYLPEDCalcPinBlock(uchar MKeyID,uchar PinKeyID,uchar
原型:
*pin_block,uchar *new_TPK,uchar mode)
[深银联专用函数] 先用 PinKeyID 指定的工作密钥对密文 pin_block 进行解密,
功能: 然后用 MKeyID 指定的主密钥对 new_TPK 进行 mode 方式的加解密,得到新
密钥,用此密钥对明文 pin_block 加密。
输入参数: MKeyID 存放主密钥[TMK]的索引

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 150/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

PinKeyID 存放 PIN 密钥[TPK]的索引


pin_block PIN 加密数据[8Bytes,密文]
new_TPK 新的 PIN 密钥[8Bytes,密文]
mode 加解密模式:
0x01:DES 加密
0x81:DES 解密
输出参数: 无
0x00 正确
0x02 密钥索引非法
返回: 0x03 非法模式
0xce PED 已锁
0x0b 指定的密钥不存在
注释: P78、R50、R30、R50-M、R100 不支持该 API!

3.16.24 SYLPEDLoadTMK
uchar SYLPEDLoadTMK(uchar MkeyID1, uchar *TmpKey, uchar *KTMK,
原型:
uchar *ReferCode)
[深银联专用函数] 由 POS 产生临时 TmpKey,上传主机,取回密文 KTMK, 和
临时加密参考值 ReferCode,使用固定密钥[在 P80 内部,暂不公布]对临时
KEY 解密,然后将解密结果作为密钥再次对密文 KTMK 解密,得 TMK;TMK
功能:
对"\x12\x34\x56\x78\x90\x12\x34\x56"加密,加密后的结果应与加密参考值相
等;最后,如果 MkeyID1 的最高位为 0,则将明文 TMK 写入(MkeyID1&0x7F)
指定的主密钥区,否则将明文 TMK 写入(MkeyID1&0x7F)指定的工作密钥区。
MkeyID1 主密钥或工作密钥的索引号(1~100)与标志位相或,标志位是用
MkeyID1 的最高位来区分,即:
MkeyID1 等于(索引号),则为主密钥;
MkeyID1 等于(索引号|0x80),则为工作密钥
输入参数: TmpKey POS 产生临时 KEY[8 Bytes],它必须解密之后才可以使用。
KTMK 从主机取回密文[8 Bytes]。
ReferCode 主机用 KTMK 的明文加密"\x12\x34\x56\x78\x90\x12\x34\x56"
后,返回的值[8 Bytes]。


输出参数:

0x00 正确
0x02 密钥索引非法
返回:
0x0e TMK 错
其它值
主密钥写在主密钥区,该功能用于远程下载 P80 的主密钥。
注释:
P78、R50、R30、R50-M、R100 不支持该 API!

3.16.25 PEDManage
原型: uchar PEDManage(uchar mode,uchar *pwdcode)
百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 151/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

PED 其它功能管理函数,主要有校验超级管理密钥,校验解锁密钥,锁与解
功能:
锁键盘,修改超级管理密组,修改解锁密钥功能。
mode 0 校验超级管理密钥,其中的 pwdcode 为 8 字节的校验
值;若校验成功则系统自动解除锁键盘标志并可更新
超级密钥与解锁密钥。
1 校验解锁密钥,其中的 pwdcode 为 8 字节的校验值;
若校验成功则系统自动解除锁键盘标志,并可更新解
锁密钥。
输入参数: 2 锁键盘操作
0x80 修改超级管理密钥,其中的 PWDCODE 由新管理密钥
(8 字节)组成。
0x81 修改解锁密钥,其中的 PWDCODE 是由新解锁密钥(8
字节)组成。
pwdcode 由 mode 取值决定


输出参数:

0x00 成功/mode 值非法


返回: 0xf0 校验密钥失败
0xf1 修改权限错误(须先正确校验密钥才可更新)
注释: P78、R50、R30、R50-M、R100 不支持该 API!

3.17 多应用管理函数

本模块内的所有 API 对 P80、P78、P90、R50、P58、R50-M 均适用。R30 monitor 分为支持


单应用 monitor 和支持多应用 monitor,R100 目前只支持多应用。本模块内的所有 API 仅适
用于支持多应用的 R30 和多应用的 R100。
模块功能说明:本模块是实现多应用管理操作的 API。
P80、P78、P90、R50 的应用开发是支持多应用的,为此需要有一个多应用管理器。应
用管理器其实也是一个应用,其特别之处在应用序号为 0,能够访问其他 1 到 23 号的普通应
用的文件。能够调度其他普通应用程序。本节介绍提供给应用管理器用的函数。应用管理器
需要另行编写,一般是根据具体的应用需求编写。
模块内数据结构如下:
typedef struct
{
unsigned char AppName[32]; /* 应用名,唯一的*/
unsigned char AID[16]; /* 应用标识号 */
unsigned char AppVer[16]; /* 应用版本号 */
unsigned char AppProvider[32]; /* 应用提供商 */
unsigned char Descript[64]; /* 应用描述信息 */
unsigned char DownloadTime[14]; /* 应用下载时间,下装时确定的 */
unsigned long MainAddress; /* 主函数入口地址 main()*/

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 152/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

unsigned long EventAddress; /* 事件处理入口地址 event_main()*/


unsigned char AppNum; /* 应用分配号,在下装时确定的 */
unsigned char RFU[73]; /* 保留 */
}APPINFO;

3.17.1 ReadAppInfo
原型: int ReadAppInfo(uchar AppNo, APPINFO* ai)
功能: 无
AppNo: 所要查询信息的应用在多应用系统中的序号(0-23)。
输入参数:
AppInfo: 存放返回应用信息的指针。
输出参数: 无
0 成功读取
返回:
-1 读取失败
读取某一应用的应用信息。每个应用程序需要定义全局变量 const APPINFO
注释: AppInfo。在当前应用中,可以直接访问 AppInfo 得到相应的应用信息;如果
要访问其他应用程序的应用信息则需要调用本函数进行读取。

3.17.2 ReadAppState
原型: unsigned char ReadAppState(uchar AppNo)
功能: 无
输入参数: AppNo 所要读取状态信息的应用序号(0~23)
输出参数: 无
bit 0:0-无应用; 1-有应用
bit 1:0-未激活; 1-已激活
返回:
bit 2:0-未运行过; 1-已运行过
0xff:读应用状态失败。
注释: 读某一应用序号的状态信息。

3.17.3 SetAppActive
原型: int SetAppActive(uchar AppNo, uchar flag)
功能: 无
AppNo 所要读取状态信息的应用序号(0~23)

输入参数: flag 0:使应用处于非激活;
1:激活应用
0 设置成功
返回:
-1 设置失败
注释: 设置应用的激活状态信息。

3.17.4 RunApp
原型: int RunApp(uchar AppNo)

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 153/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

功能: 无
输入参数: AppNo 所要读取状态信息的应用序号(1~23)
输出参数: 无
返回: 子应用的主程序的返回值
注释: 跳转到某一应用运行。

3.17.5 DoEvent
原型: int DoEvent(uchar AppNo, ST_EVENT _MSG *param)
功能: 无
AppNo 所要读取状态信息的应用序号(1~23)
输入参数:
param 事件处理传递参数
输出参数: 无
返回: 子应用的事件处理程序的返回值。
跳 转 到 某 一 应 用 的 事 件 处 理 程 序 。 事 件 处 理 入 口 函 数 为 int
注释: event_main(ST_EVENT_MSG *para)。该函数要定义在应用程序中,如果没有
特别的事件需要处理,也需要定义一个没有处理动作的空函数就可以了。

3.18 IP 操作函数

3.18.1 模块返回值列表
值 宏定义 说明
0 NET_OK 无错误,正常
-1 NET_ERR_MEM 内存不够
-2 NET_ERR_BUF 缓冲区错误
-3 NET_ERR_ABRT 试图建立连接失败
-4 NET_ERR_RST 连接被对方复位(收到对方的 Reset)
-5 NET_ERR_CLSD 连接已关闭
-6 NET_ERR_CONN 连接未成功建立
-7 NET_ERR_VAL 错误变量
-8 NET_ERR_ARG 错误参数
-9 NET_ERR_RTE 错误路由(route)
-10 NET_ERR_USE 地址、端口使用中
-11 NET_ERR_IF 底层硬件错误
-12 NET_ERR_ISCONN 连接已建立
-13 NET_ERR_TIMEOUT 超时
-14 NET_ERR_AGAIN 请求资源不存在,请重试
-15 NET_ERR_EXIST 已存在
-16 NET_ERR_SYS 系统不支持
-17 NET_ERR_PASSWD 错误密码
-18 NET_ERR_MODEM 拨号失败
百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 154/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

-19 NET_ERR_LINKDOWN 数据链路已断开,请重新拨号


-20 NET_ERR_LOGOUT Logout
-21 NET_ERR_PPP PPP 断开
-22 NET_ERR_STR 字符串太长
-23 NET_ERR_DNS 域名解析错误
-24 NET_ERR_INIT 相应的功能系统没有初始化
-30 NET_ERR_SERV 没有找到 PPPoE 服务器

3.18.2 NetSocket
原型: int NetSocket(int domain, int type, int protocol)
功能: 创建网络套接字,相当于创建一个连接句柄
参数: domain 为固定值:NET_AF_INET
type NET_SOCK_STREAM or NET_SOCK_DGRAM;
NET_SOCK_STREAM 意味着使用 TCP;
NET_SOCK_DGRAM 意味着使用 UDP
protocol 为固定值:0

返回: 成功返回>=0,该值为创建的套接字;
失败返回<0,该值为错误代码;
用法: 仅支持 P90

3.18.3 NetBind
原型: int NetBind(int socket, struct net sockaddr *addr, socklen_t
addrlen)
功能: 绑定 IP 地址或端口号
参数: socket 套接字
addr Sock 结构地址,包含了 IP 地址和 Port,;其值的初始
化建议采用系统提供的接口 SockAddrSet
该域不允许为 NULL;
addrlen 该值固定为 sizeof(struct net_sockaddr)

返回: 成功返回 0;
失败返回<0,该值为错误代码;
用法: 1. 该函数可以绑定 IP 地址,也可以不绑定 IP 地址;如果不绑定 IP
地址,则用 0 表示即可;
2. 该函数主要与 NetListen 配合使用的;
3. 仅支持 P90

3.18.4 NetConnect
原型: int NetConnect(int socket, struct net_sockaddr *addr,

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 155/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

socklen_t addrlen)
功能: 作为客户端,开始连接服务器
参数: socket 套接字
addr 服务器地址信息,包含了 IP 地址和 Port,其值的初始
化建议采用系统提供的接口 SockAddrSet
addrlen 该值固定为 sizeof(struct net_sockaddr)
返回: 成功返回 0;
失败返回<0,该值为错误代码;
用法: 仅支持 P90

3.18.5 NetListen
原型: int NetListen(int socket, int backlog)
功能: 作为服务器开始监听
参数: socket 套接字
backlog 等待连接的队列长度,该值必须<=5
返回: 成功返回 0;
失败返回<0,该值为错误代码;
用法: 仅支持 P90

3.18.6 NetAccept
原型: int NetAccept(int socket, struct net_sockaddr *addr,
socklen_t *addrlen)
功能: 接受来自客户端的连接
参数: socket 套接字

addr 服务器地址信息,包含了IP地址和Port,结构定义见附
录5.1.8;
抽取 IP 地址信息和 Port 信息建议采用系统提供的接口
SockAddrGet;
该域不允许为 NULL;
addrlen 指向存放地址长度的空间,地址长度固定为
sizeof(struct net_sockaddr)
该域不允许为 NULL;
返回: 成功返回>=0,表示与客户端成功创建连接的套接字,以后可以采用
该套接字与客户端进行通信;
失败返回<0,该值为错误代码;
用法: 仅支持 P90

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 156/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

3.18.7 NetSend
原型: int NetSend(int socket, void *buf, int size, int flags)
功能: 向连接对方发送数据
参数: socket 套接字句柄
buf 存放发送数据的缓冲
size 数据长度,该值必须<=10240(10K)
flags 目前该值为 0
返回: 成功返回发送的字节长度,
失败返回<0
用法: 套接字类型为 NET_SOCK_STREAM 时才能采用该接口
仅支持 P90

3.18.8 NetSendto
原型: int NetSendto(int socket, void *buf, int size, int flags,
struct net_sockaddr *addr, socklen_t addrlen)
功能: 发送数据
参数: socket 套接字句柄

buf 存放发送数据的缓冲
该域不允许为 NULL;
size 数据长度,对于 UDP 协议该值必须<=1024(1K)

flags 目前该值为 0

addr 地 址 信 息 , 包 含 了 IP 地 址 和 Port , 结 构 定 义 见 附
录5.1.8;
其值的初始化建议采用系统提供的接口 SockAddrSet;
该域不允许为 NULL;
addrlen 固定为 sizeof(struct net_sockaddr)

返回: 成功返回发送的字节长度,
失败返回<0,该值为错误代码;
用法: 套接字类型为 NET_SOCK_DGRAM 才可以使用该接口
仅支持 P90

3.18.9 NetRecv
原型: int NetRecv(int socket, void *buf, int size, int flags)
功能: 接收数据
参数: socket 套接字

buf 接收数据的缓冲区
该域不允许为 NULL;
size 缓冲的长度
百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 157/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

返回: 成功返回接收的字节长度;
失败返回<0,该值为错误代码;
用法: 套接字类型为 NET_SOCK_STREAM 时才能采用该接口
仅支持 P90

3.18.10 NetRecvfrom
原型: int NetRecvfrom(int socket, void *buf, int size, int flags,
struct sockaddr *addr, socklen_t *addrlen)
功能: 接收数据
参数: socket 套接字

buf 接收数据的缓冲区
该域不允许为 NULL;
size 缓冲的长度

flag 0

addr 数据来源的地址和端口信息,结构定义见附录5.1.8,
抽取IP地址信息和Port信息建议采用系统提供的接口
SockAddrGet;
该域不允许为 NULL;
addrlen 指向存放地址长度的空间,地址长度固定为
sizeof(struct net_sockaddr)
该域不允许为 NULL;
返回: 成功返回接收的字节长度;
失败返回<0,该值为错误代码;
用法: 仅支持 P90

3.18.11 NetCloseSocket
原型: int NetCloseSocket (int socket)
功能: 关闭套接字
参数: socket 套接字句柄
返回: 成功返回 0;
失败返回<0
用法: 通过 NetScoket 创建的句柄都必须通过 NetCloseSocket 关闭,否则
会导致 Socket 创建失败;
仅支持 P90

3.18.12 Netioctl
原型: int Netioctl(int socket, int cmd, int arg)

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 158/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

功能: 设置和获取套接字的信息;
参数: socket 套接字
cmd 操作命令,目前支持的有:
1. CMD_IO_SET:设置 I/O 模式 (阻塞模式和异步模式) ;
2. CMD_IO_GET:获取 I/O 模式;
3. CMD_TO_SET:设置超时时间,当 I/O 模式为阻塞时
有效,系统缺省的超时时间为 2 秒;
4. CMD_TO_GET:获取超时时间;
5. CMD_IF_SET:套接字绑定网络接口,当套接字作为
服务器时,该命令无效;
6. CMD_IF_GET:获取套接字绑定的网络接口,当套接
字作为服务器时,该命令无效;
7. CMD_EVENT_GET :获 取 套接 字 事 件 ,该 命 令只 对
NET_SOCK_STREAM:有效,可能存在的事件有:
 SOCK_EVENT_READ:有数据可读;
 SOCK_EVENT_WRITE:可以发送数据;
 SOCK_EVENT_CONN:连接已成功;
 SOCK_EVENT_NETACCEPT:有新的客户端连接到
来;
8. CMD_BUF_GET:读取缓冲区情况,该命令主要用于
获 取 协 议 的 系 统 情 况 , 该 命 令 只 对
NET_SOCK_STREAM 有效;
9. CMD_FD_GET:获取空闲的句柄数目,应用可获知是
否有句柄泄露的情况;
10. CMD_KEEPALIVE_SET:配
置 sock 的 KeepAlive 功能,
该命令只对 NET_SOCK_STREAM 有效;
11. CMD_KEEPALIVE_GET 获取 sock 的 KeepAlive 情况,
该命令只对 NET_SOCK_STREAM 有效;

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 159/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

arg 对于不同的命令,该值有不同的含义;
1. cmd=CMD_IO_SET,arg=1 表示非阻塞(异步)模
式,arg=0 表示阻塞模式;
2. cmd=CMD_IO_GET, arg 无意义;
3. cmd=CMD_TO_SET, arg>0 表示等待时间(单位毫
秒),arg<=0 表示无限期等待;
4. cmd=CMD_TO_GET,arg 无意义;
5. cmd=CMD_IF_SET,arg 表示网络设备接口索引号,
arg=0 表示以太网网卡,arg=10 表示 PPP 链路;
6. cmd=CMD_IF_GET,arg 无意义;
7. cmd=CMD_EVENT_GET , arg=0 表 示 获 取 事 件 ,
arg=SOCK_EVENT_READ 表示获取当前可读数据长
度,arg=SOCK_EVENT_WRITE 表示获取当前可发送的
数据长度,arg=SOCK_EVENT_ERR 表示获取错误代
码,arg=SOCK_EVENT_ACCEPT 表示获取当前等待连
接的个数;
8. cmd=CMD_BUF_GET,arg = TCP_SND_BUF_MAX 表示
获取可发送的最大空间,arg= TCP_RCV_BUF_MAX 表
示 获 取 可 接 收 的 最 大 空 间 ,arg=
TCP_SND_BUF_AVAIL 表示获取目前有效的发送空间
9. cmd=CMD_KEEPALIVE_SET,arg>0 表示接收对方报文
的等待最大时间(单位毫秒)后开始执行 keepalive
功能,这时候协议栈自动打开 keepalive 功能,arg
不 能 <5000 , 系 统 缺 省 值 为 ; arg<=0 表 示 关 闭
keepalive 功能;
10. cmd=CMD_KEEPALIVE_GET,arg 无意义;
返回: 成功返回>=0;失败返回<0,为错误代码;当成功返回时,对于不同
的命令,返回值有不同的含义:
1. cmd=CMD_IO_SET,成功返回 0;
2. cmd=CMD_IO_GET,返回 1 表示非阻塞(异步)模式,返回 0 表示
阻塞模式;
3. cmd=CMD_TO_SET,成功返回 0;
4. cmd=CMD_TO_GET,返回 0 表示无限期等待,返还>0 表示等待的
时间(单位毫秒);
5. cmd=CMD_IF_SET,成功返回 0;
6. cmd=CMD_IF_GET,返回网络设备接口索引;
7. cmd=CMD_EVENT_GET,根据 arg 的值,返回值不一样:arg=0 返
回 NetSocket 事件;
8. cmd=CMD_BUF_GET,根据 arg 值返回不同的值;
9. cmd=CMD_KEEPALIVE_SET,成功返回 0,失败返回<0;
10. cmd=CMD_KEEPALIVE_GET,返回 0 表示 keepalive 关闭,返回>0
表示开始执行 keepalive 时间
用法: 仅支持 P90

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 160/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

3.18.13 SockAddrSet
原型: int SockAddrSet(struct net_sockaddr *addr, char *ip_str,
short port)
功能: 封装了设置套接字地址信息的接口
参数: addr 用来存放套接字地址信息,为输出参数;
该域不允许为 NULL;
ip_str IP 地址字符串,如“192.168.0.5”,为输入参数;
如果为 NULL,表示地址为 0;
地址字符串不能为“255.255.255.255”;
该域不允许为 NULL;
port 端口号,如 ftp 端口号 21;

返回: 成功返回 0,失败返回<0


用法: 仅支持 P90

3.18.14 SockAddrGet
原型: int SockAddrGet(struct sockaddr *addr, char *ip_str, short
*port)
功能: 获取套接字地址信息中包含的 IP 地址信息和 Port 信息
参数: addr 存放套接字地址信息,为输入参数
该域不允许为 NULL;
ip_str 存放 IP 地址字符串,如“192.168.1.5”,为输出参数
该域不允许为 NULL;
字符串最大长度为 15 个字符;
port 存放 Port 端口号,如 ftp 端口号 21,为输出参数
该域不允许为 NULL;
返回: 成功返回 0,失败返回<0;
用法: 仅支持 P90

3.18.15 DnsResolve
原型: int DnsResolve(char *name, char *result, int len)
功能: 域名解析;
参数: name 要解析域名字符串
域名如“www.sina.com.cn”
最长不能超过 255 字符
result 存放解析的结果;
result 为 IP 地址字符串;
len result 的有效空间长度,该值必须>20

返回: 成功返回 0,失败返回<0;


用法: 仅支持 P90

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 161/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

3.18.16 NetPing
原型: int NetPing(char *dst_ip_str, long timeout, int size)
功能: Ping 外部机器
参数: dst_ip_str 目的主机 IP 地址字符串,如“192.128.0.111”
字符串长度最大不能超过 15 个字符
timeout 超时时间,单位毫秒

size 负载的数据长度,<=1024

返回: >=0:表示成功,为耗费的时间
<0:表示失败,为错误代码
用法: 仅支持 P90

3.18.17 RouteSetDefault
原型: int RouteSetDefault(int ifIndex)
功能: 配置系统使用的缺省路由
参数: ifIndex 网络设备索引号
0:表示以太网网卡
1:表示 PPPoE
10:表示 modem PPP 链路
11:表示无线(GPRS/CDMA)PPP 链路
返回: 成功返回 0,失败返回<0
用法: 1.配置缺省路由只对要建立的新连接有效,已成功建立连接的无效;
2.配置缺省路由对作为服务器(被动)连接无效;
仅支持 P90

3.18.18 RouteGetDefault
原型: int RouteGetDefault(void)
功能: 获取系统使用的缺省路由
参数:

返回: >=0:网络设备索引号,0 表示以太网设备,10 表示 modem PPP 链路;


<0:错误代码;
用法: 如果用户没有指定的话,系统使用缺省路由的策略为:
优先使用以太网设备,但是如果启用 PPPoE 则优先使用之;如果以
太网设备不可用,则使用 modem PPP 链路;
仅支持 P90

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 162/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

3.18.19 NetDevGet
原型: int NetDevGet(int Dev,char *HostIp,char *Mask, char
*GateWay,char *Dns)
功能: 读取网络设备的 IP 配置信息
参数: Dev 网络设备编号(10 进制制)
0:表示以太网设备
10:表示 Modem PPP
11:表示无线模块(包括 GPRS 和 CDMA)
HostIp 用于存放 IP 地址信息;
应用程序分配的空间不少于 20 个字节;
如果应用程序不需要该信息,直接给 NULL
Mask 用于存放掩码信息;
应用程序分配的空间不少于 20 个字节;
如果应用程序不需要该信息,直接给 NULL
GateWay 用于存放网关地址;
应用程序分配的空间不少于 20 个字节;
如果应用程序不需要该信息,直接给 NULL
Dns DNS 服务器地址;
应用程序分配的空间不少于 20 个字节;
如果应用程序不需要该信息,直接给 NULL
返回: =0:表示读取成功,HostIp、Mask、GateWay 和 Dns 内容有效
<0:表示错误代码;
用法: 仅支持 P90

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 163/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.2)

4、 编译和链接

编译和链接部分围绕应用开发过程中所涉及到的编译工具的使用、makefile 的创建、
ProPay 开发工具的使用、应用开发注意事项等来逐一展开,使应用开发人员更清晰开发流程
与开发环境,为应用开发人员在创建应用程序及调试等方面提供帮助。

4.1 gcc 简介

gcc(GNU C Compiler)是 GNU 推出的功能强大、性能优越的多平台编译器,是 GNU


的代表作品之一。gcc 是可以在多种硬体平台上编译出可执行程序的超级编译器,其执行效
率与一般的编译器相比平均效率要高 20%~30%。
gcc 编译器能将 C、C++语言源程序、汇程式化序和目标程序编译、连接成可执行文件,
如果没有给出可执行文件的名字,gcc 将生成一个名为 a.out 的文件。在 Linux 系统中,可执
行文件没有统一的后缀,系统从文件的属性来区分可执行文件和不可执行文件。而 gcc 则通
过后缀来区别输入文件的类别,下面我们来介绍 gcc 所遵循的部分约定规则,见下表:
表 4-1 gcc 所遵循的部分约定规则
.c C 语言源代码文件
.a 是由目标文件构成的档案库文件
.C 是 C++源代码文件
.cc 或.cxx
.h 是程序所包含的头文件
.i 是已经预处理过的 C 源代码文件
ii 是已经预处理过的 C++源代码文件
.m 是 Objective-C 源代码文件
.o 是编译后的目标文件
.s 是汇编语言源代码文件
.S 是经过预编译的汇编语言源代码文件

4.1.1 gcc 的基本用法和选项


在使用 gcc 编译器的时候,我们必须给出一系列必要的调用参数和文件名称。gcc 编译
器的调用参数大约有 100 多个(详见 GCC 相关帮助文件) ,其中多数参数我们可能根本就用
不到,这里只介绍其中最基本、最常用的参数。
gcc 最基本的用法是∶gcc [options] [filenames]
其中 options 就是编译器所需要的参数,filenames 给出相关的文件名称。
-c,只编译,不连接成为可执行文件,编译器只是由输入的.c 等源代码文件生成.o 为后
缀的目标文件,通常用于编译不包含主程序的子程序文件。
-o output_filename,确定输出文件的名称为 output_filename,同时这个名称不能和源文件
同名。如果不给出这个选项,gcc 就给出预设的可执行文件 a.out。
-g,产生符号调试工具(GNU 的 gdb)所必要的符号资讯,要想对源代码进行调试,我们
就必须加入这个选项。

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 164/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

-O,对程序进行优化编译、连接,采用这个选项,整个源代码会在编译、连接过程中进
行优化处理,这样产生的可执行文件的执行效率可以提高,但是,编译、连接的速度就相应
地要慢一些。
-O3,比-O 更好的优化编译、连接,当然整个编译、连接过程会更慢。
-Idirname,将 dirname 所指出的目录加入到程序头文件目录列表中,是在预编译过程中
使用的参数。C 程序中的头文件包含两种情况∶
A)#include <myinc.h>
B)#include “myinc.h”
其中,A 类使用尖括号(< >),B 类使用双引号(“ ”)。对于 A 类,预处理程序 cpp 在系统
预设包含文件目录(如/usr/include)中搜寻相应的文件,而对于 B 类,cpp 在当前目录中搜寻头
文件,这个选项的作用是告诉 cpp,如果在当前目录中没有找到需要的文件,就到指定的
dirname 目录中去寻找。在程序设计中,如果我们需要的这种包含文件分别分布在不同的目
录中,就需要逐个使用-I 选项给出搜索路径。
-Ldirname,将 dirname 所指出的目录加入到程序函数档案库文件的目录列表中,是在连
接过程中使用的参数。在预设状态下,连接程序 ld 在系统的预设路径中(如/usr/lib)寻找所需
要的档案库文件,这个选项告诉连接程序,首先到-L 指定的目录中去寻找,然后到系统预设
路径中寻找,如果函数库存放在多个目录下,就需要依次使用这个选项,给出相应的存放目
录。
-lname,在连接时,装载名字为“libname.a”的函数库,该函数库位于系统预设的目录或
者由-L 选项确定的目录下。例如,-lm 表示连接名为“libm.a”的数学函数库。
上面我们简要介绍了 gcc 编译器最常用的功能和主要参数选项,更为详尽的资料可以参
看 Linux 系统的联机帮助。

4.1.2 gcc 的错误类型及对策


gcc 编译器如果发现源程序中有错误,就无法继续进行,也无法生成最终的可执行文件。
为了便于修改,gcc 给出错误资讯,我们必须对这些错误资讯逐个进行分析、处理,并修改
相应的语言,才能保证源代码的正确编译连接。gcc 给出的错误资讯一般可以分为四大类,
下面我们分别讨论其产生的原因和对策。
第一类∶C 语法错误
错误资讯∶文件 source.c 中第 n 行有语法错误(syntax errror)。这种类型的错误,一般都
是 C 语言的语法错误,应该仔细检查源代码文件中第 n 行及该行之前的程序,有时也需要对
该文件所包含的头文件进行检查。有些情况下,一个很简单的语法错误,gcc 会给出一大堆
错误,我们最主要的是要保持清醒的头脑,不要被其吓倒,必要的时候再参考一下 C 语言的
基本教材。
第二类∶头文件错误
错误资讯∶找不到头文件 head.h(Can not find include file head.h)。这类错误是源代码文件
中的包含头文件有问题,可能的原因有头文件名错误、指定的头文件所在目录名错误等,也
可能是错误地使用了双引号和尖括号。
第三类∶档案库错误
错误资讯∶连接程序找不到所需的函数库,例如∶
ld: -lm: No such file or directory
这类错误是与目标文件相连接的函数库有错误,可能的原因是函数库名错误、指定的函
百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 165/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

数库所在目录名称错误等,
检查的方法是使用 find 命令在可能的目录中寻找相应的函数库名,
确定档案库及目录的名称并修改程序中及编译选项中的名称。
四类∶未定义符号
错误资讯∶有未定义的符号(Undefined symbol)。这类错误是在连接过程中出现的,可能
有两种原因∶一是使用者自己定义的函数或者全局变量所在源代码文件,没有被编译、连接,
或者干脆还没有定义,这需要使用者根据实际情况修改源程序,给出全局变量或者函数的定
义体;二是未定义的符号是一个标准的库函数,在源程序中使用了该库函数,而连接过程中
还没有给定相应的函数库的名称,或者是该档案库的目录名称有问题,这时需要使用档案库
维护命令 ar 检查我们需要的库函数到底位于哪一个函数库中,确定之后,修改 gcc 连接选项
中的-l 和-L 项。
排除编译、连接过程中的错误,应该说这只是程序设计中最简单、最基本的一个步骤,
可以说只是开了个头。这个过程中的错误,只是我们在使用 C 语言描述一个算法中所产生的
错误,是比较容易排除的。我们写一个程序,到编译、连接通过为止,应该说刚刚开始,程
序在运行过程中所出现的问题,是算法设计有问题,说得更玄点是对问题的认识和理解不够,
还需要更加深入地测试、调试和修改。一个程序,稍为复杂的程序,往往要经过多次的编译、
连接和测试、修改。下面我们学习的程序维护、调试工具和版本维护就是在程序调试、测试
过程中使用的,用来解决调测阶段所出现的问题。

4.2 应用程序的编译

编译应用程序的工具是 arm-elf-gcc.exe 和 arm-elf-as.exe。


arm-elf-gcc.exe 是对 c 源程序进行编译。arm-elf-as.exe 是对汇编源程序进行编译。如:
arm-elf-as init.s -o init.o
arm-elf-gcc -O3 –I..\gcc\build\include -I..\myproj\inc -mlittle-endian -mcpu=arm9 –c
main.c -o main.o
其中-c 命令表示只生成目标代码,不进行连接;-o 命令指明目标文件的名称;-O3 表示
采用 3 级优化,采用优化后可使生成的代码更短,运行速度更快;-gdwarf 编译产生调试信息;
-mlittle-endian 表采用小尾端存储格式,即低字节存在低地址,与 PC 机存储方式相同(与 P70,
P60-S1 产品相反) ;-mcpu=arm9 设置 CPU 类型;–I 指定库与用户头文件搜索路径。如果项
目包含很多文件,则需要编写 makefile 文件。关于 makefile 的内容,请感兴趣的读者参考相
关资料。

4.3 用程序的链接和转换

GCC 的连接工具 arm-elf-ld.exe,能把可重载的目标文件和库函数连接成绝对地址的机器


码文件。具体的连接地址是由连接脚本文件 (ldscript)来决定的。arm-elf-ld 生成的机器码
(ELF)
文件要经过 elftobin.exe 来转换,得到可下装的下装(BIN)文件,对于 P80 和 R50,须在文
件尾端附加相应标识符:
对于普通应用:PAX-P80OrR50-SAPP
对于应用管理:PAX- P80OrR50-MAPP
示例:
elftobin postest.elf postest.bin PAX P80OrR50-SAPP

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 166/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

arm-elf-ld -Tldscript -L$(GCCLIB) -L$(GCCLIBELF) -L$(LIBDIR) -o


$(NAME).elf $(OBJ) –lp80api -lc -lgcc
其中-T 指定连接脚本文件名称,-L 指定库文件搜索路径,-o 输出文件格式;$(OBJ)
包含项目所有已编译后的.o 文件,–l 指定要链接的库名称(注意事项:如要链接 libp80api.a
libc.a libgcc.a 则须将 lib 与.a 省去,如–lp80api -lc –lgcc 才正确)。
具体使用方法,参看 makefile 中的例子。
需要特别强调的是,在开发应用程序时,要把连接脚本文件(ldscript)中的地址设置好
(参看脚本文件的例子) ,还要把 init.o 连接到程序中。

4.4 makefile 的具体例子

以 P80 为例:
path=c:\windows;c:\windows\system32;d:\pax\p80\gcc\build\bin

NAME = p80_edc

GCCDIR = d:\pax\p80\gcc\build
GCCBIN = $(GCCDIR)\bin
GCCLIB = $(GCCDIR)\lib
GCCLIBELF = $(GCCDIR)\libelf
GCCINC = $(GCCDIR)\include

LOCSRC = .\source
LOCOBJ = .\obj
LOCINC = $(GCCINC)

LIB = $(GCCLIB)\libc.a

P80INC = d:\pax\p80\inc
P80LIBDIR = d:\pax\p80\lib
P80LIB = p80api
#P80INIT = $(P80LIBDIR)\p80_init.o
P80SCRIPT = $(P80LIBDIR)\ldscript

ASM = $(GCCDIR)\BIN\arm-elf-as -gdwarf2


GCC = $(GCCDIR)\BIN\arm-elf-gcc -O3 -gdwarf -I$(GCCINC) -I$(P80INC)
-mlittle-endian -mcpu=arm9 -c
LINK = $(GCCDIR)\BIN\arm-elf-ld -T$(P80SCRIPT) -L$(GCCLIB)
-L$(GCCLIBELF) -L$(P80LIBDIR)
CCFLAG = -O3 -gdwarf -mlittle-endian -mcpu=arm9

OBJECTS=$(LOCOBJ)\p80_init.o \
$(LOCOBJ)\main.o \
百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 167/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

$(LOCOBJ)\acqset.o \
$(LOCOBJ)\adjust.o \
$(LOCOBJ)\api.o \
$(LOCOBJ)\authsale.o \
$(LOCOBJ)\balance.o \
$(LOCOBJ)\card.o \
$(LOCOBJ)\chkoptn.o \
$(LOCOBJ)\cnname.o \
$(LOCOBJ)\com.o \
$(LOCOBJ)\comset.o \
$(LOCOBJ)\const.o \
$(LOCOBJ)\data.o \
$(LOCOBJ)\datacal.o \
$(LOCOBJ)\disp.o \
$(LOCOBJ)\disp1.o \
$(LOCOBJ)\ecr.o \
$(LOCOBJ)\edc.o \
$(LOCOBJ)\file.o \
$(LOCOBJ)\fun.o \
$(LOCOBJ)\init.o \
$(LOCOBJ)\initedc.o \
$(LOCOBJ)\instal.o \
$(LOCOBJ)\iso8583.o \
$(LOCOBJ)\keybd.o \
$(LOCOBJ)\logon.o \
$(LOCOBJ)\mc.o \
$(LOCOBJ)\offline.o \
$(LOCOBJ)\offsale.o \
$(LOCOBJ)\other.o \
$(LOCOBJ)\password.o \
$(LOCOBJ)\preauth.o \
$(LOCOBJ)\print.o \
$(LOCOBJ)\refund.o \
$(LOCOBJ)\reversal.o \
$(LOCOBJ)\sale.o \
$(LOCOBJ)\select.o \
$(LOCOBJ)\settle.o \
$(LOCOBJ)\specfun.o \
$(LOCOBJ)\svc.o \
$(LOCOBJ)\sys.o \
$(LOCOBJ)\tools.o \
$(LOCOBJ)\void.o

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 168/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

# ADS-ROM version
$(NAME).elf: $(OBJECTS)
$(LINK) -o $(NAME).elf $(OBJECTS) -l$(P80LIB) -lc -lgcc
# elftobin $(NAME).elf $(NAME).bin PAX-P80-SAPP
elf2bin $(NAME).elf $(NAME).bin s

# C files
{$(LOCSRC)}.C{$(LOCOBJ)}.o:
$(GCC) $(LOCSRC)\$(@B).c -o $(LOCOBJ)\$(@B).o

# ASM file
$(LOCOBJ)\p80_init.o: $(LOCSRC)\p80_init.s
$(ASM) $(LOCSRC)\p80_init.s -o $(LOCOBJ)\p80_init.o

default: $(OBJECTS)
clean:
del *.db
del *.blk
del *.db2
del *.out

4.5 连接脚本文件的具体例子

以 P80 为例:
对于普通应用,连接脚本文件内容如下
SECTIONS
{
. = 0x00300000;
.text : { *(.text) }
Image_RO_Limit = .;
Image_RW_Base = .;
.data : { *(.data) }
.rodata : { *(.rodata) }
Image_ZI_Base = .;
.bss : { *(.bss) }
Image_ZI_Limit = .;
__bss_start__ = .;
__bss_end__ = .;
__EH_FRAME_BEGIN__ = .;
__EH_FRAME_END__ = .;
PROVIDE (__stack = .);
end = .;
_end = .;
百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 169/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

.debug_info 0 : { *(.debug_info) }
.debug_line 0 : { *(.debug_line) }
.debug_abbrev 0 : { *(.debug_abbrev)}
.debug_frame 0 : { *(.debug_frame) }
}
对于应用管理,连接脚本文件内容如下
SECTIONS
{
. = 0x00200000;
.text : { *(.text) }
Image_RO_Limit = .;
Image_RW_Base = .;
.data : { *(.data) }
.rodata : { *(.rodata) }
Image_ZI_Base = .;
.bss : { *(.bss) }
Image_ZI_Limit = .;
__bss_start__ = .;
__bss_end__ = .;
__EH_FRAME_BEGIN__ = .;
__EH_FRAME_END__ = .;
PROVIDE (__stack = .);
end = .;
_end = .;
.debug_info 0 : { *(.debug_info) }
.debug_line 0 : { *(.debug_line) }
.debug_abbrev 0 : { *(.debug_abbrev)}
.debug_frame 0 : { *(.debug_frame) }
}

4.6 PAXPayPro 应用实例

PAXPayPro 提供了一套 POS 应用程序的模拟运行开发环境,避免应用程序必须下


载到 POS 机才能运行,在模拟环境中运行,可以充分利用 VC 的调试功能来调试应用程
序,直接观看运行结果,提高了开发效率。除此之外,系统还集成了 GCC 编译器,下载
工具,调试完成后可直接编译成目标码,下载到 POS 机运行,下面介绍使用 PAXPayPro
创建一个应用的步骤,关于 PAXPayPro 的更详细使用请参照安装好的 PAXPayPro 里面自
带的帮助文档。
1. 首先安装好 PAXPayPro 通过 Appwizard 创建 POS 应用程序。主界面如下图。

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 170/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

图 4-1 App wizard 界面

2. 点击主界面的 New 按钮,进入创建新应用界面,如下图:

图 4-2 创建新应用

3. 输入工程名(Project name),工程名只能包含字母,数字,下划张,不能含有
其它特殊符号。其它规则遵循 windows 的文件命名规则。
4. 指定工程目录(Location)
5. 输入工程描述(Description),用 App wizard 打开已经存在的工程时,会显示该

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 171/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

描述,方便用户选择。
6. 选择模板
7. 可以选择空模板或者 HelloWorld 模板,如果选择空模板的话,生成一个空的工
程,用户可添加其它工程文件。 如果如果选择 HelloWorld 模板,生成一个带
main.c 文件的工程,演示输出“Hello world”

8. 此时已经建立好了一个

4.7 应用开发注意事项

1. 链接应用时,须加上 INIT.S 文件,该文件可在 POSTTEST 示例项目中的 SRC 目录获得,


且必须将 INIT.O 文件放在其它目标文件的最前端。
2. 源程序扩展名如.c 不可用.C 替代,否则大定扩展名作 CPP 处理,编译会报错。
3. 由于采用热敏打印机,须安装如 P70T 打印字库,否则打印结果会出错。
4. 若使用内置 PED,则在程序移植中须将原外置 PINPAD 接口中的“PP”字符 替换 成“PED”
字符即可,其它功能不变。

4.8 应用程序空间的限制

P80、P78、P90、R50、P58 对应用程序空间的分配完全一致,而 R30、R100 由于 SDRAM


只有 2M,故应用空间小于其他机型。

4.8.1 空间定义
代码空间:包括程序代码和常量数据;
变量空间:包括全局变量和 static 关键词修饰的静态全局变量;
堆栈空间:包括所有局部变量及函数参数传递占用的空间;

4.8.2 P80、P78、P90、R50、P58、R50-M 空间大小与限制


1. 普通应用与多应用管理共用一个用户堆栈空间,其大小未限定,但受普通应用代码
空间与变量空间大小的影响(成反比例关系) ;
2. 多应用管理:其代码空间与变量空间的总空间大小为 1 M 字节,若代码空间为 256K
字节,则余下的 768K 字节全为变量空间;
3. 普通应用:其代码空间与变量空间、用户堆栈空间的总空间大小为 3 M 字节,即若
代码空间为 512K 字节,其变量空间为 1M 字节,则余下 1.5M 字节空间全部用于堆
栈空间;
4. 空间大小是由编译链接器进行动态分配;

4.8.3 R30、R100 空间大小与限制


R30 软件架构分为支持单应用架构和支持多应用架构;
对于支持单应用的软件架构:
1) 一个单应用运行时用户堆栈空间大小未限定,但其受单应用代码空间与变量空
间大小的影响(成反比例关系) ;
2) 代码空间与变量空间、用户堆栈空间的总空间大小为 1.5 M 字节,即若代码空
间为 512K 字节,其变量空间为 512K 字节,则余下 512K 字节空间全部用于堆栈空间;

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 172/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

3) 空间大小是由编译链接器进行动态分配;

对于支持多应用的软件架构:
1) 普通应用与多应用管理共用一个用户堆栈空间,其大小未限定,但受普通应用代码
空间与变量空间大小的影响(成反比例关系) ;
2) 多应用管理:其代码空间与变量空间的总空间大小为 1 M 字节,若代码空间为 256K
字节,则余下的 768K 字节全为变量空间;
3) 普通应用:其代码空间与变量空间、用户堆栈空间的总空间大小为 3 M 字节,即若
代码空间为 512K 字节,其变量空间为 1M 字节,则余下 1.5M 字节空间全部用于堆
栈空间;
4) 空间大小是由编译链接器进行动态分配;

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 173/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.2)

5、 附录

5.1 数据结构速查

本节提供应用开发中涉及到的所有数据结构,关于模块内涉及到的数据结构在各个模块
的开头处也已列出,数据结构的开头处以红色字体标注了适用范围,如无标注则表示全部适
用。

5.1.1 IC 卡数据结构
发送数据结构:APDU_SEND。
typedef struct{
unsigned char Command[4]; /* CLA, INS, P1, P2 */
unsigned short Lc; /* 发送到 IC 卡的数据长度 */
unsigned char DataIn[512]; /* 发送到 IC 卡的数据 */
unsigned short Le; /* 期望返回数据的长度 */
}APDU_SEND;

接收数据结构:APDU_RESP。
typedef struct{
unsigned short LenOut; /* 实际从 IC 卡返回的数据长度 */
unsigned char DataOut[512]; /* 从 IC 卡返回的数据指针 */
unsigned char SWA; /* IC 卡状态字 1 */
unsigned char SWB; /* IC 卡状态字 2 */
}APDU_RESP;

5.1.2 Modem 拨号参数结构


P80、P78、P58 适用,P90 有外置 MODEM 时适用,R50、R30、R50-M、R100 不适用!
typedef struct{
unsigned char DP; /* 设置音频/脉冲拨号*/
unsigned char CHDT; /* 是否检测拨号音 */
unsigned char DT1; /* 摘机到拨号的等待时间(单位:100ms)*/
unsigned char DT2; /* 拨外线时“,”等待时间(单位:100ms)*/
unsigned char HT; /* 双音拨号单一号码保持时间 单位:1ms */
unsigned char WT; /* 双音拨号两个号码之间的间隔时间 10ms */
unsigned char SSETUP; /* 通讯字节的设置[包括设置同步异步、波特率、线路应
答音超时等]*/
unsigned char DTIMES; /* 重拨次数,必须大于等于 1*/
unsigned char TimeOut; /* 通讯超时(若在此时间内没有数据交换,MODEM 则挂
断,为 0 时无超时,单位:10 秒)*/
unsigned char AsMode; /* 异步通讯方式(仅异步通信时有效)*/
百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 174/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

}COMM_PARA;

5.1.3 文件信息结构
typedef struct
{
unsigned char fid; /* 文件标识号 */
unsigned char attr; /* 文件的属主 */
unsigned char type; /* 文件类型 */
char name[17]; /* 文件名 */
unsigned long length; /* 文件长度 */
} FILE_INFO;

5.1.4 应用信息结构
typedef struct {
unsigned char AppName[32]; /* 应用名,唯一的*/
unsigned char AID[16]; /* 应用标识号 */
unsigned char AppVer[16]; /* 应用版本号 */
unsigned char AppProvider[32]; /* 应用提供商 */
unsigned char Descript[64]; /* 应用描述信息 */
unsigned char DownloadTime[14]; /* 应用下载时间,下装时确定的 */
unsigned long MainAddress; /* 主函数入口地址 main()*/
unsigned long EventAddress; /* 事件处理入口地址 event_main()*/
unsigned char AppNum; /* 应用分配号,在下装时确定的 */
unsigned char RFU[73]; /* 保留 */
}APPINFO;

5.1.5 传递磁卡数据的数据结构
P80、P78、P90、P58 适用,R50、R30、R50-M、R100 不适用!
typedef struct{
unsigned char RetCode; /* 应用的处理结果 */
unsigned char track1[256]; /* 磁道 1 信息缓冲区 */
unsigned char track2[256]; /* 磁道 2 信息缓冲区 */
unsigned char track3[256]; /* 磁道 3 信息缓冲区 */
}ST_MAGCARD;

5.1.6 事件处理的数据结构
P80、P78、P90、P58 适用,R50、R30、R50-M、R100 不适用!
typedef struct{
int MsgType; // 事件类型(包括磁卡,按键,IC 卡及自定义事件)
ST_MAGCARD MagMsg; // 磁卡数据
unsigned char KeyValue; // 键盘的按键值
unsigned char IccSlot; // 接触式 IC 卡通道号

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 175/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

void *UserMsg; // 用户自定义的事件信息


}ST_EVENT_MSG;
已定义好的事件类型有:
#define MAGCARD_MSG 0x01 磁卡事件
#define ICCARD_MSG 0x02 IC 卡事件
#define KEYBOARD_MSG 0x03 按键事件
#define USER_MSG 0x04 用户定义事件

5.1.7 字库的数据结构
P58 适用,P80、P78、P90、R50、R30、R50-M、R100 不适用!
typedef struct{
int CharSet; // 字符集
int Width; // 字符宽度
int Height; // 字符高度
int Bold; // 粗体
int Italic; // 斜体
}ST_FONT;

5.1.8 IP 模块 Socket 地址结构


struct sockaddr_in
{
char sin_len;
char sin_family;
short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};

struct sockaddr
{
char sa_len;
char sa_family;
char sa_data[14];
};

5.2 名词解释速查

本节提供本应用开发手册中涉及到的名词缩写、专业术语的解释与说明。
表 5-1 名词解释速查
百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 176/178
应用开发指南[适用 P78、P80、P90、R50、P58、R30、R50-M](V1.2.3)

名称 注释
ATR IC 卡复位应答中卡片返回的相关参数,包括
(协议类型,传输速度)等
PED 密码键盘
LCD 液晶显示屏

5.3 全局变量

表 5-2 全局变量说明
变量 说明
int errno; 错误信息,在应用中要调用 GetLastError()来
读取。
const APPINFO AppInfo; 应用信息,每个应用要定义这个全局变量,
并且要付初值。在当前应用中可以直接访问。

百富计算机技术(深圳)有限公司
PAX Computer Technology (Shenzhen)Co.,Ltd. 177/178

You might also like