2

我想建立一个将一些位发送到计算机的电路。我正在考虑使用 USB 端口使用 data+ 和 data- 电缆将位发送到计算机,但是我在弄清楚如何捕获这些位时遇到了一些问题。如何在 C# 中捕获这些位,而无需编写任何驱动程序?

我已经阅读了许多关于从 USB 读取的先前帖子,但没有一个回答我的问题。

4

2 回答 2

1

最简单的解决方案是您需要一个能够将您的 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);
于 2012-08-19T18:41:43.160 回答
0

另一种选择是使用现成的自定义驱动程序。这是libusb-win32的示例。它安装了上层过滤设备驱动程序,并允许您向 USB 发送标准/文档甚至自定义命令。

PS 向下滚动到“链接”部分以查找 C#/VB.NET 下载和代码示例的链接。

于 2012-08-20T07:07:10.623 回答