You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

技术求助:如何识别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”“设备描述”。
  • 通过SCSI指令读取介质本身的标识
    这是最准确的方法,因为SD/CF卡都是通过SCSI协议与主机通信的,你可以发送特定指令直接读取介质的固有信息:

    • 发送INQUIRY指令(指令码0x12),返回的数据里第8-15字节是产品识别字符串,SD卡会明确包含“SD”“SDXC”,CF卡则会显示“COMPACT FLASH”;
    • 还可以发送MODE SENSE指令(0x1A)获取介质的特殊参数,比如SD卡的CID/CSD寄存器信息,这是普通U盘绝对没有的。
      实现上,Windows用DeviceIoControl API发送这些指令,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

火山引擎 最新活动