工控主板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 ...
随机推荐
- BZOJ3412: [Usaco2009 Dec]Music Notes乐谱
3412: [Usaco2009 Dec]Music Notes乐谱 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 35 Solved: 30[Sub ...
- 【转】Linux中断处理学习笔记
原文网址:http://www.cnblogs.com/GT_Andy/archive/2011/06/21/2086100.html 1.Linux中断的注册与释放: 在<linux/inte ...
- iOS 9之New UIKit for International User Interfaces
金田 Apple一直是注重用户体验的典范,而此次在UI上面,更是做到极致.此次iOS 9的发布能完全支持阿拉伯语.希伯来语等书写和阅读方式为从右向左的语言环境.不仅仅是简单的基础文本,而是支持将界面翻 ...
- Android取得电池的电量
首先需要用到的是一个类继承BrocastReceiver 2 代码如下: public class Battery_Info extends BroadcastReceiver { @Override ...
- ASP.NET MVC 3 Razor Nested foreach with if statements
You need to write code this way. @Html.Raw("<tr>") Copy the below code and paste it ...
- [Tips]ASP.NET MVC 发布到服务器后Model中属性相关的Attribute失效
Asp.net MVC4 开发的项目,发布到真实环境环境后Model中的一个属性设置的了Attribute,但是这些Attribute都失效. 经过对比和坚持代码发现控制长度的Attribute使用错 ...
- Javascript:DOM表格操作
需求说明: /* *需求说明: *获取元素:tBodies,tHead,tFoot,rows,cells *表格的创建 *数据添加 *隔行变色 *删除操作,剩余表格重新计算,实现隔行变色 */ HTM ...
- 一个菜鸟所喜欢用的响应式布局,操作方便简单、时尚简约,适合新手!(一个Dreamweaver cs6生成响应式布局)
前端开发并不是一个容易的工作,不仅需要掌握HTML.CSS和JavaScript,针对不同的浏览器版本和平台,还需要了解如何设计出跨平台的网站.如今随着响应式设计的流行,前端开发变得越来越困难,且花费 ...
- INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES错误解决方法
在安装APK文件时出现类似INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES的提示,同时类似的提示如下: Android Launch! adb is run ...
- xml的加密和解密
xml加密(XML Encryption)是w3c加密xml的标准.这个加密过程包括加密xml文档的元素及其子元素,通过加密,xml的初始内容将被替换,但其xml格式仍然被完好的保留. 介绍我们有3个 ...