Archiv verlassen und diese Seite im Standarddesign anzeigen : rs232 telegramm auswerten mit gepufferten Empfang
mat-sche
16.11.2012, 09:34
Guten Morgen,
ich empfange über UART folgendes Telegramm:
HEX 0D 0A 4F 4B 0D 0A
Ascii CR LF OK CR LF
dies wird auch in den entsprechenden Puffer geschrieben. Nur leider zerbreche ich mir seit geraumer Zeit wie ich das Ende dieser Übertragung erkennen kann. Da ja am Anfang und am Ende der Übertragung ein CR LF steht kann ich über Serial0CharMatch oder Serial0ByteReceived nicht genau darauf filtern. Auch ist der Inhalt der Message immer unterschiedlich lang.
Wie würdet Ihr daran gehen, um das Ende nach dem (siehe oben) OK zu ermiteln?
Grüße MAT
Lass doch das Char-Match auf &H0A prüfen, und schau dir dann an, ob es das erste oder das zweite CR_LF war.
Alternativ würde ich das Erkennen über den URXC Interrupt selber durchführen. Da bist du flexibler und vermeidest diese verborgene Funktionalität des Char-Matchens.
mat-sche
16.11.2012, 15:02
Hallo for_ro,
ok, in der Char-Match Sub könnte ich natürlich das &H0A prüfen..... warum eigentlich nicht! Werde ich gleich mal testen.
Noch eins,
ich sende ein Komando:
Print #1 , "ATE" (=> darauf antwortet das Modem mit:CR LF OK CR LF) :At_ok = 10
Call Gsm_ok(at_ok)
und schicke derzeit die Anzahl der zu empfangenen Zeichen an die Sub:
Sub Gsm_ok(byval Rxlen As Byte) in der ich überprüfen will, ob das Modem auf den Befehl richtig antwortet.
Nur wie kann ich nun den zu erwartenden Text (ascii => CR LF OK CR LF) nach At_ok in Bascom schreiben.
At_ok & rxlen sind als String deklariert.
Hallo Mat,
sorry, aber die Erklärung verstehe ich nicht. Kannst du das vielleicht noch mal anders beschreiben?
mat-sche
17.11.2012, 08:42
Moin for-ro,
mein Hauptproblem an der Sache ist, wie ich den String im Programm schreiben kann, der in ascii so aussieht: CR LF OK CR LF (CR LF OK CR LF=> diesen sendet mir mein GSM Modem nach erfolgreicher Bearbeitung eines Befehls).
Ist dies in Bascom so richtig: "{013}{010}Ok{013}{010} "?
Moin for-ro,
mein Hauptproblem an der Sache ist, wie ich den String im Programm schreiben kann, der in ascii so aussieht: CR LF OK CR LF (CR LF OK CR LF=> diesen sendet mir mein GSM Modem nach erfolgreicher Bearbeitung eines Befehls).
Ist dies in Bascom so richtig: "{013}{010}Ok{013}{010} "?
Wenn du das Leerzeichen am Ende noch weglässt ist das eine Möglichkeit, wie du diese Ausgabe in Bascom erreichen kannst.
mat-sche
17.11.2012, 12:04
Super, danke!
Ist dies in Bascom (http://www.rn-wissen.de/index.php/Bascom) so richtig: "{013}{010}Ok{013}{010} "?
warum nicht einfach so?
Print
Print "OK"
Gruß, Michael
mat-sche
17.11.2012, 18:01
Hallo Michael,
ich lese die gesendeten Daten vom Modem über HTerm ein und dort ist zu sehen, dass eben CR LF OK CR LF gesendet wird. Und das "OK" empfange ich doch. Und die Empfangenen Zeichen will ich in einer SUB überprüfen, ob das Modem richtig auf den Befehl antwortet.
- - - Aktualisiert - - -
Ich noch einmal :)
da es sich ja um ein GSM-Modem handelt, aus dem ich daten auslesen will, kann ich dieses auch anrufen bzw. ne sms schicken.So könnte ich über das Modem Befehle an meine Steuerung senden.
Ich nutze jetzt zum Einlesen der Modemstrings den Uart-Interrupt und schiebe darüber die Strings in einen Speicher. DA ich ja zu irgend einem Zeitpunkt das Modem anrufen kann, weiss ich noch nicht wie ich in dem Fall ein Klingeln entdecken kann.
Ich weiß das bei jedem eingehenden String die Interruptroutine angesprungen wird, nur hier habe ich da Problem das ich nicht weiß wenn der String bei einem Klingeln zu ende ist.
Ich habe mir gedacht einen Timer beim sprung in die Interrupt ISR zu starten und wenn dieser überläuft dann den Uart-Puffer auszulesen...
Wie würdet Ihr das machen?
Grüße MAT
- - - Aktualisiert - - -
Ich noch einmal :)
da es sich ja um ein GSM-Modem handelt, aus dem ich daten auslesen will, kann ich dieses auch anrufen bzw. ne sms schicken.So könnte ich über das Modem Befehle an meine Steuerung senden.
Ich nutze jetzt zum Einlesen der Modemstrings den Uart-Interrupt und schiebe darüber die Strings in einen Speicher. DA ich ja zu irgend einem Zeitpunkt das Modem anrufen kann, weiss ich noch nicht wie ich in dem Fall ein Klingeln entdecken kann.
Ich weiß das bei jedem eingehenden String die Interruptroutine angesprungen wird, nur hier habe ich da Problem das ich nicht weiß wenn der String bei einem Klingeln zu ende ist.
Ich habe mir gedacht einen Timer beim sprung in die Interrupt ISR zu starten und wenn dieser überläuft dann den Uart-Puffer auszulesen...
Wie würdet Ihr das machen?
Grüße MAT
Hallo mat-sche,
String im Programm schreiben
davon war ich etwas verwirrt, jetzt habe ich verstanden, daß du eigentlich was _lesen_ willst.
Wie würdet Ihr das machen?
im Uart-Interrupt die Zeichen in ein Array einlesen und den Zeiger inkrementieren.
Bei 0A schauen, wie weit der Zeiger ist, wenn 2, dann Zeiger löschen, wenn 4, dann auch, aber zusätzlich Array sichern und Flag für's Hauptprogramm setzen.
Gruß, Michael
mat-sche
18.11.2012, 11:12
Hallo Ihr's,
ich habe die Auswertung des Strings so gemacht:
If Instr(1 , Gsm_rx_str , "{013}{010}") > 0 Then
Call Gsm_auswertung
End If
Habsch in einem anderen Code gefunden, die Möglichkeit über "Instr" nach einer Zeichenkette zu suchen.
Dank an Euch allen!
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.