我想控制一个物理设备。即:闪烁一些LED或转动伺服。 (只是这么简单,我将我的LED支脚连接到USB的支脚或串行端口引脚,并向LED的一个支脚发送信号并点亮它,并与伺服相同。)
问题:我怎样才能在C#中做到这一点?如何通过USB或串口发送信号?我需要什么东西?我该如何管理呢?感谢。
messageBox.Show("How to control a physical device via c# ?");
messageBox.Show("thanks");
答案 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 port,circuits和networks了解不够,那么您很有可能损坏您的设备。你可以烧掉所有这些,在最坏的情况下也可以烧你的PC和房子!您需要担心的前两个问题是analysis和short circuit
当电阻值过低时,电流限制输出应降低电流。这样可以防止串口驱动在PC主板上的损坏。
3k电阻符合electrostatic discharge要求(3-7 [kOhm] <2500 [pF])。应将电流降至4 [mA]以下。所以在理论上它应该解决所有情况。
问题4)我将在哪里编写代码?在按钮1中单击?我的意思是,我说我有一个winform和一个按钮,我会把你的代码写入按钮点击事件吗?
您可以在打开程序时打开端口。然后点击按钮写入端口。然后关闭程序关闭端口。按钮单击上的所有代码也应该起作用。
PS。:也可以将串口连接到声卡的音频输入,然后在串口发送数据并将其记录为音频。它像简单的示波器一样工作。 (你可以用这个损坏你的电脑)