几个快速问题.我有一个DMX王USB照明控制器,我正试图控制.
它基于Open DMX协议(来自Entec),提供ac#class.我已经将设备插入RGB设备,如果我用他们的驱动程序测试USB设备,它连接到COM4,当我将他们的软件切换到发送模式时,我可以设置单独的DMX通道.
使用他们的OpenDMX类,进行一些修改(核心是相同的,我刚刚添加了一些额外的错误检查,我可以找到设备,查询它的信息等.当我打开设备时,我得到一个句柄.我可以写使用FT_Write到那个设备但不管我做什么,实际上没有灯亮起来.
以下是一些相关的代码片段:
public static byte[] buffer;
[DllImport("FTD2XX.dll")]
public static extern FT_STATUS FT_Open(UInt32 uiPort, ref uint ftHandle);
[DllImport("FTD2XX.dll")]
public static extern FT_STATUS FT_Write(uint ftHandle, IntPtr lpBuffer, UInt32 dwBytesToRead, ref UInt32 lpdwBytesWritten);
public static void writeData()
{
while (!done)
{
try
{
initOpenDMX();
status = FT_SetBreakOn(handle);
status = FT_SetBreakOff(handle);
bytesWritten = write(handle, buffer, buffer.Length);
if (bytesWritten == 0)
{
break;
}
System.Threading.Thread.Sleep(25);
}
catch (Exception)
{
break;
}
}
Connected = false;
done = false;
}
Run Code Online (Sandbox Code Playgroud)
所有状态都以FT_Ok的形式返回,bytesWritten返回为512(此USB控制器上的通道数)
我一直在想我错过了将设备设置为传输模式或类似的设备(它只有一个DMX插槽)
public static void initOpenDMX()
{
status = FT_ResetDevice(handle);
status = FT_SetDivisor(handle, (char)12); // set baud rate
status = FT_SetDataCharacteristics(handle, BITS_8, STOP_BITS_2, PARITY_NONE);
status = FT_SetFlowControl(handle, (char)FLOW_NONE, 0, 0);
status = FT_ClrRts(handle);
status = FT_SetLatencyTimer(handle, (byte)40);
status = FT_Purge(handle, PURGE_TX);
status = FT_Purge(handle, PURGE_RX);
}
Run Code Online (Sandbox Code Playgroud)
我也尝试过Entec OpenDMX类而没有任何修改,它似乎也没有做任何事情.
只是想强调他们的控制软件工作正常,因此灯和控制器是兼容的.我认为我使用FTD2xx的方式缺少一些东西.没有错误发生(一切都是FT_OK)所以这表明DLL正在运行 - 特别是因为我可以使用FT_ListDevices和FT_GetDeviceInfo方法查询设备.
有任何想法吗?
加雷思
为了解决这个问题,我给制造商发了电子邮件 事实证明,该设备不是OpenDMX,实际上它是一个DMXProUSB协议非常相似,它基于FTDI芯片,这就是为什么代码部分工作,但它有一个微控制器.我将C++示例控制器文件转换为C#并使其全部正常工作.如果再次出现这种情况,我很乐意分享DMXProUSB生成的c#代码,但不支持.我已经将代码通过电子邮件发送到manfacturer(dmxking)并在github上发布了一个副本:https://github.com/agrath/Sniper.Lighting.Dmx
谢谢你的帮助