我想建立一个将一些位发送到计算机的电路。我正在考虑使用 USB 端口使用 data+ 和 data- 电缆将位发送到计算机,但是我在弄清楚如何捕获这些位时遇到了一些问题。如何在 C# 中捕获这些位,而无需编写任何驱动程序?
我已经阅读了许多关于从 USB 读取的先前帖子,但没有一个回答我的问题。
最简单的解决方案是您需要一个能够将您的 I/O 信号转换为您的 USB 端口能够理解的信号的设备。
我过去使用过U421,他们有一个库,您只需使用 P/Invoke 加载 DLL,然后您就可以将信号发送到芯片上的引脚。然后,您需要将要读取的任何内容连接到芯片(正确,但这超出了 Stack Overflow 的范围,您可能想尝试Electronics.StackExchange.com)。有关示例代码和接线图,请参见 USBMicro 网站U4x1 Application Notes
上的部分。
来自网站的示例代码:
⁄⁄ needed to import the .dll
using System.Runtime.InteropServices;
public class USBm
{
public static byte BitA0 = 0x00;
public static byte BitA1 = 0x01;
public static byte BitA2 = 0x02;
public static byte BitA3 = 0x03;
public static byte BitA4 = 0x04;
public static byte BitA5 = 0x05;
public static byte BitA6 = 0x06;
public static byte BitA7 = 0x07;
public static byte BitB0 = 0x08;
public static byte BitB1 = 0x09;
public static byte BitB2 = 0x0A;
public static byte BitB3 = 0x0B;
public static byte BitB4 = 0x0C;
public static byte BitB5 = 0x0D;
public static byte BitB6 = 0x0E;
public static byte BitB7 = 0x0F;
⁄⁄ USBm.dll - C# pInvoke examples
⁄⁄ "Commands"
⁄⁄ [DllImport("USBm.dll", EntryPoint = "USBm_FindDevices", CharSet = CharSet.Auto)]
[DllImport("USBm.dll")]
public static extern bool USBm_FindDevices();
[DllImport("USBm.dll")]
public static extern int USBm_NumberOfDevices();
[DllImport("USBm.dll")]
public static extern bool USBm_DeviceValid(int Device);
[DllImport("USBm.dll")]
public static extern bool USBm_About(StringBuilder About);
[DllImport("USBm.dll")]
public static extern bool USBm_Version(StringBuilder Version);
[DllImport("USBm.dll")]
public static extern bool USBm_Copyright(StringBuilder Copyright);
[DllImport("USBm.dll")]
public static extern bool USBm_DeviceMfr(int Device, StringBuilder Mfr);
[DllImport("USBm.dll")]
public static extern bool USBm_DeviceProd(int Device, StringBuilder Prod);
[DllImport("USBm.dll")]
public static extern int USBm_DeviceFirmwareVer(int Device);
[DllImport("USBm.dll")]
public static extern bool USBm_DeviceSer(int Device, StringBuilder dSer);
[DllImport("USBm.dll")]
public static extern int USBm_DeviceDID(int Device);
[DllImport("USBm.dll")]
public static extern int USBm_DevicePID(int Device);
[DllImport("USBm.dll")]
public static extern int USBm_DeviceVID(int Device);
[DllImport("USBm.dll")]
public static extern bool USBm_DebugString(StringBuilder DBug);
[DllImport("USBm.dll")]
public static extern bool USBm_RecentError(StringBuilder rError);
[DllImport("USBm.dll")]
public static extern bool USBm_ClearRecentError();
[DllImport("USBm.dll")]
public static extern bool USBm_SetReadTimeout(uint TimeOut);
[DllImport("USBm.dll")]
public static extern bool USBm_ReadDevice(int Device, byte[] inBuf);
[DllImport("USBm.dll")]
public static extern bool USBm_WriteDevice(int Device, byte[] outBuf);
[DllImport("USBm.dll")]
public static extern bool USBm_CloseDevice(int Device);
}
函数调用示例
⁄⁄ Test USBm device attached
if ( !USBm.USBm_FindDevices() )
{
MessageBox.Show( string.Format("No Device Present"), "USBm Devices", MessageBoxButtons.OK, MessageBoxIcon.Information );
return;
} ⁄⁄ implied else
⁄⁄Walk the USBm.dll functions
⁄⁄ some containers
StringBuilder sb = new StringBuilder( 200 );
bool result = false; ⁄⁄ return values
⁄⁄ .DLL FindDevices returns the number of devices
result = USBm.USBm_FindDevices();
⁄⁄ return the number of devices
int TotalDevices = USBm.USBm_NumberOfDevices();
int Device = TotalDevices -1; ⁄⁄ only One device is ever attached so ...
⁄⁄ .DLL About info
result = USBm.USBm_About( sb );
⁄⁄ .DLL Version info
result = USBm.USBm_Version( sb );
⁄⁄ .DLL Copyright info
result = USBm.USBm_Copyright( sb );
⁄⁄ Device Valid
result = USBm.USBm_DeviceValid( Device );
⁄⁄ Device Manufacturer
result = USBm.USBm_DeviceMfr( Device, sb );
⁄⁄ Device Product String
result = USBm.USBm_DeviceProd( Device, sb );
⁄⁄ Device Firmware Version
int FirmVer = USBm.USBm_DeviceFirmwareVer(Device);
⁄⁄ Device SerialNumber [ ]
result = USBm.USBm_DeviceSer(Device, sb);
⁄⁄ Device DiD
int DID = USBm.USBm_DeviceDID(Device);
⁄⁄ Device PiD
int PID = USBm.USBm_DevicePID(Device);
⁄⁄ Device ViD
int VID = USBm.USBm_DeviceVID(Device);
⁄⁄ Device Debug String
result = USBm.USBm_DebugString(sb);
⁄⁄ Device Recent Error - always returns true
result = USBm.USBm_RecentError(sb);
⁄⁄ Device Clear Recent Error
result = USBm.USBm_ClearRecentError();
⁄⁄ Device SetReadTimeout [ sixteen-bit millisecond value]
uint tOUT = 3000;
result = USBm.USBm_SetReadTimeout(tOUT);
⁄⁄ Device WriteDevice [ 8 byte to write (device raw commands)]
byte[] OutBuf = { 0, 21, 3, 65, 8, 17, 60, 0 };
result = USBm.USBm_WriteDevice(Device, OutBuf);
⁄⁄ Device ReadDevice [ ]
byte[] InBuf = { 0, 0, 0, 0, 0, 0, 0, 0 };
result = USBm.USBm_ReadDevice(Device, InBuf);
// Device CloseDevice [ ]
result = USBm.USBm_CloseDevice(Device);
另一种选择是使用现成的自定义驱动程序。这是libusb-win32的示例。它安装了上层过滤设备驱动程序,并允许您向 USB 发送标准/文档甚至自定义命令。
PS 向下滚动到“链接”部分以查找 C#/VB.NET 下载和代码示例的链接。