Moin,
so ein EasyMeter sendet ja alle zwei Sekunden über die D0 Schnittstelle Daten aus, was dann so ähnlich aussieht wie in der angehängten Datei.
Diese Daten lese ich per Hardware UART in ein Byte-Array ein und schneide die für mich interessanten Nutzdaten per String-Overlay zusammen.
Um das Ende der jeweiligen Strings für die Ausgabe zu erkennen, muss ich gewisse Bytes im Array eine Null zuweisen. Außerdem ersetzte ich
die Punkte der einzelnen Werte in ein Komma. Das Ganze funktioniert soweit, nur finde ich das zusammenfrickeln der Ausgabe (Zeilen 33 bis 43)
nicht so elegant.
Hat jemand einen anderen Ansatz?
Hier der Code
Alles anzeigen
so ein EasyMeter sendet ja alle zwei Sekunden über die D0 Schnittstelle Daten aus, was dann so ähnlich aussieht wie in der angehängten Datei.
Diese Daten lese ich per Hardware UART in ein Byte-Array ein und schneide die für mich interessanten Nutzdaten per String-Overlay zusammen.
Um das Ende der jeweiligen Strings für die Ausgabe zu erkennen, muss ich gewisse Bytes im Array eine Null zuweisen. Außerdem ersetzte ich
die Punkte der einzelnen Werte in ein Komma. Das Ganze funktioniert soweit, nur finde ich das zusammenfrickeln der Ausgabe (Zeilen 33 bis 43)
nicht so elegant.
Hat jemand einen anderen Ansatz?
Hier der Code
Quellcode
- $regfile = "m32def.dat"
- $crystal = 8000000
- $hwstack = 100
- $swstack = 100
- $framesize = 100
- ' Hardware Uart für das auslesen des EasyMeter
- Config Com1 = 9600 , Synchrone = 0 , Parity = Even , Stopbits = 1 , Databits = 7 , Clockpol = 0
- On Urxc Urxc_isr
- Enable Urxc
- Dim Uartchar As Byte
- Dim Start_empfang As Byte
- Dim Uartstring_index As Byte
- Dim Uartstring(210) As Byte
- Dim Zaehlernummer As String * 13 At Uartstring(39) Overlay
- Dim Zaehlerstand As String * 12 At Uartstring(69) Overlay
- Dim Leistung_l1 As String * 9 At Uartstring(109) Overlay
- Dim Leistung_l2 As String * 9 At Uartstring(140) Overlay
- Dim Leistung_l3 As String * 9 At Uartstring(171) Overlay
- Dim Leistung_ges As String * 9 At Uartstring(201) Overlay
- ' Software Uart für die Seriale Ausgabe
- Open "comd.6:19200,8,n,1" For Output As #1 'TxD-Pin
- Dim Ausgabe_flag As Byte
- Enable Interrupts
- Do
- If Ausgabe_flag = 1 Then
- Uartstring(52) = 0 ' Null-Byte um String zu trennen (Zählernummer)
- Uartstring(80) = 0 ' Null-Byte um String zu trennen (Zählerstand)
- Uartstring(77) = 44 ' Punkt durch Komma ersetzten (Zählerstand)
- Uartstring(118) = 0 ' Null-Byte um String zu trennen (Leistung L1)
- Uartstring(115) = 44 ' Punkt durch Komma ersetzten (Leistung L1)
- Uartstring(149) = 0 ' Null-Byte um String zu trennen (Leistung L2)
- Uartstring(146) = 44 ' Punkt durch Komma ersetzten (Leistung L2)
- Uartstring(180) = 0 ' Null-Byte um String zu trennen (Leistung L3)
- Uartstring(177) = 44 ' Punkt durch Komma ersetzten (Leistung L3)
- Uartstring(210) = 0 ' Null-Byte um String zu trennen (Leistung ges)
- Uartstring(207) = 44 ' Punkt durch Komma ersetzten (Leistung ges)
- Print #1 , "Zaehler-Nr: " + Zaehlernummer
- Print #1 , "Zaehlerstand: " + Zaehlerstand
- Print #1 , "Leistung L1: " + Leistung_l1
- Print #1 , "Leistung L2: " + Leistung_l2
- Print #1 , "Leistung L3: " + Leistung_l3
- Print #1 , "Leistung ges.:" + Leistung_ges
- Ausgabe_flag = 0
- End If
- Loop
- End
- Urxc_isr:
- If Udr = 47 Then Start_empfang = 1 ' Start => ASCII-zeichen "/" enpfangen
- If Start_empfang = 1 Then
- Incr Uartstring_index
- Uartstring(uartstring_index) = Udr
- If Uartstring_index = 210 Then
- Start_empfang = 0
- Uartstring_index = 0
- Ausgabe_flag = 1
- End If
- End If
- Return