Nachtrag: nach ca 10minuten hatte ich einen 0 Wert und danach einen mit 12962!
Druckbare Version
Nachtrag: nach ca 10minuten hatte ich einen 0 Wert und danach einen mit 12962!
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
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.
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
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
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:-)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
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.
Nö, ich muss ja nicht dabei bleiben - ich möchte ja das der µC schnell arbeitet. Wie bin ich darauf gekommen:Zitat:
Zitat von for_ro
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...
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.Code:Empfang(1) ; 8 = Udr
Printbin Empfang(1) ; 8
Empfang(1) ; 8 = 0
Versucht habe ich es mit:
In Byte 7&8 schreibe ich ja die 2te Zahl rein (also meine 20000)Code:I = Makeint(empfang(7) , Empfang(8))
Print I
Leider ist das Ergebnis immer 0
Eine Idee hatte ich noch - aber es klappt noch nicht
alles kommt an nur nicht sie beiden Werte die ich eigendlich übertragen möchte.Code:Dim S As String * 20
Dim Empfang(8) As Byte At S Overlay
'...
Onrxd:
Empfang(1) ; 8 = Udr
Print S
Return
heute wird das nichts mehr ... gute Nacht.
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.
Das verstehe ich nicht. Ist das jetzt die Empfangsseite? Was sollen diese Zeilen machen?Zitat:
Zitat von TobiasBlome
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