Wie du richtig erkannt hast empfange ich hier speziell immer dieselbe Paket-Größe. Im späteren Verlauf könnte es sein, dass ich Pakete in unterschiedlicher Größe empfangen und verarbeiten muss, welche jedoch nach dem gleichen Prinzip aufgebaut sind und sich lediglich wie auch in diesen Fall am Ende vom Aufbau und der Länge variabel sind. Von daher denke ich ist dein Example früher oder später einmal bedeutend für mich, danke!HeX0R hat geschrieben:Es scheint doch aber so zu sein, dass das Paket, dass Du bekommst immer gleich lang ist, richtig?
Dann lässt sich das Ganze doch aber wirklich recht einfach umsetzen.
Je nachdem, ob da jetzt als Zeilenvorschub nur ein oder zwei Zeichen kommen, ist Dein Rückgabepaket immer 16 oder 19 Zeichen lang (ich denke mal die eckige Klammer gehört noch dazu).
Also musst Du einfach warten, bis Dir AvailableSerialPortInput(0) 16 oder 19 zurückgibt, dann liest Du alles in einem Rutsch in einen Memorypuffer und holst Dir die Bytes Nr. 12 + 13 bzw. 14 + 15.
Oder aber, falls die Pakete variabel in der Länge sind, ist evtl. die eckige Klammer das Abschlusszeichen, dann solange den Puffer füllen, bis die am Ende da steht.
[Edit]
Hier mal ein simples Beispiel (ungetestet)Musst nur aufpassen, dass bei Fehlfunktion der Puffer nicht überläuft.Code: Alles auswählen
Enumeration #SEND_TIMER #RECEIVE_TIMER EndEnumeration Procedure main() Protected *Buffer, BufferPos, AvailableBytes, Value If OpenSerialPort(0, "COM5", 9600, #PB_SerialPort_EvenParity , 8, 1, #PB_SerialPort_NoHandshake, 1024, 1024) = 0 MessageRequester("Error", "Can't open RS232!") ProcedureReturn EndIf *Buffer = AllocateMemory(8192) If *Buffer = 0 MessageRequester("Error", "No memory available!") ProcedureReturn EndIf ;create a stupid window OpenWindow(0, 0, 0, 215, 80, "RS232", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) TextGadget(0, 5, 15, 100, 24, "Value:") StringGadget(1, 110, 15, 100, 24, "", #PB_String_ReadOnly) CreateStatusBar(0, WindowID(0)) AddStatusBarField(#PB_Ignore) ;send any 200ms AddWindowTimer(0, #SEND_TIMER, 200) ;receive any 5ms AddWindowTimer(0, #RECEIVE_TIMER, 5) Repeat Select WaitWindowEvent() Case #PB_Event_CloseWindow Break Case #PB_Event_Timer Select EventTimer() Case #SEND_TIMER If WriteSerialPortString(0, "010D" + #CRLF$, #PB_Ascii) = 0 MessageRequester("Error", "SendString Error!") Break EndIf Case #RECEIVE_TIMER AvailableBytes = AvailableSerialPortInput(0) If AvailableBytes > 0 ReadSerialPortData(0, *Buffer + BufferPos, AvailableBytes) BufferPos + AvailableBytes StatusBarText(0, 0, "Received: " + Str(BufferPos) + "Bytes") ;check for '>' If PeekB(*Buffer + BufferPos - 1) = 62 ;end of packet If BufferPos = 16 ;one linefeed char Value = Val("$" + PeekS(*Buffer + 12, 2, #PB_Ascii)) Else ;two linefeed chars Value = Val("$" + PeekS(*Buffer + 14, 2, #PB_Ascii)) EndIf SetGadgetText(1, Str(Value)) BufferPos = 0 EndIf EndIf EndSelect EndSelect ForEver CloseSerialPort(0) EndProcedure main()
Ich mache da üblicherweise eine dynamische Anpassung, war ich jetzt aber zu faul
Ich würde gerne mal noch eine Frage bezüglich der Kompatibilität der früheren und neueren Versionen von Purebasic stellen.
Mit einer älteren Version habe ich über den API's SetWindowLongPtr_ und SetLayeredWindowAttributes_ eine Procedur geschrieben, mit der ich ein Fenster randlos und ohne "Design" nach und nach von einen Transparenzwert 0-255 "aufgehen" lasse, in dem sich ein ImageGadget befindet (Welches ebenfalls langsam eingeblendet wurde). Seit der aktuellen Version funktioniert es jedoch nicht mehr, da sich lediglich das Fenster langsam einblendet, jedoch nur komplett schwarz und ohne den Image. Kommt Purebasic nicht mehr mit den genannten API's klar ? War eine hübsche Spielerei die ich gerne wieder verwenden würde

Mit freundlichen Grüßen
HHYayo