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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.