串口转HID键鼠功能芯片CH9329应用指南

概述

CH9329是一款串口转USB HID设备功能芯片,根据不同的工作模式,HID设备可以识别为:USB键盘设备、USB鼠标设备或者自定义HID类设备。接收串口数据,并自动根据串口工作模式进行数据解析,解析完成后按照HID类设备规范,将数据打包通过USB口上传给计算机。


image.png


特点

1、芯片出厂内置固件程序,无需进行二次开发。

2、支持Windows/Linux/安卓/macOS等操作系统,使用系统内置的键盘、鼠标、HID设备驱动程序,无需额外安装。

3、提供4种工作模式(单一键盘/鼠标/自定义HID功能,或几个功能的复合)。

4、提供3种串口通信模式(协议传输模式/ASCII模式/透传模式)。

5、支持USB设备信息、串口通信地址、键盘回车符等信息的配置。


工作模式

image.png

串口通信模式

image.png

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:需要使用的命令码:

image.png

这里以USB键盘普通数据为例:


image.png

串口报文的核心数据就是中间的8个字节的内容,这8个数据芯片提取后会直接通过USB打包上传给计算机,内容格式:

image.png

对于字节3~字节8的对应键值,可查看文档附录的“CH9329 键码表”

image.png

如:数字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:需要使用的命令码:

image.png

这里以USB相对鼠标为例:

image.png

image.png


协议文档介绍比较全面,可直接参考,此外开发时同样可以使用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模拟该设备发包规律上传。


不支持单一鼠标模式吗


您好,CH9329不支持单一鼠标模式。


请教,9329芯片原理图,LED灯用3k3电阻为啥?


您好,芯片原理图中的电阻仅为配合LED使用起到限流作用,无特别要求。可根据实际需求选择是否使用,及调节阻值。


请教:

我的应用场景是RS232接口输出的条码数据转为USB HID输出。条码数据25条以内没什么问题,条码超过30条,就会出现数据丢失的情况。请问有什么解决的思路吗?

每个条码的长度是20个字节,RS232的波特率是9600,MCU给9329的发送逻辑是while(1)里面查询,有数据就往9329发。是不是给9329发太快了,超过30个条码的时候,9329内部缓存满了导致部分数据被覆盖??

硬件方案是通过MCU接收到RS232数据后,转发给CH9329输出。

CH9329使用的工作模式1:单一键盘功能,串口工作模式1:ASCII模式。


您好,请按照置顶帖的方法排查下问题。

image.png


硬件挺好,就是缺一个对应CH9329的定制串口客户端。再+光电隔离,+CH340,这样直接就可以安全控制主机了。


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