Hallo,
bin mir nicht ganz sicher, aber ich habe doch die starke Vermutung, dass dir das "At xxx Overlay" da dazwischenfunkt. Probier doch mal aus, dieses zu löschen (falls dies das Programm zulässt).
Gruß
Chris
Na nen juten Abend!
ich hab da mal ein Problem:
Ich empfange über einen UART einen String den ich per:
angegeben habe. Nun empfange ich einmal 6 Zeichen, die mir richtig angezeigt werdenCode:Config Serialin1 = Buffered , Size = 100 , Bytematch = All Dim Gsm_rx_str As String * 100 At _rs232inbuf1 Overlay
mit z.Bsp.: <\r><\n>OK<\r><\n>Code:Sub Gsm_ok(byval Rxlen As Byte) Do If _rs_bufcountr1 >= Rxlen Then Print "Gsm_rx_str " ; Gsm_rx_str Gsm_rx_str = "" Clear Serialin1 Exit Do End If Loop End Sub
Danach empfange ich 22 Zeichen die wiederum richtig angezeigt werden.
Aber jetzt.... danach empfange ich wieder 6 zeichen aber es werden dann im Anschluss noch die Zeichen aus der vorhergehenden Sendung mit ausgegeben. Die soll so nicht sein, ich dachte mit : Gsm_rx_str = "" sollte der String gelöscht werden. Aber das macht es nicht.
Nun... wie kann ich meinen dev. String den Inhalt löschen, ihn auf 0 setzen?
Würde mich für Hilfe sehr freuen !
Grüße MAT
Hallo,
bin mir nicht ganz sicher, aber ich habe doch die starke Vermutung, dass dir das "At xxx Overlay" da dazwischenfunkt. Probier doch mal aus, dieses zu löschen (falls dies das Programm zulässt).
Gruß
Chris
Hi Chris,
jetzt macht es bei mir klick! Du hast natürlich recht! Ich werde das gleich mal testen...
Dein Problem liegt mehr darin, dass im Byte_array _RS232INBUF1 kein String mit einem Stringendezeichen (0-Byte) abgelegt wird, sondern nur einzelne Bytes. Dein
Print Gsm_rx_str
wird aber so viele Zeichen ausgeben, bis irgendwann ein Stringende gefunden wird.
Wenn du nun mit
Gsm_rx_str = ""
das erste Zeichen auf Stringende setzt und dann wieder neue Zeichen einliest, stehen dahinter immer noch die alten Zeichen. Also wird dein Print die auch wieder ausgeben. Da hilft auch das
Clear Serialin1
nicht, da es auch nur das erste Byte von _RS232INBUF1 und den Zeichen Counter _RS_BUFCOUNTR1 auf 0 setzt.
Du musst also selber das Stringende Zeichen setzen. Das geht einfach so:
_RS232INBUF1(_RS_BUFCOUNTR1 + 1) = 0
_RS232INBUF1(_RS_BUFCOUNTR1) zeigt auf das letzte gelesene Zeichen, _RS232INBUF1(_RS_BUFCOUNTR1 + 1) also auf das danach. Vorsichtig musst du noch sein, wenn tatsächlich mal 100 Zeichen eingelesen werden, dass du dann nicht das 101. mit einer 0 beschreibst.
Geändert von for_ro (15.05.2011 um 11:27 Uhr)
Nen guten,
@ for_ro:
vielen Dank für Deine ausgiebige Antwort! So wie Du das beschrieben hast, wurde es mir über die Zeit dann auch klar und von Dir bestätigt!
Ich überlege mir gerade, ob es nicht besser wäre, wenn ich nach der Auswertung des Buffers nicht den ganzen Buffer mit einer 0 überschreibe, abhängig von der Anzahl empfangener Zeichen:
rs232_dummy = Memcopy(mem_dummy , _RS232INBUF1 , _RS_BUFCOUNTR1 , 2)
was das aber an Rechenzeit bedarf weiß ich nicht....
Sooo....
Ich habe jetzt die obrige Form zur Löschung des _RS232INBUF1 genutzt. Da es ja einen Bytezähler für die eintreffen Byte gibt, kann dieser schön zum genauen Löschen des Empfangspuffer genutzt werden:
rs232_dummy = eine Bytevariable zur Zwischenspeicherung, die nicht weiter genutzt wird
mem_dummy = eine Bytevariable die ich missbrauche, in der steht nur eine Null drin, da ja der Buffer gelöscht werden soll
_RS232INBUF1 = hier wird jetzt die Null rein geschrieben, da es aber ein Bytearray ist muss dies für jede Stelle erhöht werden => dies besagt die 2 am Ende
_RS_BUFCOUNTR1 = der Counter sagt an wie oft _RS232INBUF1 mit einer Null beschrieben werden soll.
Zur Funktion von Memcopy nochmals die Hilfe lesen, dort steht alles drin
Hallo mat-sche,
ich halte das Löschen des gesamten Bereichs zwar für überflüssig, aber wenn es jetzt funktioniert, ist es ja gut.
Sieht ein wenig nach Holzhammermethode aus. Dir geht dadurch der ganze Vorteil des Overlays verloren.
@for_ro
"Dir geht dadurch der ganze Vorteil des Overlays verloren."
Na eigentlich nicht!?! Ich lege ja mir einen String über den Bytebuffer weil ich dann damit weiter als String arbeiten kann und ich nicht extra eine for/next Schleife bauen müsste, um die Daten aus dem Buffer in den String zu bekommen. Und ich benötige nur für den Zeitraum bis zum neuen Empfang neuer Daten die Daten aus dem Bytebuffer...
Oder sehe ich da was falsch?
Nun ja, es ist die Hammermethode, aber so bin ich mir sicher, dass alle Zeichen im _RS232INBUF1 auf 0 liegen. Es koste Zeit die Bytes zu löschen.... ich werde nochmal darüber nachdenken
Aber Dank dennoch an alle und noch einen schönen Sonntag!
Grüße MAT
Wenn du dir sicher sein kannst, dass während der String-Verarbeitung kein neues Zeichen eintrifft, wird das so schon funktionieren.
Allerdings dauert ein memcopy länger als ein einfaches str1=str2, keine Ahnung warum. Zumindestens im Sim ist das so.
Wie häufig kommen denn die Übertragungen und sind sie in regelmäßigen Abständen? Welche Baudrate benutzt du dabei?
Lesezeichen