gpt4 book ai didi

没有 Windows dll 的 C# 和 HID

转载 作者:行者123 更新时间:2023-11-30 18:26:06 25 4
gpt4 key购买 nike

我正在使用 C# 开发监控系统,它通过 RS485 Controller 连接到一些仪器。这个 Controller 是用一个 microship 处理器制成的,Windows 操作系统将它识别为一个 HID 设备(USB 即插即用)。也就是说,我使用 Windows dll 函数 (hid.dll) 进行开发,如下面的代码块所示:

    [DllImport("hid.dll", SetLastError = true)]
public static extern void HidD_GetHidGuid(ref Guid hidGuid);

[DllImport("hid.dll", SetLastError = true)]
public static extern bool HidD_GetNumInputBuffers(SafeFileHandle hidDeviceObject, ref Int32 numberBuffers);

[DllImport("hid.dll", SetLastError = true)]
public static extern bool HidD_GetPreparsedData(SafeFileHandle hidDeviceObject, ref IntPtr preparsedData);

今天,我正在研究这个应用程序到带有 Mono 的 Linux 操作系统(Debian 发行版)的端口,我相信 Linux 不会处理这些调用,因为它基于 Windows 操作系统。

有没有其他方法可以在不使用这些 dll 的情况下将 HID 设备与 C# 集成?或者您是否知道如何实现这一目标?

最佳答案

您需要做的是想出一个通用界面,该界面适用于您将定位的所有 Hid 平台。如果你想出了一个通用接口(interface),你可以在每个平台上实现这个接口(interface)——或者包装已经为这些平台编写的库。这就是您实现依赖注入(inject)的基本方法 ( https://en.wikipedia.org/wiki/Dependency_injection )。

您提到的 API 调用对于 Windows 非常有用,但在其他平台上将完全不同。

这是我的库 ( https://github.com/MelbourneDeveloper/Device.Net/blob/main/src/Hid.Net/IHidDevice.cs ) 中的一个基本示例:

public interface IHidDevice : IDisposable
{
/// <summary>Occurs after the device has successfully connected. Note: this can be called multiple times and will occurr every time InitializeAsync is called successfull</summary>
event EventHandler Connected;

/// <summary>Placeholder. This is not currently being used. Please do not rely on this at the moment</summary>
event EventHandler Disconnected;

/// <summary>Checks to see if the device has been successfully connected. Note: check the implementation to see if this method is actually asking the device whether it is still connected or not</summary>
Task<bool> GetIsConnectedAsync();

/// <summary>Read a page of data</summary>
Task<byte[]> ReadAsync();

/// <summary>Write a page of data</summary>
Task WriteAsync(byte[] data);

/// <summary>The device's Vendor Id</summary>
int VendorId { get; }

/// <summary>The device's Product Id</summary>
int ProductId { get; }

/// <summary>Dispose of any existing connections and reinitialize the device</summary>
Task InitializeAsync();
}

该库已经支持 Windows、Android 和 UWP。以下是使用您提到的一些 API 的示例实现: https://github.com/MelbourneDeveloper/Device.Net/blob/main/src/Hid.Net/Windows/WindowsHidApiService.cs

此外,这个较旧的 Hid 库支持 Linux,但不使用基于任务的异步。也许您可以从那里获取 Linux 代码。

https://github.com/treehopper-electronics/HIDSharp/tree/master/HidSharp/Platform/Linux

关于没有 Windows dll 的 C# 和 HID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29083558/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com