Hallo
ich habe einen Energiezähler der über einen Optokoppler folgende serielle Daten sendet:
8Datenbits / 1Startbit /1 Stopbit / 1920 Baud
Zählerstand Leistung Spannung Strom CRC
T123456,7<Space>P1234,5<Space>U123<Space>I12,34<Space>C1<CR>
Dabei stehen T, P, U, I, C und , für die ASCII Werte.
<Space> steht für das Leerzeichen = ASCII 0x20
<CR> steht für den Wagenrücklauf (Carriage Return) = ASCII 0x0D
12… für die Messwerte mit führenden Nullen
Eine Anzeige wäre zum Beispiel:
T000018,6 P0115,0 U230 I00,50 Cx<CR>
Dies bedeutet:
Total 18,6 kWh
Leistung 115 Watt
Spannung 230 Volt
Strom 0,5 Ampere
CRC 120 (Ascii Wert von ‚x’)
Das CRC ist eine Addition aller gesendeten ASCII-Zeichen bis und mit dem <SPACE> nach dem Strom Teil und kann einen Wert zwischen 0-255 haben.
Im CRC enthaltene Daten:
Zählerstand Leistung Spannung Strom
T123456,7<Space>P1234,5<Space>U123<Space>I12,34<Space>
Ich bekomme auch die Daten. Ich kann Sie aber nicht filtern.
Entweder nur Zahlen oder nur Zeichen.
Ich würde die Zeichen T,P,U..... lesen und die Zahl dann im Display anzeigen.
Vielen Dank und Grüße
Im Anhang meine Versuche.
RS232 Software UART String lesen
Moderator: Benj
RS232 Software UART String lesen
- Attachments
-
- 5. String Receivetest.fcf
- (6.5 KiB) Downloaded 256 times
-
- 4. Software UART 16F877Atest.fcf
- (6.5 KiB) Downloaded 294 times
- Benj
- Matrix Staff
- Posts: 15312
- Joined: Mon Oct 16, 2006 10:48 am
- Location: Matrix TS Ltd
- Has thanked: 4803 times
- Been thanked: 4314 times
- Contact:
Re: RS232 Software UART String lesen
Hallo,
Um so etwas tun, müssen Sie eine State-Machine-Parser zu schreiben. Dies ist im Grunde eine Funktion, die durch die eingehenden Daten ein Byte zu einem Zeitpunkt, wird Schritt und machen Sinn. Zum Beispiel könnten Sie prüfen die eingehenden Byte zu sehen, ob sie gleich 'T' ist, wenn es dann wissen Sie, dass im Anschluss an diese sollten einige numerische Werte sein. Sie können überprüfen, ob der Wert eine Zahl durch eine Entscheidung mit dem Parameter: byte >= '0' && byte <= '9'
Während das Byte eine Zahl halten Multiplikation Ihre temporäre Variable um 10, bevor die nächste Nummer. Dann wiederholen Sie diesen Vorgang für die anderen Buchstaben oder Parameter, die Sie wollen in Ihrem System analysieren.
Versuchen Sie, kleine Stückchen und Test auf der Hardware eher dann zu versuchen, die ganze Sache auf einmal zu schreiben, da dies zu erleichtern und Fehler können behoben, da sie eher dann zu versuchen, die gesamte Anwendung am Ende debug eingeführt werden müssen.
Hello,
To do something like this you will need to write a state machine parser. This is basically a function that will step through the incoming data a byte at a time and make sense of it. For example you could check the incoming byte to see if it is equal to 'T' if it is then you know that following this should be some numeric values. You can check to see if the value is a number by using a decision with the parameter: byte >= '0' && byte <= '9'
While the byte is a number keep multiplying your temporary variable by 10 before adding the next number. Then repeat this process for the other letters or parameters you wish to parse into your system.
Try to do little bits and test on the hardware rather then trying to write the entire thing at once as this will make it easier and bugs can be fixed as they are introduced rather then trying to debug the entire application at the end.
Um so etwas tun, müssen Sie eine State-Machine-Parser zu schreiben. Dies ist im Grunde eine Funktion, die durch die eingehenden Daten ein Byte zu einem Zeitpunkt, wird Schritt und machen Sinn. Zum Beispiel könnten Sie prüfen die eingehenden Byte zu sehen, ob sie gleich 'T' ist, wenn es dann wissen Sie, dass im Anschluss an diese sollten einige numerische Werte sein. Sie können überprüfen, ob der Wert eine Zahl durch eine Entscheidung mit dem Parameter: byte >= '0' && byte <= '9'
Während das Byte eine Zahl halten Multiplikation Ihre temporäre Variable um 10, bevor die nächste Nummer. Dann wiederholen Sie diesen Vorgang für die anderen Buchstaben oder Parameter, die Sie wollen in Ihrem System analysieren.
Versuchen Sie, kleine Stückchen und Test auf der Hardware eher dann zu versuchen, die ganze Sache auf einmal zu schreiben, da dies zu erleichtern und Fehler können behoben, da sie eher dann zu versuchen, die gesamte Anwendung am Ende debug eingeführt werden müssen.
Hello,
To do something like this you will need to write a state machine parser. This is basically a function that will step through the incoming data a byte at a time and make sense of it. For example you could check the incoming byte to see if it is equal to 'T' if it is then you know that following this should be some numeric values. You can check to see if the value is a number by using a decision with the parameter: byte >= '0' && byte <= '9'
While the byte is a number keep multiplying your temporary variable by 10 before adding the next number. Then repeat this process for the other letters or parameters you wish to parse into your system.
Try to do little bits and test on the hardware rather then trying to write the entire thing at once as this will make it easier and bugs can be fixed as they are introduced rather then trying to debug the entire application at the end.
Regards Ben Rowland - MatrixTSL
Flowcode Product Page - Flowcode Help Wiki - Flowcode Examples - Flowcode Blog - Flowcode Course - My YouTube Channel
Flowcode Product Page - Flowcode Help Wiki - Flowcode Examples - Flowcode Blog - Flowcode Course - My YouTube Channel
Re: RS232 Software UART String lesen
Hallo Ben
und Danke für die schnelle Reaktion.
Das ist mein Problem. Ich weiß nicht wann String oder Charakter.Ich habe dass ganze Wochenende probiert.
Wenn ich Charakter wähle und = 84 (für T) eingebe dann geht nichts.
Der String kommt alle 30 Sekunden. Der Anfang ist Startbit => "T" => 000018,6
Kannst Du mir bitte mit einem kleinen Beispiel zeigen wie ich das T und die Zahl finden kann?
Auch bin ich nicht sicher bei den Einstellungen von dem Soft UART.
Vielen Dank und Grüße
Jo
und Danke für die schnelle Reaktion.
Das ist mein Problem. Ich weiß nicht wann String oder Charakter.Ich habe dass ganze Wochenende probiert.
Wenn ich Charakter wähle und = 84 (für T) eingebe dann geht nichts.
Der String kommt alle 30 Sekunden. Der Anfang ist Startbit => "T" => 000018,6
Kannst Du mir bitte mit einem kleinen Beispiel zeigen wie ich das T und die Zahl finden kann?
Auch bin ich nicht sicher bei den Einstellungen von dem Soft UART.
Vielen Dank und Grüße
Jo