Member 10576807 Ответов: 1

Коммуникационная программа последовательного порта передачи данных на приемник DMX 512


Приемник DMX 512, мне нужно отправить данные в 512 линиях через последовательный порт связи .Проблема возникает, когда мне нужно отправить данные со скоростью 250000 БОД . Затем я использовал управления ЩПТ блок с состоянии быть использован и набор комм государства . и тогда я пишу файл, но должен ли я использовать comPort. Write (Serial comPort = new Serial Port) для отправки данных или WriteFile .Это моя следующая программа

У меня есть VB.Сетевая программа связи последовательного порта программа отправки данных на приемник 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



Заранее спасибо

[no name]

А ваш вопрос-что? Почему "они" использовали "MSCOMM1. OUTPUT для отправки данных"? Вероятно, потому, что тот, кто портировал это из VB6, был ленив и не использовал класс последовательного порта, доступный в .NET, как следовало бы.

0x01AA

Мне нужно / нужно согласиться. V5.

[no name]

Как и предполагал Уэс Адей, это был неприятный пример преобразования кода. Вы можете написать это с нуля в C# в нескольких строках. Лучшее из возможных учебных упражнений.

1 Ответов

Рейтинг:
1

webmaster442

сделайте что-нибудь вроде этого:

SerialPort mySerialPort = new SerialPort("COM1");

mySerialPort.BaudRate = 250000;
mySerialPort.Parity = Parity.None;
mySerialPort.StopBits = StopBits.Two;
mySerialPort.DataBits = 8;
mySerialPort.Handshake = Handshake.None;
mySerialPort.RtsEnable = true;
mySerialPort.Open();

//do transfer struff here

mySerialPort.Close();