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

文章详细介绍了CH9329芯片作为串口转USB设备的功能,包括工作模式(键盘、鼠标、自定义HID和复合模式)、串口通信模式(协议、ASCII和透传),以及如何配置和使用这些功能解决常见问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述

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

特点

  • 芯片出厂内置固件程序,无需进行二次开发。
  • 支持Windows/Linux/安卓/macOS等操作系统,使用系统内置的键盘、鼠标、HID设备驱动程序,无需额外安装。
  • 提供4种工作模式(单一键盘/鼠标/自定义HID功能,或几个功能的复合)。
  • 提供3种串口通信模式(协议传输模式/ASCII模式/透传模式)。
  • 支持USB设备信息、串口通信地址、键盘回车符等信息的配置。

工作模式

工作模式功能说明
0USB键盘+USB鼠标+自定义HID
1USB键盘
2USB键盘+USB鼠标
3自定义HID

串口通信模式

串口通信模式功能说明
0协议传输模式
1ASCII模式
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模拟该设备发包规律上传。
 

STM32F103C8 Serial(UART) to USB HID Keyboard Mouse 串口 USB键盘鼠标 (1) 使用Composite Device 组合(复合)设备 (1.1) 1个Device -> 1个 Configuation -> 2个Interfance (Keyboard & Mouse) (1.2) Keyboard Interfance -> HID (boot mode) -> 2个Endpoint(IN_0x81 & OUT_0x01) -> KeyboardReportDescriptor(不使用Report ID) (1.3) Mouse Interfance -> HID (boot mode) -> 1个Endpoint(IN_0x82) -> MouseReportDescriptor(不使用Report ID) (1.4) 使用HID boot模式, 不使用Report ID, 以便兼容在 计算器设定BIOS模式 中的操作 (2) 串口接收 命令 (2.1) UART协议: 115200, n, 8, 1 (2.2) 1帧发送字符串格式, 以 '{'开始; '}'结束; ','分隔. 共9个10进制数字 例如: {1,2,3,4,5,6,7,8,9} (2.3) 第9位 区分 Keyboard(64) 或是 Mouse(128) 命令 例如: {0,0,0,0,0,0,0,0,64} --- 发送Keyboard命令 {0,0,0,0,0,0,0,0,128} --- 发送Keyboard命令 (3) 发送Keyboard键盘命令时 : 第1~8位 分别如下 (3.1) 第1位 : Key_Release = 0x00, Left_Control = 0x01, Left_Shift = 0x02, Left_Alt = 0x04, Left_GUI = 0x08, Right_Control = 0x10, Right_Shift = 0x20, Right_Alt = 0x40, Right_GUI = 0x80, 例如: {8,0,0,0,0,0,0,0,64} --- 发送 Win_Key键 {128,0,0,0,0,0,0,0,64} --- 发送 WinApp_Key键 {32,0,0,0,0,0,0,0,64} --- 发送 右Shift键 (3.2) 第2位 : 保留,不使用,一律填0 (3.3) 第3~8位 : 可以同时发送6个Keyboard按键 例如: {0,0,4,5,6,7,8,9,64} --- 发送 'abcdef'键 {2,0,4,5,6,7,8,9,64} --- 按住 左Shift 发送 'abcdef'键 => 'ABCDEF' {0,0,0,5,0,7,0,9,64} --- 发送 'bdf'键 (0表示 无按键) 按键码 可参阅: (HID Usage ID) http://download.microsoft.com/download/1/6/1/161ba512-40e2-4cc9-843a-923143f3456c/translate.pdf https://www.hiemalis.org/~keiji/PC/scancode-translate.pdf https://gist.github.com/MightyPork/6da26e382a7ad91b5496ee55fdc73db2 http://www.usb.org/developers/hidpage/Hut1_12v2.pdf (4) 发送Mouse鼠标命令时 : 第1~8位 分别如下 (4.1) 第1位 : Button_Release = 0x00, Left_Button = 0x01, Right_Button = 0x02, Mid_Button = 0x04, 例如: {1,0,0,0,0,0,0,0,128} --- 点击 左键 {2,0,0,0,0,0,0,0,128} --- 点击 右键 {4,0,0,0,0,0,0,0,128} --- 点击 中键 (4.2) 第2~4位 : 移动(X,Y), 滚轮(Wheel) X: -127~127:左右移动鼠标 Y: -127~127:上下移动鼠标 Wheel: -127~127:上下动滚轮 例如: {0,20,-10,0,0,0,0,0,128} --- 鼠标 右移20,上移10 {0,0,0,-30,0,0,0,0,128} --- 滚轮-30 (4.2) 第5~8位 : 保留,不使用,一律填0
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PC技术小能手

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值