鼠标宏系列之三-基于开发板的鼠标宏

2024-01-01 21:20:13

在上一篇光电鼠标中,我们分享了鼠标的实现代码,然从底层逻辑上看,那些代码涉及的东西都很坑,它们太贴近底层了,理解起来非常困难,没有多少软件工程师会去了解引脚定义。

这十几年来,ARM开发板发展非常迅猛,在目前已经有上百家开发板厂家,它们大部分是提供原理图和系统代码的,我们可以利用它们来做一些小工具,比如游戏辅助。

单片机/Arm开发板都可以使用,不过每款开发板的侧重点不同,在我反复测试之后终于筛选出几款比较合适的板子。

目前整理如下:

1. 直接使用的开发板系列: Arm 的 Auduino 衍生系列、单片机 的CH341A编程器系列。其中Auduino中有一款直接支持USB鼠标键盘,并直接在系统中给出SDK包zero-system接口;CH341A编程器则是从USB转串口衍生的。

2. 需要自己编程的开发板系列: 主要是水果派的,比如说Raspberry Pi、Orange Pi、banana pi这几种,它们往往是硬件和理论上支持,但是需要自己搞定1.USB鼠标接口的编程;2.主机和设备之间的通讯协议;3.上层的程序调用。

我们先讨论第一种,第二种由于种类繁多,就不会一一去解释如何构建,那是件很费力的事,后续我再做视频去讲解吧。

由于可以直接使用的开发板本身已经定义了鼠标键盘接口,所以我们直接对它们提供的接口编程即可,下面会从串口和网络的角度分别给出对应的定义:

基于串口的通讯协议
1. 打开/关闭串口

根据实际使用芯片进行调整,目前我使用的是:

波特率 = 119200
停止位 = 1 
数据位 = 8
奇偶校验 = None

2. 发送键盘数据:

|0x57|0xAB|0x01|BYTE1~BYTE8|

BYTE1 --
|--bit0: Left Control 是否按下,按下为 1
|--bit1: Left Shift 是否按下,按下为 1
|--bit2: Left Alt 是否按下,按下为 1
|--bit3: Left GUI 是否按下,按下为 1
|--bit4: Right Control 是否按下,按下为 1
|--bit5: Right Shift 是否按下,按下为 1
|--bit6: Right Alt 是否按下,按下为 1
|--bit7: Right GUI 是否按下,按下为 1
BYTE2 -- 设置为 00 即可
BYTE3--BYTE8 -- 这六个为普通按键

案例:

假设需要ctrl + a,那么对串口发送以下数据即可:

57 AB 01 01 00 04 00 00 00 00 00

3. 发送鼠标数据

|0x57|0xAB|0x02|BYTE1~BYTE4|

BYTE1 :按键 0x01 :表示左键按下;0x02 :表示右键按下;0x04 :表示中键按下
BYTE2 :X轴相对位移值 
BYTE3 :Y轴相对位移值
BYTE4 :滚轮

重点解释XY的移动,鼠标这里使用的是相对坐标,而不是绝对坐标

X轴相对位移值:
0x00-0x7F 鼠标向右移动,最大像素 127 个像素
0xFF-0x81 鼠标向左移动,最大像素 127 个像素

Y轴相对位移值:
0x00-0x7F 滚轮向上移动,数值越大,滚越多
0x81-0xFF 滚轮向下移动,数值越大,滚越少

案例:

鼠标向右和向下同时移动50像素单位,那么对串口发送以下数据即可:

57 AB 02 00 32 32 00

基于网络的通讯协议
enum NetType
{
    _mouse = 0,    // 鼠标命令
    _keyboard,     // 键盘命令
    _command       // 系统命令
}

// 注意,此处由于USB和网口都使用HID协议,所以鼠标键盘命令的格式和USB一样

网络命令格式:

|NetType|msg...|

1. 连接设备:

此处使用192.168.1.125地址,12315端口为例;

    client = socket(AF_INET, SOCK_STREAM, 0);
 
	//初始化地址包
	addrSer.sin_addr.S_un.S_addr = inet_addr("192.168.1.125");
	addrSer.sin_family = AF_INET;
	addrSer.sin_port = htons(12315);
 
    connect(client, (SOCKADDR*)&addrSer, sizeof(addrSer));

2. 发送数据,其中type, msg分别是命令类型和命令内容:

    char buff[1024] = {0};
    sprintf(buff, "%x%s", type, msg);
    send(client, buff, sizeof(buff), 0);

3. 接收数据
   
	int len = recv(client, buff, 1024, 0);
如何从开发板开始

好吧!不是所有人都希望使用官方的SDK,那么也讲解一下如何从开发板开始。

下面是我找到的图和参数:

参数大概如下图:

我们对开发板的需求如下:

1. USB是主从结构,在辅助的结构中,windows系统是从机,设备是主机,我们需要一个除了供电之外的USB/USB OTG接口,用来连接到电脑,对电脑发送键盘/鼠标等消息;

2. 除了USB接口,我们还需要串口和网口,用来和电脑通讯,当然,如果选择全部软件部署在开发板上,那么可以不用这个,但是网口是必须的。幸运的是大部分开发板都提供了网络接口。

3. 系统和编程支持足够,这对于架构来说不是一件容易的事。

根据这些准则,我们对上面那块开发板的评价就是,它也许合适,因为它有网络接口,同时有两个USB type-C接口,也给了开发文档,不过还是建议和官方进一步沟通(实际上经过我的沟通,发现它确实不太合适,因为它的生态是面向大规模定制的,导致编程上很多问题需要自己花额外更多的时间去解决)。

?注意:

1. 这个系列本身不是直接给可运行的代码,而是讲清楚原理,然后让读者自行实现,在这篇文章中,不可能去贴串口通讯的打开、发送、关闭之类的代码,那些代码都可以在网上找到,如果读者完全没办法做到自行编写单独的串口通讯代码和单独的TCP连接,那么读者应该先去自行学习编程基础。

2. 如果需要对应的硬件可以私信我。

文章来源:https://blog.csdn.net/m0_72813396/article/details/135281483
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。