- SF800 Solar Speicher Tutorial         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 25

Thema: Absturz bei seriellem Empfang

  1. #11
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    95
    Beiträge
    627
    Anzeige

    Powerstation Test
    Nachtrag: nach ca 10minuten hatte ich einen 0 Wert und danach einen mit 12962!

  2. #12
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    95
    Beiträge
    627
    Hallo,
    hat denn keiner eine Idee für mich?
    Kann ich die serielle Datenübertragung irgendwie "kompakter" machen?
    Ich benötige nur 2 Werte (Bereich: 0-600 & 0-30000)
    Gibt es vielleicht noch eine andere schnellere bzw. Ressourcen sparendere Übertragung? I²C?

    Tobias

  3. #13
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Hallo Tobias,
    ich halte sowohl deine Sende- als auch deine Empfangsroutine für verbesserungsfähig.
    Auf der Sendeseite machst du das hier:
    Print "#S1:" ; Strom11 ; ";" ; Spannung2 ; ";;X"
    Dieser Befehl braucht für die Werte Strom11=200 und Spannung2=20000 6732 Takte (ohne das eigentliche senden). Das könntest du wesentlich verkürzen, wenn du nicht die Strings von 20000 schicken würdest, sondern den Wert mit
    Printbin 35 ; 83 ; 49 ; 58 ; Strom11 ; 59 ; Spannung2 ; 59 ; 59; 88
    was nur 151 Takte benötigt. Beim Empfangen musst die Bytes dann wieder zu einem Word zusammensetzen.
    Das Ganze wird noch schlimmer, wenn du dann mal Single Werte senden willst.

    Auf der Empfangsseite würde ich dies vermeiden:
    Parameter = Parameter + Chr(e_byte)
    Dies wird bei längeren Zeichenfolgen auch recht aufwändig.
    Wenn du bei der Stringlösung beim Senden bleiben willst, würde ich hier mit Overlays arbeiten. Dann geht das praktisch ohne Zusatzaufwand direkt beim Einlesen des UDR.

  4. #14
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    11.04.2005
    Beiträge
    1.469
    Hi,
    ich mache Übertragungen gerne mit einem String fester Länge und dann in Hex.
    In deinem Fall würde ich ein Startbyte senden, was außerhalb der Hexwerte 0-F liegt um Verwechslung mit den Datenbytes auszuschließen, also zB. das "S", danach einen String mit den Hexwerten. Für alle möglichen Werte bräuchte ich dann 7 Zeichen.
    3 für den ersten Wert (OK, nix gespart ) und für den zweiten Wert 4 Zeichen. Also würde mein ganzer String zB. für die Werte 29 und 6753 so aussehen "S01D1A61"
    Durch die feste Datenlänge spare ich mir die ganzen Trennzeichen etc.
    Ist eine etwas umständliche und warscheinlich recht langsame Methode, schließlich muß man die Daten erstmal so formatieren, daß Nullen vorangestellt werden.
    Dafür sind es dann auch nur 8 Bytes (oder 10 mit cr/lf) zu senden, was die Zeit beim Übertragen minimiert.
    Außerdem kann man die Daten schön im Terminalprogramm beobachten, insbesondere, wenn danach ein cr/lf gesendet wird.

    In der Empfangsroutine werden die Daten nach Erkennung des Startbytes dann in einem Rutsch eingelesen und einfach per "mid" wieder aufgetrennt und in Werte umgewandelt
    Beschreibungen wie "Spannung" "Strom" etc. kann man in der Empfangsroutine ja wieder hinzufügen.

    Gruß
    Christopher

  5. #15
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    95
    Beiträge
    627
    Hallo,
    vielen Dank für die Beiträge.
    Ich hab nun alles andere aus dem Programm entfernt und es geht -> d.h. es liegt wirklich an der Leistung die ich da "umsonst verbrauche"...

    Ich versuche mich gerade an der Version von for_ro, aber ich habs noch nicht ganz verstanden...

    wofür sind die ganzen Zahlen?
    Mein Versuch sieht nun so aus:

    Code:
    'Test as Word
    Test = 20000
    Printbin Test

    Code:
    Onrxd:
    Test1 = Udr  'as Byte
    Test2 = Udr  'as Byte
    Print "Test1: " ; Test1
    Print "Test2: " ; Test2
    
    
    
    Test3 = Makeint(test2 , Test1)  'Test3 as Word
    Print "Test3: " ; Test3
    Test1 = 0                                                   'löschen
    Test2 = 0
    Test3 = 0
    Das zusammensetzen funktioniert noch nicht richtig und es kommt mir etwas umständlich vor, besonders, wenn der 2te Wert auch noch "entschlüsselt" werden muss....aber ich arbeite daran(freue mich natürlich über Hilfe

  6. #16
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Mal angenommen, du bleibst bei der Version mit den vielen Trennzeichen (ich gebe chr-mt übrigens recht, dass die vollkommen überflüssig sind) dann bleiben die ja an festen Stellen stehen.
    Da Printbin für die Übertragung eines Arrays gedacht ist, würde ich dies auch nutzen und das so machen:

    Dim Ausgabe(11) As Byte
    Ausgabe(1) = 35 'dein #
    Ausgabe(2) = 83 'dein S
    Ausgabe(3) = 49 'dein 1
    Ausgabe(4) = 58 'dein :
    Ausgabe(5) = 0 'dein Strom11 (Byte), kommt später
    Ausgabe(6) = 59 'dein ;
    Ausgabe(7) = 0 'dein Spannung2 (low word), kommt später
    Ausgabe(8) = 0 'dein Spannung2 (high word), kommt später
    Ausgabe(9) = 59 'dein ;
    Ausgabe(10) = 59 'dein ;
    Ausgabe(11) = 88 'dein X

    Dies setzt du einmal zu Anfang.
    Wenn du es ganz cool machen willst dann nutzt du auch hier Overlays

    Dim Strom11 As Byte At Ausgabe(5) Overlay
    Dim Spannung2 As Word At Ausgabe(7) Overlay

    Nachdem du nun Strom11 und Spannung2 irgendwo im Programm berechnet und zugewiesen hast, stehen die automatisch in der Ausgabe an der richtigen Stelle.
    Du kannst dann die Ausgabe über

    Printbin Ausgabe(1);11

    machen und bist fertig.

    Vielleicht kommst du ja jetzt auch von alleine drauf, wie das bei dem Einlesen gemacht werden könnte.

  7. #17
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    95
    Beiträge
    627
    Zitat Zitat von for_ro
    Mal angenommen, du bleibst bei der Version mit den vielen Trennzeichen (ich gebe chr-mt übrigens recht, dass die vollkommen überflüssig sind)
    Nö, ich muss ja nicht dabei bleiben - ich möchte ja das der µC schnell arbeitet. Wie bin ich darauf gekommen:

    Ich speicher die Daten auf einer SD Karte. Die txt Datei impotiere ich mit Excel. Damit ich keine festen Abstände brauche (z.b. 00001) benutze ich als Trennzeichen ein ";" welches bei Excel sehr schön erkannt wird
    Deshalb habe ich die Werte auch bei dem sendenden µC so getrennt.
    # = achtung es geht los
    S1 = wenn es später einen weiteren µC gibt weiß ich: nun sendet SLAVE 1
    : = jetzt kommt der Wert
    ; und der nächst Wert...

    Ich habe ja erst später gesehen, dass ich den µC damit so stark ausgebremst habe, dass nichts mehr ging...


    Code:
    Empfang(1) ; 8 = Udr
    Printbin Empfang(1) ; 8
    Empfang(1) ; 8 = 0
    Es kommen Daten an - nun stellt sich mir die Frage wie ich die Binärdaten zusammen setze, damit ich am Ende z.b. die 20000 als Zahl habe.
    Versucht habe ich es mit:
    Code:
    I = Makeint(empfang(7) , Empfang(8))
    Print I
    In Byte 7&8 schreibe ich ja die 2te Zahl rein (also meine 20000)
    Leider ist das Ergebnis immer 0

  8. #18
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    95
    Beiträge
    627
    Eine Idee hatte ich noch - aber es klappt noch nicht
    Code:
    Dim S As String * 20
    Dim Empfang(8) As Byte At S Overlay
    
    '...
    Onrxd:
    Empfang(1) ; 8 = Udr
    Print S
    Return
    alles kommt an nur nicht sie beiden Werte die ich eigendlich übertragen möchte.

    heute wird das nichts mehr ... gute Nacht.

  9. #19
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Dass du die ; in der txt-Datei brauchst, verstehe ich. Dadurch geht das Einlesen in Excel leichter.
    Aber von einem µC zum anderen sehe ich den Sinn noch nicht. Aber sei's drum. Die paar zusätzlichen Zeichen machen dir nicht das Timing kaputt sondern die Konvertierung in Strings im Print-Befehl.

    Zitat Zitat von TobiasBlome
    Empfang(1) ; 8 = Udr
    Printbin Empfang(1) ; 8
    Empfang(1) ; 8 = 0
    Das verstehe ich nicht. Ist das jetzt die Empfangsseite? Was sollen diese Zeilen machen?

  10. #20
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    95
    Beiträge
    627
    Der Post hat sich wohl überschnitten
    Ja, das ist die Empfangsseite.
    Der Printbin Befehl war nur um zu sehen was ankommt. Nach dem senden habe ich die Varible "gelöscht" bzw. auf 0 gesetzt.

    Aber bei der Fragestellung bin ich wohl auf dem Holzweg oder?
    Mit Version 2 müsste es doch gehen:
    Code:
    Dim S As String * 20
    Dim Empfang(8) As Byte At S Overlay
    
    '...
    Onrxd:
    Empfang(1) ; 8 = Udr
    Print S
    Return

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress