3

我想控制一个物理设备。即:闪烁一些LED或转动伺服。(非常简单,我将把我的 LED 的腿连接到 USB 的腿或串行端口引脚,然后将信号发送到 LED 的一个腿并用伺服点亮它。)

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

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

 messageBox.Show("thanks");
4

2 回答 2

4

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

我过去使用过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-08T21:18:39.590 回答
4

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

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

整个事情将在串行端口的一根线上逐位发送,并带有用于传输控制的附加位。

You can blink LED with this. You need to connect LED to pin Transmit Data and to Ground that is usually the plug cover or one of pins. Check this for reference. You need also resistor to lower the current. 3k [ohm] resistor should do.

Driving small servo motor is possible but not that easy. Its better to control servo with microcontroller connected to Your computer.

You can connect two computers and exchange data with this.

You can burn Your equipment so be careful.

You can also buy or build something like this

EDIT: Ok, lots of questions.

QUESTION 1) why its hard? cant i just send a signal to the servo and make it run just like i did on the LED?

Serial port is a communication port so its purpose is to communicate and NOT to drive equipment. Its power capabilities are low. This port will store data to send in buffer and send bit by bit. So its extremely hard to shape PWM \ PPM signal to drive servo and after all result are not gonna be brilliant as well. Depending on motor that You have You may need other control method, but it will be hard to implement with serial port as well. If You really want to drive hardware from a port I would advice parallel port.

QUESTION 2) in which cases i burn my equipment? and do u mean i burn my serial port? or i burn LED or the servo?

QUESTION 3) you said "Your PC should also have current limited output" so as you referred if i put a resistor then i can manage this? and does 3k solves in all case?

In case You do not know enough about electrical circuits, networks and analysis then You have big chance to damage Your equipment. You can burn all of them and in worst case scenario also Your PC and house! First two problems that You need to worry about are short circuit and electrostatic discharge

Current limited output should lower current when resistors value is too low. This should prevent the damage of serial port driver on mainboard of PC.

3k resistor complies with serial port specification requirements (3-7[kOhm] <2500[pF]). It should drop taken current below 4[mA]. So in theory it should solve all cases.

QUESTION 4) where will i write your code? in to the button1 clicked? i mean lest say i have a winform and a button there, will i write your code in to the button clicked event?

You can open port on opening Your program. Then write to port on button click. Then close port on close program. All the code on button click should work as well.


PS.: Its also possible to connect serial port to audio input of sound card and then send data on serial port and record it as audio. It works as simple oscilloscope. (You can damage Your PC with this)

于 2012-08-08T22:27:20.807 回答