You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

技术求助:为带双摇杆的Arduino Uno(CH340G)适配C#游戏手柄驱动库

将Arduino摇杆模拟为游戏手柄的C#实现方案

整体思路

先通过Arduino读取摇杆的模拟输入,将数据通过串口发送到电脑;再用C#程序读取串口数据,借助虚拟手柄库将数据转为系统可识别的游戏手柄输入。


步骤1:Arduino端代码(读取摇杆并发送数据)

假设两个摇杆的X/Y轴分别连接到Arduino的A0、A1、A2、A3引脚,代码如下:

const int joystick1X = A0;
const int joystick1Y = A1;
const int joystick2X = A2;
const int joystick2Y = A3;

void setup() {
  Serial.begin(9600);
  pinMode(joystick1X, INPUT);
  pinMode(joystick1Y, INPUT);
  pinMode(joystick2X, INPUT);
  pinMode(joystick2Y, INPUT);
}

void loop() {
  int x1 = analogRead(joystick1X);
  int y1 = analogRead(joystick1Y);
  int x2 = analogRead(joystick2X);
  int y2 = analogRead(joystick2Y);
  
  // 以逗号分隔发送四个轴的数据
  Serial.print(x1);
  Serial.print(",");
  Serial.print(y1);
  Serial.print(",");
  Serial.print(x2);
  Serial.print(",");
  Serial.println(y2);
  
  delay(50); // 控制数据发送频率,避免串口拥堵
}

步骤2:C#端库选择与实现

推荐库:VJoy + VJoyInterfaceWrap

VJoy是一款虚拟游戏手柄驱动,安装后系统会识别出虚拟手柄设备;VJoyInterfaceWrap是其官方的.NET封装库,可直接在Visual Studio中通过NuGet安装。

操作流程

  1. 安装VJoy驱动:下载并安装VJoy官方驱动,完成后在设备管理器中确认虚拟手柄设备存在。
  2. NuGet安装库:在C#项目中搜索并安装VJoyInterfaceWrap包。
  3. C#核心代码:
using System;
using System.IO.Ports;
using VJoyInterfaceWrap;

class JoystickToGamepad
{
    static VJoy _virtualGamepad;
    static uint _deviceId = 1; // 对应VJoy设置的虚拟手柄ID
    static SerialPort _serialPort;

    static void Main(string[] args)
    {
        // 初始化VJoy虚拟手柄
        _virtualGamepad = new VJoy();
        if (!_virtualGamepad.vJoyEnabled())
        {
            Console.WriteLine("VJoy驱动未启用,请检查驱动安装");
            return;
        }

        if (!_virtualGamepad.GetVJDStatus(_deviceId))
        {
            Console.WriteLine("虚拟手柄设备未就绪,请检查VJoy配置");
            return;
        }

        // 初始化串口连接Arduino
        _serialPort = new SerialPort("COM3", 9600); // 替换为你的Arduino串口号
        try
        {
            _serialPort.Open();
            _serialPort.DataReceived += OnSerialDataReceived;
            Console.WriteLine("连接成功,开始模拟游戏手柄...");
            Console.ReadLine();
        }
        catch (Exception ex)
        {
            Console.WriteLine($"串口连接失败:{ex.Message}");
        }
        finally
        {
            _serialPort?.Close();
        }
    }

    private static void OnSerialDataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        string rawData = _serialPort.ReadLine().Trim();
        string[] axisValues = rawData.Split(',');
        if (axisValues.Length != 4) return;

        // 解析Arduino发送的四个轴数据
        if (int.TryParse(axisValues[0], out int x1) && int.TryParse(axisValues[1], out int y1)
            && int.TryParse(axisValues[2], out int x2) && int.TryParse(axisValues[3], out int y2))
        {
            // 将Arduino的0-1023范围转换为VJoy的0-32767范围
            long vx1 = MapValue(x1, 0, 1023, 0, 32767);
            long vy1 = MapValue(y1, 0, 1023, 0, 32767);
            long vx2 = MapValue(x2, 0, 1023, 0, 32767);
            long vy2 = MapValue(y2, 0, 1023, 0, 32767);

            // 将数据发送到虚拟手柄的对应轴
            _virtualGamepad.SetAxis(vx1, _deviceId, HID_USAGES.HID_USAGE_X);    // 左摇杆X
            _virtualGamepad.SetAxis(vy1, _deviceId, HID_USAGES.HID_USAGE_Y);    // 左摇杆Y
            _virtualGamepad.SetAxis(vx2, _deviceId, HID_USAGES.HID_USAGE_Z);    // 右摇杆X
            _virtualGamepad.SetAxis(vy2, _deviceId, HID_USAGES.HID_USAGE_RZ);   // 右摇杆Y
        }
    }

    // 数值范围映射方法
    private static long MapValue(int input, int inMin, int inMax, long outMin, long outMax)
    {
        return (long)((input - inMin) * (outMax - outMin) / (double)(inMax - inMin) + outMin);
    }
}

备选库:SharpDX.DirectInput

如果不需要系统级的虚拟手柄,仅需在特定C#游戏中模拟输入,可使用SharpDX.DirectInput。通过NuGet安装SharpDX和SharpDX.DirectInput包,读取串口数据后直接模拟手柄轴输入,但此方案仅适用于基于DirectInput的游戏,兼容性不如VJoy。


注意事项

  • 确保Arduino的串口波特率与C#代码中的设置一致(示例中为9600)。
  • 运行C#程序时需以管理员权限启动,否则可能无法访问VJoy设备。
  • 可根据需求调整VJoy的轴映射,比如添加按键模拟(需在Arduino端增加按键输入并发送对应数据)。

内容的提问来源于stack exchange,提问作者villager 164

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 12:15:14