首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >向DMX512接收机发送数据的串口通信程序

向DMX512接收机发送数据的串口通信程序
EN

Stack Overflow用户
提问于 2015-08-07 01:19:58
回答 1查看 2.1K关注 0票数 1

DMX512接收器,我需要通过串口通信发送512条线路的数据,当我需要以250000的波特率发送数据时,出现.The问题。然后我使用带有Getcomm状态和Set Comm状态的DCB控制块。然后我写文件,但是我应该使用comPort.Write (串行comPort =新的串行端口)来发送数据还是使用writefile .This是我下面的程序

我有一个VB.Net程序的串口通信程序发送数据到DMX512接收器,我需要转换成c#。但是我很困惑,因为他们使用MSCOMM1.OUTPUT来发送数据。

非常感谢您的帮助

代码语言:javascript
运行
复制
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

提前感谢

EN

回答 1

Stack Overflow用户

发布于 2015-09-29 11:39:54

我想我明白你的意思了,因为我已经研究了一段时间了。我找到了一种正确发送数据的好方法。请记住,并不是所有的设备都能够以250kbps的速度发送数据,因此这可能是您的问题之一。找到要使用的基于FTDI的工具。

对于我的方法,我们需要以两种速度发送数据,这是因为重置字节必须是零,与其他字节相比,重置字节的时间相对较长。所以你会经常改变波特率。

首先,配置您的设备:

代码语言:javascript
运行
复制
var serialPort = new SerialPort("COM0");
serialPort.DataBits = 8;
serialPort.Handshake = Handshake.None;
serialPort.Parity = Parity.None;
serialPort.StopBits = StopBits.Two;

在这里,我使用您所做的所有配置启动了我的串行端口实例。不要忘记更改COM端口以满足您的需要。

现在假设您有两个字节数组,一个用于“大零”,另一个用于实际信息:

代码语言:javascript
运行
复制
byte[] zero = new byte[] { 0x00 };
byte[] buffer = new byte[513];

你会问“为什么513字节的缓冲区?”,对吧?很简单,因为第一个字节是一个零,它告诉我们实际的数据将被发送。(从1到513,因此有512个通道)

最后是主循环:(我显然建议你在一个单独的线程中做这件事)

代码语言:javascript
运行
复制
while (true)
{
    serialPort.BaudRate = 96000;
    serialPort.Write(zero, 0, zero.Length);
    serialPort.BaudRate = 250000;
    serialPort.Write(buffer, 0, buffer.Length);
    Thread.Sleep(50);
}

现在我需要你的帮助来测试它。我不确定它是否能在不损坏IC的情况下完美地工作更长时间,但我试了两个小时,没有发生任何有害的事情。你可以测试更长时间,然后给我一个反馈吗?我将不胜感激。有没有人有不需要改变波特率的其他方法?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31861992

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档