我有USB继电器,我需要编程,以便在指定的时间内打开一段时间然后关闭。我试图整合提供给我的DLL,但是无法做到(或者我做错了)。还试图找到一些指导如何做到这一点,也没有成功。
USB中继:songle srd-05vdc-sl-c
我正在使用VS 2013,我正在尝试制作简单的C#应用程序。 也许还有其他错误,因为HIDAPI GUI应用程序不会将我的继电器显示为连接设备。 如果改变了什么,我坐在Windows 8上。
答案 0 :(得分:5)
由于您的DLL是带有导出的C ++或C库,因此您可以使用平台调用来调用dll中的方法。
使用您在评论(mirror - 16.06.2015)中提供的文件,这里是您的包装器的样子。可能有错误,所以请将此视为一个例子。我根据头文件中的注释添加了XML注释。
请注意,要使其正常工作,您需要将usb_relay_device.dll
放在与C#可执行文件相同的文件夹中。最好的方法是将文件添加到项目中并设置" 复制到输出目录"在VS的解决方案资源管理器中始终复制或复制如果更新。
using System;
using System.Runtime.InteropServices;
namespace UsbRelay
{
public static class UsbRelayDevice
{
/// <summary>
/// Init the USB Relay Libary
/// </summary>
/// <returns>This function returns 0 on success and -1 on error.</returns>
[DllImport("usb_relay_device.dll", EntryPoint = "usb_relay_init")]
public static extern int Init();
/// <summary>
/// Finalize the USB Relay Libary.
/// This function frees all of the static data associated with
/// USB Relay Libary. It should be called at the end of execution to avoid
/// memory leaks.
/// </summary>
/// <returns>This function returns 0 on success and -1 on error.</returns>
[DllImport("usb_relay_device.dll", EntryPoint = "usb_relay_exit")]
public static extern int Exit();
/// <summary>
/// Enumerate the USB Relay Devices.
/// </summary>
/// <returns></returns>
[DllImport("usb_relay_device.dll", EntryPoint = "usb_relay_device_enumerate")]
public static extern UsbRelayDeviceInfo Enumerate();
/// <summary>
/// Free an enumeration Linked List
/// </summary>
/// <param name="deviceInfo"></param>
[DllImport("usb_relay_device.dll", EntryPoint = "usb_relay_device_free_enumerate")]
public static extern void FreeEnumerate(UsbRelayDeviceInfo deviceInfo);
/// <summary>
/// Open device that serial number is serialNumber
/// </summary>
/// <param name="serialNumber"></param>
/// <param name="stringLength"></param>
/// <returns>This funcation returns a valid handle to the device on success or NULL on failure.</returns>
[DllImport("usb_relay_device.dll", EntryPoint = "usb_relay_device_open_with_serial_number", CharSet = CharSet.Ansi)]
public static extern int OpenWithSerialNumber([MarshalAs(UnmanagedType.LPStr)] string serialNumber, int stringLength);
/// <summary>
/// Open a usb relay device
/// </summary>
/// <param name="deviceInfo"></param>
/// <returns>This funcation returns a valid handle to the device on success or NULL on failure.</returns>
[DllImport("usb_relay_device.dll", EntryPoint = "usb_relay_device_open")]
public static extern int Open(UsbRelayDeviceInfo deviceInfo);
/// <summary>
/// Close a usb relay device
/// </summary>
/// <param name="hHandle"></param>
[DllImport("usb_relay_device.dll", EntryPoint = "usb_relay_device_close")]
public static extern void Close(int hHandle);
/// <summary>
/// open a relay channel on the USB-Relay-Device
/// </summary>
/// <param name="hHandle">Which usb relay device your want to operate</param>
/// <param name="index">Which channel your want to open</param>
/// <returns>0 -- success; 1 -- error; 2 -- index is outnumber the number of the usb relay device</returns>
[DllImport("usb_relay_device.dll", EntryPoint = "usb_relay_device_open_one_relay_channel")]
public static extern int OpenOneRelayChannel(int hHandle, int index);
/// <summary>
/// open all relay channel on the USB-Relay-Device
/// </summary>
/// <param name="hHandle">which usb relay device your want to operate</param>
/// <returns>0 -- success; 1 -- error</returns>
[DllImport("usb_relay_device.dll", EntryPoint = "usb_relay_device_open_all_relay_channel")]
public static extern int OpenAllRelayChannels(int hHandle);
/// <summary>
/// close a relay channel on the USB-Relay-Device
/// </summary>
/// <param name="hHandle">which usb relay device your want to operate</param>
/// <param name="index">which channel your want to close</param>
/// <returns>0 -- success; 1 -- error; 2 -- index is outnumber the number of the usb relay device</returns>
[DllImport("usb_relay_device.dll", EntryPoint = "usb_relay_device_close_one_relay_channel")]
public static extern int CloseOneRelayChannel(int hHandle, int index);
/// <summary>
/// close all relay channel on the USB-Relay-Device
/// </summary>
/// <param name="hHandle">hich usb relay device your want to operate</param>
/// <returns>0 -- success; 1 -- error</returns>
[DllImport("usb_relay_device.dll", EntryPoint = "usb_relay_device_close_all_relay_channel")]
public static extern int CloseAllRelayChannels(int hHandle);
/// <summary>
/// status bit: High --> Low 0000 0000 0000 0000 0000 0000 0000 0000, one bit indicate a relay status.
/// the lowest bit 0 indicate relay one status, 1 -- means open status, 0 -- means closed status.
/// bit 0/1/2/3/4/5/6/7/8 indicate relay 1/2/3/4/5/6/7/8 status
/// </summary>
/// <param name="hHandle"></param>
/// <param name="status"></param>
/// <returns>0 -- success; 1 -- error</returns>
[DllImport("usb_relay_device.dll", EntryPoint = "usb_relay_device_get_status")]
public static extern int GetStatus(int hHandle, ref int status);
}
/// <summary>
/// USB relay board info structure
/// </summary>
[StructLayout(LayoutKind.Sequential, Pack=8)]
public class UsbRelayDeviceInfo
{
[MarshalAs(UnmanagedType.LPStr)]
public string SerialNumber { get; set; }
[MarshalAs(UnmanagedType.LPStr)]
public string DevicePath { get; set; }
public UsbRelayDeviceType Type { get; set; }
public UsbRelayDeviceInfo Next { get; set; }
}
public enum UsbRelayDeviceType
{
OneChannel = 1,
TwoChannel = 2,
FourChannel = 4,
EightChannel = 8
}
}
要打开设备中的中继频道1,您可以执行以下操作:
if (UsbRelayDevice.Init() != 0)
{
Console.WriteLine("Couldn't initialize!");
return;
}
string serial = "serial number here";
int deviceHandle = UsbRelayDevice.OpenWithSerialNumber(serial, serial.Length);
int openResult = UsbRelayDevice.OpenOneRelayChannel(deviceHandle, 1);
if (openResult == 1)
{
Console.WriteLine("Got error from OpenOneRelayChannel!");
return;
}
else if (openResult == 2)
{
Console.WriteLine("Index is out of range on the usb relay device");
return;
}