DMX 512接收器,我需要通过串口通信发送512行数据。当我需要以波特率250000发送数据时出现问题。然后我使用具有Getcomm状态和Set Comm状态的DCB Control块。然后我写writefile但我应该使用comPort.Write(串口comPort =新的串口)发送数据或WriteFile。这是我的下面的程序
我有一个VB.Net程序的串口通信程序,将数据发送到DMX 512接收器,我需要转换成c#。但我很困惑,因为他们使用MSCOMM1.OUTPUT发送数据。
非常感谢您的帮助
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Public data_array
Private Sub cmd_Start_Click()
setup_com_port
send_comm_data
End Sub
Private Sub cmd_Stop_Click()
If MSComm1.PortOpen = True Then
''MSComm1.PortOpen = False
End
End If
End Sub
Private Sub Form_Load()
data_array = Array(&H7, &H20, &H7)
Slider_Red = &H7
Slider_Green = &H20
Slider_Blue = &H7
End Sub
Private Sub setup_com_port()
MSComm1.CommPort = 2
MSComm1.Settings = "9600,N,8,2"
'MSComm1.InputLen = 0
' MSComm1.InBufferSize = 1024
' MSComm1.OutBufferSize = 1024
MSComm1.PortOpen = True
SetBaudRate MSComm1, 250000
End Sub
' Set baud rate using Win32 API.
' The PortOpen property should be set to True before calling.
' May raise the following errors:
' comPortNotOpen the PortOpen property has not been set to True
' comDCBError failed to read current state of the port
' comSetCommStateFailed failed to set new baud rate
Sub SetBaudRate(Com As MSComm, baud As Long)
Dim ComDcb As dcb
Dim ret As Long
' Check port is open
If Not Com.PortOpen Then
Err.Raise comPortNotOpen, Com.Name, _
"Operation valid only when the port is open"
Exit Sub
End If
' Get existing Comm state
ret = GetCommState(Com.CommID, ComDcb)
If ret = 0 Then
Err.Raise comDCBError, Com.Name, _
"Could not read current state of the port"
Exit Sub
End If
' Modify state with new baud rate
ComDcb.BaudRate = baud
' Set the new Comm state
ret = SetCommState(Com.CommID, ComDcb)
If ret = 0 Then
Err.Raise comSetCommStateFailed, Com.Name, _
"Could not set port to specified baud rate"
Exit Sub
End If
End Sub
Private Sub send_comm_data()
'com_break (10)
Do
com_break (5)
'DoEvents
Sleep (5)
MSComm1.Output = Chr$(0)
'DoEvents
'Sleep (1)
send_char_0
Sleep (10)
DoEvents
Loop
End Sub
Private Sub com_break(break_in_ms)
' Set the Break condition.
MSComm1.Break = True
' Set duration to 1/10 second - 100ms
'Duration! = Timer + (break_in_ms / 100) '0.1 = 100ms
' Wait for the duration to pass.
'Do Until Timer > Duration!
'' Dummy = DoEvents()
'Loop
' Clear the Break condition.
Sleep (1)
MSComm1.Break = False
End Sub
Private Sub send_char_0()
Dim strData As String
strData = ""
For i = 0 To UBound(data_array)
'' MSComm1.Output = Chr$(data_array(i))
strData = strData & Chr$(data_array(i))
Next
For i = 1 To 509
''MSComm1.Output = Chr$(50)
strData = strData & Chr$(50)
Next
MSComm1.Output = strData
7 DoEvents
End Sub
提前致谢
答案 0 :(得分:1)
我想我已经明白了,因为我现在已经黑了一段时间了。我发现了一种正确发送数据的好方法。请记住,并非所有设备都能够以250kbps的速率发送数据,因此这可能是您的问题之一。找到要使用的基于FTDI的那些。
对于我的方法,我们需要以两种速度发送数据,这是因为复位字节必须为零,与其他字节相比时间相对较长。所以你将不断改变波特率。
首先,配置您的设备:
var serialPort = new SerialPort("COM0");
serialPort.DataBits = 8;
serialPort.Handshake = Handshake.None;
serialPort.Parity = Parity.None;
serialPort.StopBits = StopBits.Two;
在这里,我正在启动我的串行端口实例以及你已完成的所有配置。不要忘记更改COM端口以满足您的需求。
现在假设您有两个字节数组,一个用于“大零”,另一个用于实际信息:
byte[] zero = new byte[] { 0x00 };
byte[] buffer = new byte[513];
你会问“为什么缓冲区有513个字节?”,对吧?只是因为第一个字节是零,表示将发送实际数据。 (从1到513,所以有512个频道)
最后是主循环:(我显然建议您在单独的线程中执行此操作)
while (true)
{
serialPort.BaudRate = 96000;
serialPort.Write(zero, 0, zero.Length);
serialPort.BaudRate = 250000;
serialPort.Write(buffer, 0, buffer.Length);
Thread.Sleep(50);
}
现在我需要你的帮助来测试它。我不相信它会在没有损坏IC的情况下长时间完美地工作,但我试了两个小时并没有发生任何有害的事情。你能测试一下吗并给我一个反馈意见吗?我非常感激。有没有人有另一种方法而不需要改变波特率?