cdc_usb模拟串口-设备描述符问题

使用官方例程 CH573_CDC_OK,usb模拟串口功能时,发现win10系统无需安装系统就可直接读写设备,但是系统关于设备描述和程序有差别,这是使用自写软件读取的串口信息(也可从系统的设备管理器获取该信息)如下:

description:  "USB 串行设备"
manufacturer:  "Microsoft"
serialNumber:  "2017-2-25"
vendorIdentifier(VID):  6790
productIdentifier(PID):  22306

除了后面的 VID和PID与程序中一致外,其余均不同。这里推测是设备插入电脑后,系统自动更新安装了默认驱动,导致信息被修改。


有没有方法可以保持实际使用时,电脑上的设备描述和程序中一致。目前项目需要通过  description 和 manufacturer 初步区分产品类型(类似Arduino的开发板信息)。否则次之,只能使用 VID和PID做产品区分了


还望有大神能够解答,不甚感激!


那个程序里面应该是没有上传字符串描述符的,你可以添加字符串描述符,不过系统层操作一般是设备类型加vid pid,这个应该就足够了。


第一次连接设备,电脑右下角有设备描述显示,和程序中是一致的,但过几秒就改变了,这是第一次连接电脑显示(设备管理器卸载设备后,重新连接也可以)

image.png

这是程序中描述符相关,可以发现时上传了的

// 语言描述符
const UINT8 MyLangDescr[] = {0x04, 0x03, 0x09, 0x04};
// 厂家信息 ghtech
const UINT8 MyManuInfo[] = {0x0E, 0x03, 'w', 0, 'c', 0, 'h', 0, '.', 0, 'c', 0, 'n', 0};
// 产品信息 www.ghtech.cn
const UINT8 MyProdInfo[] = {0x0C, 0x03, 'C', 0, 'H', 0, '5', 0, '7', 0, 'x', 0};



目前问题解决了一半,description 和 manufacturer 还是无法修改,这个目前根据搜集的资料来看,是无法修改的了,和驱动绑定了。

但 serialNumber 可以自定义,源程序这里有问题,如下

// 厂家信息 ghtech
const UINT8 MyManuInfo[] = {14, 03, 103, 0, 104, 0, 116, 0, 101, 0, 99, 0, 104, 0};
// 产品信息 www.ghtech.cn
const UINT8 MyProdInfo[] = {28, 03, 119, 0, 119, 0, 119, 0, 46, 0, 103, 0, 104, 0, 116, 0, 101, 0, 99, 0, 104, 0, 46, 0, 99, 0, 110, 0};
// 序列号描述符 
const UINT8 MySerDes[] = {
    0x14, 0x03,
    0x32, 0x00, 0x30, 0x00, 0x31, 0x00, 0x37, 0x00, 0x2D, 0x00,
    0x32, 0x00, 0x2D, 0x00,
    0x32, 0x00, 0x35, 0x00};

这里的厂家信息和产品信息通过编码转换,可以得到和注释一致。但是序列号描述转换后却发现乱码,是不正常的数字编码。于是尝试将数组成员由数字改为字符,直观易懂,如下:

// 语言描述符
const UINT8 MyLangDescr[] = {0x04, 0x03, 0x09, 0x04};
// 厂家信息 wchcn
const UINT8 MyManuInfo[] = {0x0E, 0x03, 'w', 0, 'c', 0, 'h', 0, '.', 0, 'c', 0, 'n', 0};
// 产品信息 CH57x
const UINT8 MyProdInfo[] = {0x0C, 0x03, 'C', 0, 'H', 0, '5', 0, '7', 0, 'x', 0};
// 序列号描述符 TEST
const UINT8 MySerDes[] = {0x0A, 0x03,'T', 0x00, 'E', 0x00, 'S', 0x00, 'T', 0x00};

测试后,可以通过软件读取到串口信息如下:

description:  "USB 串行设备"
manufacturer:  "Microsoft"
serialNumber:  "TEST"
vendorIdentifier:  6790
productIdentifier:  22306

可以发现源码的 序列号描述符即serialNumber 应该是有问题的,导致系统显示了其它内容,导致一开始以为不能定制内容,折腾了半天。所以还是使用字符形式编写最好,不会出错。


因此目前可行方案是通过以下三者区分产品类型(注意6790是芯片生产商编号即沁恒公司,由usb官方分配的,不建议修改)

serialNumber:  "TEST"
vendorIdentifier:  6790
productIdentifier:  22306



只有登录才能回复,可以选择微信账号登录