没有windows DLL的C#和HID
我正在用C#开发一个监控系统,它通过RS485控制器连接到一些仪器。该控制器由微芯片处理器制成,Windows操作系统将其识别为HID设备(USB即插即用)。 也就是说,我使用Windows dll函数(hid.dll)进行开发,如下代码块所示:没有windows DLL的C#和HID,c#,.net,dll,mono,hid,C#,.net,Dll,Mono,Hid,我正在用C#开发一个监控系统,它通过RS485控制器连接到一些仪器。该控制器由微芯片处理器制成,Windows操作系统将其识别为HID设备(USB即插即用)。 也就是说,我使用Windows dll函数(hid.dll)进行开发,如下代码块所示: [DllImport("hid.dll", SetLastError = true)] public static extern void HidD_GetHidGuid(ref Guid hidGuid); [DllImpo
[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平台上。如果您提出了一个通用接口,那么您可以在每个平台上实现该接口,或者封装已经为这些平台编写的库。这就是如何实现依赖注入()的基础 您提到的API调用对Windows非常有用,但在其他平台上则完全不同 下面是my library()中的一个基本示例:
公共接口IHidDevice:IDisposable
{
///
///在设备成功连接后发生。注意:这可以调用多次,并且每次调用InitializeAsync成功时都会发生。
///
事件处理程序已连接;
///
///占位符。当前未使用此占位符。请暂时不要依赖此占位符。
///
事件处理程序断开连接;
///
///检查设备是否已成功连接。注意:检查实现以查看此方法是否实际询问设备是否仍在连接
///
任务GetIsConnectedAsync();
///
///阅读一页数据
///
任务ReadAsync();
///
///写一页数据
///
任务WriteAsync(字节[]数据);
///
///设备的供应商Id
///
int VendorId{get;}
///
///设备的产品Id
///
int ProductId{get;}
///
///处理所有现有连接并重新初始化设备
///
任务初始化同步();
}
该库已经支持Windows、Android和UWP。下面是使用您提到的一些API的示例实现:
此外,这个旧的Hid库支持Linux,但不使用基于任务的异步。也许您可以从那里获取Linux代码
我会开始在UHID周围闲逛。嗨@dna,谢谢你的帮助。。我在这个链接上发现了一个有趣的库:我现在正在尝试使用它
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();
}