技术求助:如何识别USB读卡器中的SD卡?
区分USB读卡器中的SD/CF卡与普通USB存储设备的实用方案
嘿,我太懂你折腾好几个小时卡在这儿的憋屈了——能读存储内容,却死活分不出是SD卡、CF卡还是普通USBU盘,靠GUID尝试又走进死胡同,这事儿确实磨人。结合我之前处理这类问题的经验,给你几个靠谱的方向试试:
读取USB设备的类/子类/协议代码 + 设备字符串
所有USB设备都有标准的类、子类和协议标识:- 首先,SD/CF读卡器和普通U盘都属于
Mass Storage Class (08h),但细分的子类和协议有区别。比如SD读卡器的接口子类通常是06h(SCSI透明命令集),协议为50h;CF卡读卡器可能会对应不同的子类(比如01h),不过更直接的是看设备描述字符串——SD卡相关设备一般会带“SD”“Secure Digital”“SDHC”这类关键词,CF卡则会包含“Compact Flash”“CF”字样。
你可以用工具快速获取这些信息:Linux下用lsusb -v(过滤Mass Storage相关内容),Windows下用devcon.exe或者设备管理器的“详细信息”标签查看“硬件ID”“设备描述”。
- 首先,SD/CF读卡器和普通U盘都属于
通过SCSI指令读取介质本身的标识
这是最准确的方法,因为SD/CF卡都是通过SCSI协议与主机通信的,你可以发送特定指令直接读取介质的固有信息:- 发送
INQUIRY指令(指令码0x12),返回的数据里第8-15字节是产品识别字符串,SD卡会明确包含“SD”“SDXC”,CF卡则会显示“COMPACT FLASH”; - 还可以发送
MODE SENSE指令(0x1A)获取介质的特殊参数,比如SD卡的CID/CSD寄存器信息,这是普通U盘绝对没有的。
实现上,Windows用DeviceIoControlAPI发送这些指令,Linux用ioctl调用SG_IO来执行,也可以先用sg3_utils工具(Linux)或者DiskView(Windows)做测试验证。
- 发送
利用介质可移除特性做辅助判断
普通U盘大多是固定存储介质,而SD/CF卡是可移除的——你可以监听设备的介质变化事件:比如Windows的WM_DEVICECHANGE消息,Linux的udev事件。当拔出介质后,如果整个设备从系统中消失,那大概率是普通U盘;如果设备还存在但显示“无介质”,那基本就是读卡器(SD/CF卡属于可移除介质)。不过要注意少数特殊U盘也做成可移除式,这个方法只能做辅助验证。
另外,你之前放弃GUID是完全正确的,GUID是单台设备的唯一标识,根本没法用来区分设备类型。上面这几个方法里,SCSI指令的方式最可靠,不受读卡器品牌和型号的影响,建议优先尝试。
内容的提问来源于stack exchange,提问作者user3884423




