PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Compiler-Problem? Ab v1.11.7.7



amozi
21.10.2009, 00:12
Hallo Kollegen,

ich benötige wiedermal euer Rat um einen Fehler zu beheben.
Es geht um einen Code-Abschnitt. Dieser liefert eine einwandfreie Funktionsweise, wenn er mit der V1.11.7.7 compiliert wird. Sobald ich aber höhere Versionen als 1.11.8.8 anwende(Zwischenversionen nicht bekannt), kann ich das selbe Ergebnis nicht erzielen(näheres im Codeabschnitt beschrieben). Ich muss die höheren Versionen einsetzen, da ich Projekte auch mit m1280 habe.




Call Get_line(27 , 7 , Bok) 'Funktionsaufruf

Sub Get_line(byval Bstart As Byte , Byval Wlaenge As Word , Timeout As Byte)
Dim Fi As Byte , Counttime As Word 'temporäre Variable
Dim Wanzahl As Word 'Zeichen-Zähler
Dim Zeichen As Byte , Bwaittime As Byte 'Zwischenspeicher
Dim Oldtime As Long , Newtime As Long 'Variablen für die Zeit

Zeichen = 0 ' bei Null Startzeichen überspringen
Wanzahl = 0 ' Zeichenzähler
Tmpbuffer = "" 'Zeichenpuffer löschen
Bwaittime = 3
Counttime = 0
Timeout = 0
Test = 0

' Zuerst wartet die Routine auf das Auftreten eines des Startzeichens
' wenn es auf 0 gesetzt ist, wird es übersprungen

' Problemschleife
While Zeichen <> Bstart ' Noch nicht erkannt bzw. überspringen

Fi = Ischarwaiting()
If Fi <> 0 Then ' Eingangpuffer nicht leer
Zeichen = Inkey() ' holt ein Zeichen

'Ergebnis der Printausgabe
'Obwohl der erwartende Wert 27 übern Uart empfangen wird, springt
'er aus der While-Schleife nicht raus
'Erst mit einem Timeout

Else

If Counttime > 10 Then
Timeout = 0
Exit Sub
Else
Waitms 50
Counttime = Counttime + 1
End If
End If
Waitms 3
Wend
Counttime = 0

' Das Startzeichen wurde erkannt bzw. ignoriert
' weiter geht es
While Wlaenge <> Wanzahl ' Solange sammeln bis Ende gekommen ist

Fi = Ischarwaiting()
If Fi <> 0 Then ' Eingangpuffer nicht leer
Zeichen = Inkey() ' holt ein Zeichen
Wanzahl = Wanzahl + 1 ' Zeichenzähler erhöhen
Tmpbuffer = Tmpbuffer + Chr(zeichen) ' Zeichen in Buffer$ übertragen
Counttime = 0
Else

If Counttime > 5 Then
Timeout = 0 ' als Fehlermeldung eine 0
Exit Sub ' und zurück
Else
Waitms 50
Counttime = Counttime + 1
End If
End If
Waitms 3
Wend ' Endekennung
Timeout = 1 ' alles ausser 0 ist OK
Test = 1
' End If

End Sub 'SUB Get_Line


Das Problem scheint mir wie ein Optimierungsfehler des Compilers auszusehen oder auch ein generelles Problem.
Andere Schleifenarten wie Do() oder höheres Timeout haben auch nichts gebracht.

Würde mich um eine Analyse eurerseits freuen:-)

stefan_Z
21.10.2009, 01:37
Da hilft nur Breaks einbauen und debuggen/eingrenzen...
Ich mach das immer mit Terminal-Ausgaben an neuralgischen Stellen. Irgendwann kommt man drauf wo es hakt und kanns eingrenzen.
Z.B. wenn eine bestimmte Schleife nie aktiv wird usw.

amozi
21.10.2009, 10:41
Ich habe ja dieses Problem mit Terminal-Ausgabe analysiert, was ich im Codeabschnitt beschrieben und die Stelle kommentiert habe. Ich bekomm den zu erwartenden Wert 27, aber trotzdem wird die While-Schleife nicht beendet.
Gibt es andere Vorschläge? Oder gibt es für Bascom einen OnBoard-Debugger in Bascom-Sprache?

amozi
22.10.2009, 14:10
Hallo Leute,

kriege ich keine weiteren Vorschläge. Ich bin am Verzweifeln

peterfido
22.10.2009, 17:52
Hast Du im Compiler die Optimierung mal abgeschaltet? Wie hoch sind Deine Stacks eingestellt? Was steht im Bericht? (STRG+W), Wie groß ist Dein Eingansbuffer? Was sagt die neueste Version dazu?