ein kleines Beispiel wäre supernett. Irgendwie raffe ich das noch nicht so ganz mit den Start- und Stoppzeichen.
Gruß
Markus
Yo,ich arbeite mit vollversion die freie Grenze (Jetzt 4k davor 2k) ist schnell erreicht.
Zu Trennzeichen:
aus beiden Sachen kann ich jetzt nix rauslesen.
Ich weiß ja nicht welche Werte ,Zeichen oder sonstwas rüberkommt.
Nimm zb. zwei Schlüsselzeichen die sonst nirgend vorkommen können.
Eins ist für Start das andere für Stopp
Telegrammbreite ist meinentwegen 5 Zeichen lang.
Deine Empfangsroutine wartet auf das Startzeichen.
Danach werden die ankommenden Bytes einsortiert ("Sendepaket(x)")
ideal kommt nach dem 5. Zeichen das Stoppzeichen.
Stimmt das alles dann kann der empfang verarbeitet werden.
Kommt mit dem 6. Zeichen nicht Stopp oder Stopp zufrüh dann wird der Empfang zurückgesetzt und neu gestartet.
Das ganze läst sich natürlich auch mit einer Checksumme ergänzen.
Is wie gesagt nur ein Beispiel von vielen.
Ich kann dir ja auch mal nen kleines Beispiel zusammensetzen wenn willst.
Gruß
Ratber
ein kleines Beispiel wäre supernett. Irgendwie raffe ich das noch nicht so ganz mit den Start- und Stoppzeichen.
Gruß
Markus
Yo,hat was gedauert.Mußte noch was tun.
Hier ein gaaaaanz einfaches Beispiel und nicht optimiert.
Ich weiß das es noch zig andere und bessere Metoden gibt aber wir fangen mal nachvolziehbar an.
Die Checksumme ist natürlich Einfachst aber da kannste ja reinsetzen was de haben möchstest.
Ich hab das jetzt mal in 10 Minuten so aussem Ärmel geschüttelt also keine Mosereien von der dritten Seite die sich bis jetzt bedeckt gehalten hat.
Es geht nur ummes Prinzip.
Schau mal ob de das verstehst.
Die vielen If Then Geschichten lassen sich natürlich noch besser darstellen (zb. Case)
Ich hoff das ich auf die schhnelle keinen dicken Käfer reingeknetet habe.
Code:'------------------------------------------------------------------------------- ' Erwartet werden 5 Zeichen Nutzdaten plus checksumme ' Startzeichen ist chr 15 '------------------------------------------------------------------------------- $regfile = "m16def.dat" $crystal = 16000000 $baud = 9600 $hwstack = 32 $swstack = 10 $framesize = 40 Dim A As Byte 'Allgemein Dim C As Byte 'Für Checksumme Dim B(5) As Byte 'Nutzdaten Dim Z As Byte 'Zähler Z = 0 C = 0 Do 'Hauptschleife If Ischarwaiting() = 1 Then Gosub Empfang 'wenn zeichen im Puffer dann "Empfang" If Z = 7 Then Gosub Auswertung 'Hier könnete ihre Werbung stehen Loop Empfang: A = Waitkey() If Z > 0 Then Goto Empfang2 'wenn z schon größer dann weiter bei Empfang2 If A = 15 Then Incr Z 'Wenn Startzeichen dann Z auf Startposition und Return ' zurück zum Hauptprogramm Empfang2: If Z < 6 Then B(z) = A 'Daten einsortieren C = C Xor A 'Checksumme bilden.Einfach aber brauchbar. Incr Z 'z um eins rauf für den nächsten Return Auswertung: If C <> 0 Then Z = 0 'Prüfen ob die Checksumme stimmt.wenn nicht dann alles neu. C = 0 Return End If 'hier die Verarbeitung Z = 0 'Nach der Verarbeitung alles wieder auf 0 und zurück C = 0 Return
Gruß
Ratber
ahh.... jetzt bröselt schön langsam der Kalk.
ist das "z" bei:
Empfang2:
If Z < 6 Then B(z) = A
ein Tippfehler? Ich glaub schon, müsste wenn ich das hier kapiert habe ja
If Z<6 Then B(5) =A
Damit werden die 5 Zeichen in A zusammengefasst und die Checksumme durch Xor des gesamten Inhaltes von A gebildet. Richtig?
Ok was sendet dann der Sender?
Startzeichen, 5 Zeichen Nutzdaden und auch die Checksumme?
Ist das dann beim Sender ganz einfach mit:
Print 15 ;B(1) B(2);B(3).....B(5); C erledigt?
Beim Sender dann sowas in der Art?
Ich tue mich da echt noch recht schwer. Hmm... bin vor 9 Tagen überhaupt in die Materie eingestiegen. Also ein absoluter Anfänger.Code:$regfile .... bla bla Dim A as Byte Dim C as Byte Dim B(5) as Byte Dim Start as Byte start =15 B(1) = 'Irgend eine Variable aus dem Programm' B(2) = 'eine andere Variable aus dem Programm' . . . B(5)= 'noch eine und die Letzte Variable aus dem Programm B(1),5 = A C=C xor A Print Start; B(1),5 ; C
Und auch nimma der jüngste.
Gruß
Markus
Nö das ist so gewollt.st das "z" bei:
Empfang2:
If Z < 6 Then B(z) = A
ein Tippfehler?...........
Die Variable B ist als Array mit 5 Zellen angelegt also B(1) bis B(5).
Z ist einfach nur der Zähler.
Wenn ein Zeichen im Puffer ist kann man das mit Ichharwaiting erkennen.
Im Empfang wird das Zeichen gelesen.
Wenn das Zeichen chr15 ist dann wird der Empfang gestartet ansonsten tut sich nix und es geht zurück.
Ist das Zeichen 15 dann werden die folgenden 5 Zeichen in B(1) bis B(5) gespeichert und die Checksumme mit einfachem Xor gebildet.
am Ende kommt noch die Checksumme vom Sender als 6. Zeichen.
Wenn die Xorverknüpfung der 5 Bytes korrekt ist dann ergibt ein weiteres Xor mit der Checksumme vom Sender = 0
In der Auswertung wird das nochmal überprüft.
Ist die Checksumme verschieden dann wird derEmpfang verworfen.
Natürlich ist der Empfang noch nicht ganz abgesichert.
Wie gesagt,eine Möglichkeit.
Wie du das beim Sender machst ist dir überlassen.Ist das dann beim Sender ganz einfach mit:
Print 15 ;B(1) B(2);B(3).....B(5); C erledigt?
Hauptsache du schickst Startzeichen,5 Zeichen Nutzdaten und die passende Checksumme.
Die Zeile funktioniert aber so nicht ganz.
Print ist mehr für Text gedacht.
Nimm Printbin dafür.
Zum Code:
So einfach gehts nicht mit der Checksumme.
Hier mal ein hoffentlich nachvollziehbares Beispiel.
Is im Grunde das gleiche wie beim Empfang.
Das "B(1)" sendet das ganze array.Code:beispiel: Start = 15 C = 0 B(1) = 50 B(2) = 100 B(3) = 54 B(4) = 88 B(5) = 213 For Z = 1 To 5 C = C Xor B(Z) Next Printbin Start ; B(1) ; C Return
Schau dir den Befehl mal in der Hilfe an und experimentier damit.
Ich hab die empfangsroutine so gestaltet das der Empfang nebenher geschehen kann und nicht den Betrieb stört.
Wenn sicher ist das alle 7 Zeichen im Puffer liegen dann gehts natürlich auch mit einem einfachen Inputbin
Also Analog zu Prntbin : "Inputbin Start ; B(1) ; C"
Hier kann man dann nachher kontrollieren ob der Datensatz gültig ist oder nicht.
Das Problem ist nur nicht schon in der halben Übertragung abzufragen denn damit unterbricht man den Rest des Systems falls Zeichen nicht kommen
Aber schau dir erstmal das andere an.
Gruß
Ratber
...jezt ist der Groschen gefallen!!! \/
habs kapiert !! Super - Deine Erklärung hier war wirklich für Dummies wie mich. Ich hoffe Dein neues Avatar ist nicht das Foto Deines Gesichtes beim lesen meiner Fragen
Nö,so sehe ich immer aus wenn ich gerade aufgestanden bin
Gruß
Ratber
... ich glaub ich seh morgen früh auch so aus
Ich habe die RS232 Übertragung für den Sender erfolgreich implementiert \/ und über das Hyperterminal getestet. funzt!!
Sender ist ja auch net schwer zu kapieren.
Jetzt muss ich noch die Empgängerroutine anpassen und in den code einbasteln. Ehrlich das mit der Empfängergeschichte krieg ich nicht abschließend in mein Schädel.
Die 5 Nutzdaten liegen dann in A. richtig? Weil ja bei Empfang2 steht:
If z<6 then B(z) =A und wenn alles da ist Z auf 7 gesetzt wird und über Gosub in die Auswertung der Checksumme gesprungen wird.
Wie drönsel ich die Daten wieder auf - also wie kann ich dann die jeweiligen B(1)...B(5) dann gezielt an das Mainprog weitergeben?
Checkt das Prog wenn ich mit B(1) = Irgendwas, If B(2) wasweisich then haumichblau... weitermache? Ich meine schon da B(z) ja ein Array von den 5 Nutzdaten ist. Richtig?
Wo ist dann der Platz für die Verarbeitung der Nutzdaten am besten. Bei "Werbung" im Loop oder bei "hier die Verarbeitung". Frage deshalb weil bei meinem Mainprog erst was gemacht werden soll, wenn die Empfangen Daten vom Wert her größer sind als die alten vorangegangen Daten. Ich hätte das in den Loop eingebaut. Also auch die Abrfage ob die neuen Daten größer sind, und wenn ja mit Gosub in die jeweiligen Subroutinen der LCD Visualisierung. Sonst flackert das LCD wenn ständig akutalisiert wird aber keine neue Anzeige nötig ist. Diesen Teil habe ich schon fertig. Bisher habe ich mit Inkey() gearbeitet.
Hier der Auszug aus meinem Code:
boah.... mein Schädel raucht - Programmier Crashkurs in einer Woche!
Code:'------------------------------------------------------ '*** Hauptschleife *** '------------------------------------------------------ 'Enable Interrupts Tankalt = 0 Eualt = 1023 Signal = 2 'Signalqualität 0=sehr gut bis 5=schlecht Gosub Visualisierung Do Tankneu = Inkey() If Tank >= Schwelle Then Sound Portd.7 , 400 , 400 Sound Portd.7 , 400 , 250 End If If Tankneu > Tank Then Tankalt = Tankneu Gosub Visualisierung End If Euneu = Inkey() If Euneu < Eu Then Eualt = Euneu Gosub Visualisierung End If Loop '------------------------------------------------ 'Subroutine Visualisierung '------------------------------------------------
wird schon.
Ja der Grund für diese Version ist das die Daten nur nebenbei empfangen werden sollen so daß das Hauptprogramm weiterlaufen kann.Die 5 Nutzdaten liegen dann in A. richtig? Weil ja bei Empfang2 steht:
If z<6 then B(z) =A und wenn alles da ist Z auf 7 gesetzt wird und über Gosub in die Auswertung der Checksumme gesprungen wird.
Ist also einfach zu integrieren.
Geh einfach mal mit einem Beispieldatensatz die Routine in Gedanken mehrmals durch.
Sieht etwas wirr aus aber funktioniert.
Leider bin ich Gedanklich nicht so in deinem Projekt drinne als das ich gleich sagen könnte "Na klar,mach so und so und fertig" .
Ich kann dir nur Ideen liefern.
Wie du deine Daten in die Bytes verpackst und wieder auspackst dürfte nicht schwer sein.
Ich nehme mal an es ist das was ich bis jetzt weiß.
Tankinhalt bzw. Verbrauchszahlen,Spannung,Temperatur usw.
Es sollte ein Leichtes sein die Daten in den Datensatz zu bekommen und im Intervall zu senden.
Da der Empfänger einen Puffer hat geht ja nix flöten ausser bei Empfangsproblemen.
Also in Kurzform:
Modell:
Daten Sammeln
Alle X Sekunden (Millisekunden) senden
Fertig.
Emnpfänger:
Daten bei empfang nach und nach aus dem Puffer fischen und bei gültigkeit ins Programm übernehmen.
Wenn die Sende und Empfangsroutinen stehen dann ist das eigentlich kein Akt mehr.
Oder hast du deine Berechnung nicht so sehr auf ...ja,sagen wir mal so....Intervallbetrieb ausgelegt ?
Gruß
Ratber
Lesezeichen