1. 项目概述:从串口到智能卡,一个被忽视的通讯桥梁
搞嵌入式开发或者工控的朋友,对串口(UART)肯定不陌生。RS-232、TTL电平、波特率、数据位、停止位……这些词几乎是刻在骨子里的记忆。我们通常用它来连接传感器、调试MCU、或者跟老旧的PLC设备对话。但如果说,这个看似“古老”的接口,还能摇身一变,成为与银行卡、SIM卡、门禁卡这类 智能卡 进行安全通讯的通道,你是不是会觉得有点意外?
这就是“串口特殊用法—智能卡通讯”的核心。它并非指用串口直接去读一张磁条卡,而是特指基于ISO/IEC 7816标准的接触式智能卡(通常我们说的CPU卡)。这种卡内部集成了一个微处理器(CPU)、存储器(ROM、EEPROM)和加密协处理器,本质上是一台超微型计算机。而它与外界(读卡器)通讯的物理接口,正是我们熟悉的 异步串行通讯 (UART)协议的一种特殊变体。
为什么说它“特殊”?因为普通的串口通讯,大家约定好波特率,发数据收数据就完了,讲究的是效率。但智能卡通讯,在串口的物理层之上,套上了一整套严密的 应用层协议 ——T=0或T=1传输协议,以及更上层的APDU(应用协议数据单元)指令体系。它更像是在一条简单的乡间小道上,建立了一套复杂的交通规则和安检流程,用来运输价值连城的“货物”(即敏感数据与加密指令)。
这个项目或者说这个知识点,适合谁呢?首先是嵌入式软件工程师,尤其是涉及安全认证、支付终端、身份识别设备开发的同行。其次是对通讯协议栈感兴趣,想深入了解如何在一个简单硬件接口上构建复杂应用逻辑的开发者。哪怕你只是好奇“公交卡是怎么工作的”,搞懂这套机制,也能让你豁然开朗。接下来,我们就一层层剥开这颗“洋葱”,看看串口是如何完成这场华丽变身的。
2. 核心原理:ISO 7816协议栈与串口物理层的适配
要理解智能卡通讯,必须从ISO/IEC 7816标准说起。这个标准定义了接触式智能卡的物理尺寸、触点定义、电信号、复位应答和通讯协议。我们重点关注其通讯部分。
2.1 物理层:熟悉的陌生人
智能卡有8个触点(C1到C8),最常用的是:
- C1 (VCC) :电源,通常是3V或5V。
- C2 (RST) :复位信号。
- C3 (CLK) :时钟信号,由读卡器提供,用于同步。
- C5 (GND) :地。
- C7 (I/O) : 双向数据线,这就是串口数据线的核心 。
关键点来了:在I/O线上传输的数据,是 半双工、异步、串行 的。这听起来和UART一模一样。但是,其电气特性和位时序是标准化的,并且依赖于CLK时钟。在初始的“复位应答”阶段,通讯参数(如波特率)是通过一个特定的公式与CLK频率关联的(称为“时钟频率转换因子”)。一旦协商确定,后续通讯就稳定在该波特率下进行。所以,从微控制器的角度看,你可以配置一个UART外设,将其TX和RX短接后连接到卡的I/O引脚(因为半双工,同一时刻只能收或发),并按照卡的时序要求来控制收发方向,这就完成了物理层的对接。
注意 :虽然底层是UART,但直接拿单片机串口去连可能不工作。因为智能卡I/O电平是特定序列,且需要严格遵循激活、冷复位、应答等时序。通常需要使用专用的智能卡接口芯片(如TDA8024、SCL3712等)或MCU内嵌的智能卡接口模块(如STM32的SmartCard接口),这些硬件会自动处理电平转换、时钟生成和方向控制,对开发者更友好。
2.2 协议层:T=0与T=1
物理层之上是传输协议层,主要有两种:
- T=0协议(字符传输协议) :这是最常用的协议,尤其在国内的金融IC卡、社保卡中。它以 单个字节 为基本传输单位。每个字节传输后,接收方需要回送一个确认信号(过程字节)。这种协议简单,但效率较低,因为每个指令或数据的字节都需要确认。
- T=1协议(块传输协议) :以 数据块 为传输单位。一个块包含帧头、数据信息和帧尾(校验码)。效率高于T=0,但协议更复杂。
你可以把T=0想象成快递员送包裹,一次只送一个小盒子(一个字节),送到后必须等你签字(过程字节)他才回去取下一个。而T=1则是送一个大的集装箱(一个数据块),里面有很多小盒子,一次性签字确认整个集装箱。
我们的微控制器(读卡器端)需要根据卡在复位应答(ATR)中返回的信息,判断卡支持哪种协议,然后实现对应的协议状态机。这个过程,就是“串口特殊用法”的核心软件实现部分。
2.3 应用层:APDU指令对话
协议层保证了数据字节或块的可靠传输,而传输的内容则遵循APDU格式。APDU是读卡器与卡内应用程序对话的“语言”。
- 命令APDU :读卡器发送给卡的指令。结构为:
[CLA, INS, P1, P2, Lc, Data, Le]。-
CLA:指令类,如0x00表示ISO标准。 -
INS:指令码,如0xA4表示选择文件,0xB0表示读数据。 -
P1, P2:指令参数。 -
Lc:后续发送的数据域长度。 -
Data:要发送的数据。 -
Le:期望卡返回的数据最大长度。
-
- 响应APDU :卡执行命令后返回的结果。结构为:
[Data, SW1, SW2]。-
Data:请求的数据。 -
SW1, SW2:状态字,2个字节。最著名的成功状态是0x90 0x00。其他如0x62 00表示警告,0x6A 82表示文件未找到等。
-
整个通讯流程,就是通过串口(物理层),按照T=0或T=1协议(传输层),不断地发送命令APDU和接收响应APDU(应用层)的过程。
3. 实操设计:从零构建一个简易智能卡读卡器模拟终端
理论说得再多,不如动手做一遍。我们假设一个场景:使用一颗常见的STM32F103系列MCU,通过其USART外设模拟智能卡接口,与一张符合ISO 7816标准的CPU卡(如一张废弃的手机SIM卡或银行卡, 仅供学习测试,切勿用于非法用途 )进行通讯,目标是读取卡的复位应答(ATR)信息。 <


552


被折叠的 条评论
为什么被折叠?



