工控主板EM9161对ISO7816协议的支持
在当前的金融POS终端及相关领域,ISO7816通讯协议得到了广泛应用。英创的工控主板EM9161,可在其异步串口的基础上,通过简单的设置,就可把串口转为符合ISO7816协议的接口,实现与各种智能卡的通讯。本文主要介绍采用EM9161的COM2口,实现ISO7816通讯的基本方法。
上图表示EM9161作为ISO7816主控方与智能卡的连接示意图,其中原COM2口的数据发送管脚TXD2作为ISO7816的半双工数据信号DIO;原COM2口的RTS2n控制线作为ISO7816的时钟信号SCK。两个信号线的电平均为3.3V的TTL信号电平。
应用程序进行ISO7816通讯的基本流程为:
1、按标准方法打开串口“COM2:”,并设置相应串口参数;
2、通过DeviceIoControl(…)函数使能ISO7816通讯模式,并设置相关参数;
3、设置波特率,注意在使能ISO7816模式后,必须重新设置波特率;
4、进行数据通讯,数据帧的奇偶校验位需要与通讯对端匹配;
5、通过DeviceIoControl(…)函数禁止ISO7816通讯模式;
6、按标准方法关闭串口“COM2:”。
为了实现从通常的异步串口到ISO7816的转换,EM9161的串口驱动增加了2个IOCTL功能如下:
#include
#define IOCTL_SERIAL_ENABLE_ISO7816 \
CTL_CODE(FILE_DEVICE_SERIAL_PORT,40,METHOD_BUFFERED,FILE_ANY_ACCESS)
#define IOCTL_SERIAL_DISABLE_ISO7816 \
CTL_CODE(FILE_DEVICE_SERIAL_PORT,41,METHOD_BUFFERED,FILE_ANY_ACCESS)
使能ISO7816的DeviceIoControl调用,需要同时设置相应的参数。这些参数包括ISO7816的协议类型,帧数据的应答规范等,定义相应的参数如下:
#define AT91C_US_USMODE_ISO7816_0 0x4 // ISO7816 protocol: T = 0
#define AT91C_US_USMODE_ISO7816_1 0x6 // ISO7816 protocol: T = 1
#define AT91C_US_INACK (0x1 << 20) // Inhibit Non Acknowledge
#define AT91C_US_DSNACK (0x1 << 21) // Disable Successive NACK
此外ISO的波特率按如下公式计算:
BR = (DI / FI)× SCK
上式中的SCK = 串口波特率×FI / DI,例如串口波特率为9600,FI / DI = 372,则SCK时钟频率为3.57MHz。在EM9161中,对DI和FI的设置,是通过设置(FI/DI)这个比值来实现的,其中有效的值如下表所示:
DI = 1 |
DI = 2 |
DI = 4 |
DI = 8 |
DI = 16 |
DI = 32 |
DI = 12 |
DI = 20 |
|
FI = 372 |
372 |
186 |
93 |
47 |
23 |
12 |
31 |
19 |
FI = 558 |
558 |
279 |
140 |
70 |
35 |
17 |
47 |
28 |
FI = 774 |
774 |
372 |
186 |
93 |
47 |
23 |
62 |
37 |
FI = 1116 |
1116 |
558 |
279 |
140 |
70 |
35 |
93 |
56 |
FI = 1488 |
1488 |
744 |
372 |
186 |
93 |
47 |
124 |
74 |
FI = 1806 |
1806 |
930 |
465 |
233 |
116 |
58 |
155 |
93 |
FI = 512 |
512 |
256 |
128 |
64 |
32 |
16 |
43 |
26 |
FI = 768 |
768 |
384 |
192 |
96 |
48 |
24 |
64 |
38 |
FI = 1024 |
1024 |
512 |
256 |
128 |
64 |
32 |
85 |
51 |
FI = 1536 |
1536 |
768 |
384 |
192 |
96 |
48 |
128 |
77 |
FI = 2048 |
2048 |
1024 |
512 |
256 |
128 |
64 |
171 |
102 |
选择蓝色区域的值,可得到对应的黄色区域的FI和绿色区域的DI,由此可计算相应的波特率。
在具体的调用中,参数的传递是通过两个DWORD实现的,代码如下:
DWORD dwMode, dwFI_DI_Ratio;
DWORD pBuf[2];
dwMode = AT91C_US_USMODE_ISO7816_0;
dwFI_DI_Ratio = 372;
pBuf[0] = dwMode;
pBuf[1] = dwFI_DI_Ratio;
if (!DeviceIoControl ( m_hSer, // 串口handle
IOCTL_SERIAL_ENABLE_ISO7816, // 命令码
pBuf, sizeof(pBuf), // input buffer
NULL, 0, // output buffer
NULL, NULL ))
{
printf('IOCTL_SERIAL_ENABLE_ISO7816 failed!\r\n');
}
关闭ISO7816通讯模式比较简单,没有任何参数:
if (!DeviceIoControl ( m_hSer, // 串口handle
IOCTL_SERIAL_DISABLE_ISO7816, // 命令码
NULL, 0,
NULL, 0,
NULL, NULL ))
{
printf('IOCTL_SERIAL_DISABLE_ISO7816 failed!\r\n');
}
设置了ISO模式后,应用程序仍然可以像操作普通串口那样,进行数据的读写,只是需要注意的是ISO7816的半双工模式的,所以数据通讯的过程更像是RS485的过程。用户可参考英创网站的《RS485接口通讯的WinCE编程要点》一文,来规划自己的应用程序。
工控主板EM9161对ISO7816协议的支持的更多相关文章
- python模块:网络协议和支持
python模块:网络协议和支持 webbrowser 调用浏览器显示html文件 webbrowser.open('map.html') [webbrowser - Convenient Web-b ...
- Python 标准类库- 因特网协议于支持之UUID
标准类库- 因特网协议于支持之UUID by:授客 QQ:1033553122 测试环境 python3 UUID生成函数定义 uuid.getnode() 获取一个表示硬件地址的48位正整数.第 ...
- Python 标准类库 - 因特网协议与支持之socketserver
标准类库 - 因特网协议与支持之socketserver by:授客 QQ:1033553122 socketserver 模块,简化网络服务编写任务. 创建服务的步骤 1 通过子类化BaseReq ...
- 牛客网Java刷题知识点之UDP协议是否支持HTTP和HTTPS协议?为什么?TCP协议支持吗?
不多说,直接上干货! 福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号: 大数据躺过的坑 Java从入门到架构师 人工智能躺过的坑 ...
- 如何实现IIS 7.0对非HTTP协议的支持
在<再谈IIS与ASP.NET管道>介绍各种版本的IIS的设计时,我们谈到IIS 7.0因引入WAS提供了对非HTTP协议的支持.这个对于WCF的服务寄宿来说意义重大,它意味着我们通过II ...
- 分布式事务(三)mysql对XA协议的支持
系列目录 分布式事务(一)原理概览 分布式事务(二)JTA规范 分布式事务(三)mysql对XA协议的支持 分布式事务(四)简单样例 分布式事务(五)源码详解 分布式事务(六)总结提高 引子 从Mys ...
- JMeter扩展插件实现对自定义协议进行支持 转
本文版权归xmeter.net 所有.欢迎转载,转载请注明出处. 摘要## JMeter本身提供了插件机制,允许第三方扩展JMeter以支持JMeter不支持的协议的测试.本文以扩展一个简单的Apac ...
- ISO7816协议的块传输协议
1.块传输协议中的前三个字节是强制必须有的 NAD节点地址: 当终端支持多个卡槽,终端和这些卡槽以总线的方式通讯时,该字节有用,其他情况下,默认为0 bit1-3:定义了源地址 bit5-7:定义了目 ...
- 利用TokyoTyrant构建兼容Memcached协议、支持故障转移、高并发的分布式Key-value持久存储系统(转)
Tokyo Cabinet 是日本人 平林幹雄 开发的一款 DBM 数据库,该数据库读写非常快,哈希模式写入100万条数据只需0.643秒,读取100万条数据只需0.773秒,是 Berkeley D ...
随机推荐
- BZOJ2659: [Beijing wc2012]算不出的算式
2659: [Beijing wc2012]算不出的算式 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 668 Solved: 366[Submit] ...
- 【转】java读写二进制文件的解决方法
原文网址:http://www.jb51.net/article/36940.htm 接口:Writerable 复制代码代码如下: package com.geoway.pad.common; im ...
- [Operationg System Labs] 我对 Linux0.00 中 boot.s的理解和注释
(如有错误请立即指正,么么哒!) ! boot.s!! It then loads the system at 0x10000, using BIOS interrupts. Thereafte ...
- Android ListView嵌套Button,Button事件覆盖item事件解决办法
方法就是修改item布局的xml文件: 在根布局里加上: android:descendantFocusability="blocksDescendants" 然后在按钮布局里加上 ...
- JVM内存堆布局图解分析
JAVA能够实现跨平台的一个根本原因,是定义了class文件的格式标准,凡是实现该标准的JVM都能够加载并解释该class文件,据此也可以知道,为啥Java语言的执行速度比C/C++语言执行的速度要慢 ...
- ESB 企业服务总线
整理的OSChina 第 38 期高手问答 —— ESB 企业服务总线,嘉宾为@肖俊_David . @肖俊_David 恒拓开源架构师,热衷于JAVA开发,有多年的企业级开发经验.曾参和设计和开发基 ...
- WingIDE注册破解方法
WingIDE是Python程序语言设计的集成开发环境,具有语法标签高亮显示,命令自动完成和函数跳转列表等非常强大的功能.本文主要介绍WingIDE 5安装及注册破解方法. 1. WingIDE 5下 ...
- Javascript:简单拖拽效果的实现
核心代码: /* *完成一个拖拽事件由三大事件组成: *1:onmousedown:选择元素 *2:onmousemove:移动元素 *3:onmouseup:释放元素 */ function dra ...
- 五、SolrJ、Request Handler
什么是SolrJ 既然Solr是以单独的WebApp形式存在的,那么Solr理应提供与Solr通信的Api吧,对的,这就是SolrJ,既然与solr通信是通过url,那么其实我们也可以不用SolrJ, ...
- Python之基础(二)
1.内建函数enumerate friends = ['john', 'pat', 'gary', 'michael'] for i, name in enumerate(friends): prin ...