Seite 2 von 2
Re: Daten von einen Motorsteuergerät empfangen (Serial Port)
Verfasst: 06.03.2016 22:50
von PureLust
HHYayo hat geschrieben:Reicht die Baudrate von 38400 nicht aus, oder kommt das Steuergerät einfach nicht hinterher bei so vielen Anfragen alle 200ms ?
Wie HeXOR schon geschrieben hat, kann es auch an Deinem Code liegen.
Vielleicht postest Du hier mal Deine I/O-Routine.
Abgesehen davon, verschluckst Du natürlich viele Werte, wenn Du immer nur den letzten auswertest.
Statt immer nur den letzten, versuch doch mal alle auszuwerten, die Du im Puffer hast:
Code: Alles auswählen
; ----- Test-Text erzeugen ...
Text$ = "010D"+#CR$+"41 01 00 00"+#CR$+#CR$+">"
Text$ + "010D"+#CR$+"41 01 00 01"+#CR$+#CR$+">"
Text$ + "010D"+#CR$+"41 01 00 02"+#CR$+#CR$+">"
Text$ + "010D"+#CR$+"41 01 00 03"+#CR$+#CR$+">"
; ----- Letzten Eintrag aus aktuellem Text heraus filtern
If Right(Text$,1) = ">" : Text$ = Left(Text$, Len(Text$)-1) : EndIf
For n = 0 To CountString(Text$, ">")
LastText$ = StringField(">"+Text$, n+2, ">")
Debug LastText$
Next n
Re: Daten von einen Motorsteuergerät empfangen (Serial Port)
Verfasst: 07.03.2016 16:33
von HHYayo
PureLust hat geschrieben:HHYayo hat geschrieben:Reicht die Baudrate von 38400 nicht aus, oder kommt das Steuergerät einfach nicht hinterher bei so vielen Anfragen alle 200ms ?
Wie HeXOR schon geschrieben hat, kann es auch an Deinem Code liegen.
Vielleicht postest Du hier mal Deine I/O-Routine.
Abgesehen davon, verschluckst Du natürlich viele Werte, wenn Du immer nur den letzten auswertest.
Statt immer nur den letzten, versuch doch mal alle auszuwerten, die Du im Puffer hast:
Code: Alles auswählen
; ----- Test-Text erzeugen ...
Text$ = "010D"+#CR$+"41 01 00 00"+#CR$+#CR$+">"
Text$ + "010D"+#CR$+"41 01 00 01"+#CR$+#CR$+">"
Text$ + "010D"+#CR$+"41 01 00 02"+#CR$+#CR$+">"
Text$ + "010D"+#CR$+"41 01 00 03"+#CR$+#CR$+">"
; ----- Letzten Eintrag aus aktuellem Text heraus filtern
If Right(Text$,1) = ">" : Text$ = Left(Text$, Len(Text$)-1) : EndIf
For n = 0 To CountString(Text$, ">")
LastText$ = StringField(">"+Text$, n+2, ">")
Debug LastText$
Next n
Also ich habe derzeitig auf zwei verschiedene Arten die Werte ausgelesen. Einmal über den Code von HeX0R, wie er bereits in meinem anderen Thread gepostet wurde, in dem ich die Werte vorab in einem Buffer von Windows speicher und denn über einen Window Timer immer wieder die Daten sende und empfange um sicherzugehen das auch wirklich alle 200ms gesendet/empfangen wird, oder einfach nur ganz simpel gehalten über eine Schleife in der ein Delay von 200ms liegt nachdem ich mit WriteSerialPortString Daten gesendet habe. Großartig etwas an Code zu zeigen gibt es also nicht, so eine Schleife kann man ja kaum falsch machen ?
Wenn ich den den Simulator mit den Code auslesen, kann ich die Zeit auch auf 1ms stellen und ich erhalte kontinuierlich die Werte die ich haben möchte, auch richtig angezeigt. Daher gehe ich eigentlich davon aus das es daran liegt das die Werte vom Steuergerät anfangen durcheinander zu kommen wenn die Zeit zu gering ist.
Ansonsten würde meine Procedur einfach so aussehen:
Code: Alles auswählen
Procedure _SetTimer_Callback(Hwnd,Msg, iIDTimer, dwTime)
WriteSerialPortString(0,"010D"+#CRLF$)
Delay(200) ; 200ms
While AvailableSerialPortInput(0)>0
If ReadSerialPortData(0,@Byte,1)
Text$=text$+Chr(Byte)
EndIf
Wend
If Right(Text$,1) = ">" : Text$ = Left(Text$, Len(Text$)-1) : EndIf
LastText$ = StringField(">"+Text$, CountString(Text$, ">")+2, ">")
LastText$+#CR$
Debug Val("$"+Right(LastText$,5))
EndProcedure