通过c#控制物理设备

时间:2012-08-08 21:10:15

标签: c# device

我想控制一个物理设备。即:闪烁一些LED或转动伺服。 (只是这么简单,我将我的LED支脚连接到USB的支脚或串行端口引脚,并向LED的一个支脚发送信号并点亮它,并与伺服相同。)

问题:我怎样才能在C#中做到这一点?如何通过USB或串口发送信号?我需要什么东西?我该如何管理呢?感谢。

 messageBox.Show("How to control a physical device via c# ?");

 messageBox.Show("thanks");

2 个答案:

答案 0 :(得分:4)

您需要一种能够将USB信号转换为设备理解信号的设备(可能是LED的简单开启或关闭)。

我使用了U421 in the past,他们有一个库,您只需使用P / Invoke加载DLL,然后就可以将信号发送到芯片上的引脚。然后,您需要将任何想要控制的内容连接到芯片(正确,但这超出了Stack Overflow的范围,您可能需要尝试Electronics.StackExchange.com)。有关示例代码和接线图,请参阅the USBMicro website上的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);

答案 1 :(得分:3)

您可以像这样使用您的串口:

  SerialPort port = new SerialPort("COM1", 2400, Parity.None, 8, StopBits.One);
  port.Open();
  port.Write(new byte[] {0x00, 0xFF, 0xFF}, 0, 3);
  port.Close();

整个过程将在串行端口的一条线上逐位发送,并附加用于传输控制的位。

你可以用这个闪烁LED。您需要将LED连接到引脚发送数据和接地,通常是插头盖或引脚之一。查看this以获取参考。您还需要电阻来降低电流。 3k [ohm]电阻应该做。

可以驱动小型伺服电机但不是那么容易。最好通过连接到您计算机的微控制器来控制伺服。

您可以连接两台计算机并与之交换数据。

你可以燃烧你的设备,所以要小心。

您还可以购买或构建this

之类的内容

编辑: 好的,很多问题。

  

问题1)为什么它很难?我只是发信号到伺服和   让它像我在LED上那样运行?

串口是一个通信端口,因此的目的是进行通信而不是驱动设备。它的功率很低。该端口将存储数据发送到缓冲区并逐位发送。所以它很难塑造PWM \ {{}} PPM,毕竟结果也不会很棒。根据您拥有的电机您可能需要其他控制方法,但也很难用串口实现。如果您真的想从端口驱动硬件,我会建议signal to drive servo

  

问题2)在哪些情况下我烧我的设备?你的意思是我烧我的串口?或者我烧LED或伺服?

     

问题3)你说“你的PC也应该有当前有限的输出”   所以,如果我提出一个电阻器,那么我可以管理这个吗?和   在所有情况下3k都能解决吗?

如果您对电气parallel portcircuitsnetworks了解不够,那么您很有可能损坏您的设备。你可以烧掉所有这些,在最坏的情况下也可以烧你的PC和房子!您需要担心的前两个问题是analysisshort circuit

当电阻值过低时,电流限制输出应降低电流。这样可以防止串口驱动在PC主板上的损坏。

3k电阻符合electrostatic discharge要求(3-7 [kOhm] <2500 [pF])。应将电流降至4 [mA]以下。所以在理论上它应该解决所有情况。

  

问题4)我将在哪里编写代码?在按钮1中单击?我的意思是,我说我有一个winform和一个按钮,我会把你的代码写入按钮点击事件吗?

您可以在打开程序时打开端口。然后点击按钮写入端口。然后关闭程序关闭端口。按钮单击上的所有代码也应该起作用。


PS。:也可以将串口连接到声卡的音频输入,然后在串口发送数据并将其记录为音频。它像简单的示波器一样工作。 (你可以用这个损坏你的电脑)