概述
CH9329是一款串口转USB HID设备功能芯片,根据不同的工作模式,HID设备可以识别为:USB键盘设备、USB鼠标设备或者自定义HID类设备。接收串口数据,并自动根据串口工作模式进行数据解析,解析完成后按照HID类设备规范,将数据打包通过USB口上传给计算机。
特点
- 芯片出厂内置固件程序,无需进行二次开发。
- 支持Windows/Linux/安卓/macOS等操作系统,使用系统内置的键盘、鼠标、HID设备驱动程序,无需额外安装。
- 提供4种工作模式(单一键盘/鼠标/自定义HID功能,或几个功能的复合)。
- 提供3种串口通信模式(协议传输模式/ASCII模式/透传模式)。
- 支持USB设备信息、串口通信地址、键盘回车符等信息的配置。
工作模式
工作模式 | 功能说明 |
---|---|
0 | USB键盘+USB鼠标+自定义HID |
1 | USB键盘 |
2 | USB键盘+USB鼠标 |
3 | 自定义HID |
串口通信模式
串口通信模式 | 功能说明 |
---|---|
0 | 协议传输模式 |
1 | ASCII模式 |
2 | 透传模式 |
USB键盘功能
芯片可以实现标准USB键盘功能,USB键盘包含普通按键和多媒体按键。通过接收串口数据实现模拟键盘按键的效果。
该功能常用于:扫码枪、收银机、小键盘、远程控制等。
USB鼠标功能
芯片可以实现标准USB鼠标功能,USB鼠标包含相对鼠标和绝对鼠标。通过接收串口数据实现模拟鼠标的效果。
该功能常用于:硬件版按键精灵、远程控制等。
自定义HID功能
此自定义非彼自定义,这里的自定义实际上是指HID的subclass和protocol均为0的设备类型,并非是指用户可以自定义类别或HID报表格式等,把它比作一个不需要使用COM口的USB转串口设备功能更形象些。
该功能常用于:USB转串口双向数据透传(免驱HID方式),配合键鼠功能使用提供计算机的数据下传通道。
常见Q&A
Q:如何选择芯片工作模式?
A:各工作模式的适用场景:
模式0:多功能同时应用的场景(如使用键鼠功能时需要和计算机之前收发自定义数据)、需要多媒体键盘的场景、需要通过USB通道获取/配置芯片参数的场景。
模式1:使用单一USB键盘功能,并且不使用多媒体键盘,适用于不支持复合设备的老式计算机。
模式2:同时使用键盘和鼠标功能,且对Linux/Android/苹果等操作系统的鼠标兼容性更好。
模式3:使用单一USB自定义HID功能,配合计算机软件实现串口设备和计算机的双向数据收发,类似于USB虚拟串口(COM口)应用,区别是看不到COM虚拟端口,而是直接用系统HID API和设备完成交互。
Q:如何选择串口通信模式?
A:各串口通信模式的适用场景:
模式0:协议传输模式,此模式适用于至少2个功能同时应用的场景、需要通过串口通道获取/配置芯片参数的场景。该模式功能最齐全,在不完全确定产品功能的前提下,建议优先选用此模式作为默认模式。
模式1:ASCII码模式,为USB键盘功能量身定做的简版按键传输模式,该模式会将通常的可见ASCII字符直接转成按键的HID报表以及按键释放的HID报表,转换的字符主要包含:数字0~9,字母A~Z,空格和回车等。注:
不能转换特殊按键,如:F1~F12,方向键,Shift和Ctrl按键等。
模式2:透传模式,是指串口数据原封不动的通过USB打包上传给计算机,该模式适用于自定义HID模式,实现类似USB转虚拟串口的应用效果。
Q:协议传输模式键盘包怎么填充?
A:需要使用的命令码:
这里以USB键盘普通数据为例:
串口报文的核心数据就是中间的8个字节的内容,这8个数据芯片提取后会直接通过USB打包上传给计算机,内容格式:
字节1 | 字节2 | 字节3 | 字节4 | 字节5 | 字节6 | 字节7 | 字节8 |
---|---|---|---|---|---|---|---|
控制键 | 0x00 | 键1 | 键2 | 键3 | 键4 | 键5 | 键6 |
对于字节3~字节8的对应键值,可查看文档附录的“CH9329 键码表”
如:数字1~0对应HID Code:0x1E~0x27,如果需要模拟按键1,则8字节内容为:
键1按下:{0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00}
按键释放:{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
确认了中间的8字节包,传输的时候再按照协议要求,添加包头,命令码,地址码和自动计算得到的累加和等就可以实现键盘控制了。
举例1:模拟"A"键先按下,再释放
串口下传: 57 AB 00 02 08 00 00 04 00 00 00 00 00 10
芯片上传: 57 AB 00 82 01 00 85
串口下传: 57 AB 00 02 08 00 00 00 00 00 00 00 00 0C
芯片上传: 57 AB 00 82 01 00 85
举例2:模拟先同时按下“左Shift”+“A”键,再释放:
串口下传: 57 AB 00 02 08 02 00 04 00 00 00 00 00 12
芯片上传: 57 AB 00 82 01 00 85
串口下传: 57 AB 00 02 08 00 00 00 00 00 00 00 00 0C
芯片上传: 57 AB 00 82 01 00 85
除以上方法外,开发时还可以用其他方式便捷确定需要的键盘包内容,使用USB分析仪软件(USB2.0 Monitor或者BusHound等工具)抓取计算机上的USB键盘相应按键按下时的USB包,然后复制下来使用即可。
Q:协议传输模式鼠标包怎么填充?
A:需要使用的命令码:
这里以USB相对鼠标为例:
协议文档介绍比较全面,可直接参考,此外开发时同样可以使用USB分析仪软件(USB2.0 Monitor或者BusHound等工具)抓取计算机上的USB鼠标操作时的USB包,然后复制下来使用即可。
Q:使用键盘功能遇到部分机器键码上传不正确?
A:如果遇到传多个键盘码有码丢失、重复或干脆不响应的问题,可从以下几个方面排查:
1、上传时USB键盘设备是否在线,可通过设备管理器的“USB键盘”列表查看是否有CH9329对应的KeyBoard,右击“属性”->“详细信息”-》“硬件ID”,芯片默认VID是:0x1A86。
2、检查串口数据和USB数据是否符合设计预期,如果是协议传输模式,检查每个串口数据包的回复内容是否正确。
3、若串口数据和USB数据均未报错,尝试放慢上传间隔。
(1)、在ASCII码模式下,控制串口字符间的发送间隔,建议区间为5~50ms
(2)、在协议传输或透传模式下,控制每个键盘包的包间隔,建议区间为10~100ms
4、若主机端收不到任何数据,则原因可能为:部分主机只能使用固定VID和PID的键盘,此时要用配置工具修改CH9329的USB ID信息和原有设备相同。
5、若遇到上传的键盘数据中若存在连续相同键值,只显示第一个数据,后面重复的不显示。比如:123444567778,只显示:12345678,此时原因为:
该部分机器对于连续键值上传时的释放包有特殊要求,此时ASCII模式(一个串口对应2个键盘包:一个按键包和一个释放包)无法适用,需要使用协议传输模式,在此模式下发包更改为:连续上传键值按键包,上传完成后最后再传一个释放包。
6、一个定位问题的便捷方式:出现兼容性问题后,若机器有正常可用的扫码枪等设备,可以使用USB总线分析仪或其他USB抓包软件抓取扫码枪和电脑之间的通讯数据包,然后使用CH9329模拟该设备发包规律上传。