Hallo,
ich habe ein etwas seltsames Problem, dem ich nicht auf die Sprünge
komme.
Am µC ist ein GPS Modul angeschlossen (UART1). An UART2 ist das USB
Modul STI100 angeschlossen. Dort sollen die empfangenen Daten
gespeichert werden.
Es klappt auch weitgehend, jedoch tritt zwischendurch ein Fehler auf.
Und zwar wird der String, anscheinend nicht komplett zum STI100
übertragen.
Hier sieht man das Problem (Auszug der log-Datei auf dem Stick):
Der entscheidende Teil ist in der mitte. Das sind eigentlich die
Steuerbefehle für den STI100, die auf dem USB Stick landen. Dies hängt
damit zusammen, dass der String vorher plötzlich aufhört (es fehlen
einige Zeichen im $GPRMC Teil und der gesamte $GPGGA Teil). Da aber vor
dem Speichern des Strings die Länge angegeben wird, erwartet das STI
noch weitere Daten, die geispeichert werden sollen.
Das Fehlerbild deutet eigentlich drauf hin, dass der String nach dem
Berechnen der Länge irgendwie gekürzt wird.
Hier ist das Quellprogramm:
Sub Buildgpsstring(mc As String , Ga As String) As String
120
Buildgpsstring = Mc + "^^"
121
Buildgpsstring = Buildgpsstring + Ga
122
Buildgpsstring = Gps_string + "#^"
123
End Sub
124
125
126
' write given data to the usb device
127
Sub Writeusb(mydata As String)
128
129
Length = Len(mydata)
130
131
Writestring = "WRF " + Str(length)
132
133
Print #2 , Chr(&H0d);
134
135
Print #2 , "OPW myFile.txt";
136
Print #2 , Chr(&H0d);
137
138
Print #2 , Writestring;
139
Print #2 , Chr(&H0d);
140
141
Print #2 , Mydata;
142
143
Print #2 , "CLF myFile.txt";
144
Print #2 , Chr(&H0d);
145
End Sub
Hat vielleicht jemand eine Idee? Wird da durch einen Interrupt was
überschrieben? Oder liegt es an dem 16Mhz Quarz, bei dem es keine 100%
Fehlerfreiheit bei der UART Übertragung gibt? Allerdings wird bei 9600
baud die Fehlerrate mit ca 0.2 % angegeben - und dafür tritt dieser
Fehler einfach zu oft auf.
Hilfe!
Checke also diese Stelle:
' create the cps writestring
Sub Buildgpsstring(mc As String , Ga As String) As String
Buildgpsstring = Mc + "^^"
Buildgpsstring = Buildgpsstring + Ga
Buildgpsstring = Gps_string + "#^" ' <===============
End Sub
Stefan:
Aaargh stimmt! Danke!
Holger:
Es wird mit max 5 Hz geschrieben. Jeweils etwa 150 Zeichen. Reicht die
Baudrate nicht aus?
Ich leere erstmal den gps_string und teste es nochmal!
Edit:
Jap die Stelle ist mir gerade aufgefallen, das ist nicht richtig. Statt
gps_string sollte da buildstring stehen.
Ich teste nochmal!
Also du willst der Frage nachzugehen, warum der Fehler keinen weiteren
Fehler (wobei zu definieren wäre, wie der zur Laufzeit aussieht) auslöst
;-) Ich würde den ersten Fehler beheben und gut ist's.
Wenn es einmal auftritt, dann kommt es regelmäßig nach etwa 33
Einträgen. Also schaut eigentlich nach einer Art Überlauf o.ä. aus ?!
Noch eine Idee:
' create the cps writestring
Sub Buildgpsstring(mc As String , Ga As String) As String
Buildstring = "" ' <===============
Buildgpsstring = Mc + "^^"
Buildgpsstring = Buildgpsstring + Ga
Buildgpsstring = Gps_string + "#^"
End Sub
Wobei eigentlich wird buildstring ja zurückgesetzt.
Buildstring ist eine andere Variable als Buildgpsstring ist eine
andere Variable als Gps_string
Überlauf kann hinkommen. Du hast gut 1,3 KB globale Variablen und
übergibst fette Strings auf dem Stack.
Globale Variablennamen und lokale Variablen mit gleichem Namen sind auch
unschön. Soweit ich sehe könntest du auf etliche lokale Variablen
verzichten.
BTW. Wenn du schreibst "Aber ein String kann max 255 bytes lang sein.",
wie vereinbart sich das mit diesen Zeilen:
Dim Gps_string As String * 300
Dim Filter As String * 400
Dim Writestring As String * 300
Auch wieder richtig, habe die mal alle auf 254 gekürzt.
Ich habe jetzt diverse Vars lokal deklariert.
Um auszuschließen, dass es tatsächlich an der
Übertragungsgeschwindigkeit liegt, müsste ich zur Laufzeit die
Geschwindigkeit von UART1 ändern. Ist das in Bascom möglich? Das STI ist
nach einem Reset wieder bei 9600 baud.
Gibt es noch ggf weitere Fehlerquellen?
Ich habe mir übrigens die TX Leitung vom µC angeguckt - dort werden die
Daten anscheinend komplett gesendet, das würde auch dafür sprechen, dass
das STI mit dem Schreiben nicht nachkommt. Evtl habe ich aber auch was
übersehen, da wird ja ziemlich viel geschrieben.
Der Code sieht nun so aus: