Forum: PC-Programmierung Umschaltung Baudrate zwichen aufeinanderfolgenden Bytes


von ArminD (Gast)


Lesenswert?

Hallo,

wie kann ich in VisualBasic Express 2008 bei einer Sendekommunikation 
über RS232 dafür sorgen, dass das erste Byte mit der Baudrate x und die 
nachfolgenden mit der Baudrate y übertragen werden, ich möchte also bei 
aufeinanderfolgenden Bytes direkt hintereinander die Baudrate ändern. 
Bei meinen bisherigen Versuchen vergehen mindestens 20ms bis 
umgeschaltet wird, manchmal gar nicht. Ich bekomme einfach kein halbwegs 
zeitlich definiertes Verhalten hin. Es geht um die Nachbildung eines 
LIN-Masters im PC zur Generierung des Sync-Breaks.

Hier mein Code:

Module Module1

    Public mySerialPort As New System.IO.Ports.SerialPort

    Public Sub CommPortSetup()
        With mySerialPort
            .PortName = "COM1"
            .BaudRate = 6600
            .DataBits = 8
            .Parity = IO.Ports.Parity.None
            .StopBits = 1
            .Handshake = 0
        End With
    End Sub

    Public Sub WriteSerialPort()

        Dim DataOut(9) As Byte

        mySerialPort.Open()

        DataOut(0) = &H0
        DataOut(1) = &H6
        DataOut(2) = &HF4
        DataOut(3) = &H1
        DataOut(4) = &HFF
        DataOut(5) = &HFF
        DataOut(6) = &HFF
        DataOut(7) = &HFF
        DataOut(8) = &HFF


        With mySerialPort
            .DiscardOutBuffer()
            .BaudRate = 6600
            .Write(DataOut, 0, 1)
            .DiscardOutBuffer()
            .BaudRate = 9600
            .Write(DataOut, 1, 8)
            .DiscardOutBuffer()
            .Close()
        End With

    End Sub
End Module


Mir ist klar dass ein PC kein Mikrocontroller ist mit dem man exakte 
Zeitbedingungen schaffen kann. Aber bei diesen relativ langen Zeiten 
müsste das doch gehen. Mit Timern habe ich auch schon experimentiert, 
jedoch erfolglos. Danke für Tipps!

Gruss,
Armin

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Es könnte Dir helfen, wenn Du die Granularität des Schedulers 
verfeinerst. Das geht mit der eigentlich für Multimedia-Anwendungen 
gedachten Win32-API-Funktion timeBeginPeriod 
(http://msdn.microsoft.com/en-us/library/ms713413%28v=vs.85%29.aspx), 
der Du als minimalen Wert 1 für 1 Millisekunde übergeben kannst.

Desweiteren ist wichtig, daß Du bei der Schnittstelle den Sende-FIFO 
komplett deaktivierst, und daß Du eine "echte" Schnittstelle, also keine 
USB-Seriell-Bridge verwendest.

Bei den Onboard-Schnittstellen (8250/16550 etc.) ist es im übrigen nicht 
möglich, eine Baudrate von 6600 Baud zu erzeugen; die Baudrate wird 
durch ganzzahliges Teilen aus der höchstmöglichen Baudrate (115200) 
erzeugt.

115200 / 17 = 6776
115200 / 18 = 6400

Der Devicetreiber, der die Onboard-Schnittstelle ansteuert, wählt den 
nächsten passenden Wert aus, wenn ihm ein Baudratenwert übergeben wird.

Wie Du schon selbst erkannt hast, ist das Zeitverhalten von Windows 
generell ziemlich ungeeignet, um Dein Ziel zu erreichen, mit den von 
mir beschriebenen Hinweisen kannst Du es allenfalls etwas verbessern.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.