Hallo zusammen, ich habe eine serielle Funkuhr. Deren Daten möchte ich mit Hyperterminal auslesen. Dazu muss ich ihr erst mal ein kleines o und carriage Return senden. Dann soll die Uhr mit einem 16 Byte langen ASCII-String antworten, der Uhrzeit und Datum im Klartext anzeigt. Das Problem: Laut mitgeliefertem Hilfetext hat die Uhr für Senden und Empfangen unterschiedliche Schnittstellenparameter. Daten zur Funkuhr Geschwindigkeit: 300 bps Datenbits: 8 !!! Paritätsbit: nein !!! Stoppbits: 2 Antworten der Funkuhr Geschwindigkeit: 300 bps Datenbits: 7 Paritätsbit: gerade Stoppbits: 2 Mit den Einstellungen zum Senden kann ich Daten zur Uhr senden, die dann auch mit dem 16 Byte langen Uhrzeit-String antwortet. Aber die Antwort ist nicht direkt lesbar, weil die Anzahl der Datenbits ja falsch ist. Gibt es einen Trick, wie ich gleichzeitig unterschiedliche Einstellungen für Senden und Empfangen einstellen kann, so dass ich einerseits korrekt senden und andererseits wieder korrekt empfangen kann? Danke für Eure Antworten und viele Grüße Karl
Hallo, wie wäre es, wenn du das Terminal auf die Sendeparameter einstellst und die empfangenen Datenbytes (8Bit=7Daten+1Parity) in der anschließenden Weiterverarbeitung einfach mit einem Shift nach rechts korrigierst.. (DDDDDDDP >> 1) = 0DDDDDDD (Entspricht einer Integer division durch 2) Ich glaube nicht das irgendein Terminal von haus aus sowas unterstützt! Beim Bray Terminal http://bray.velenje.cx/avr/terminal/ hab ich auch eine kleine Skript-Funktion entdeckt, damit könntest du vielleicht die empfangenen Bytes vor dem Anzeigen durch 2 teilen und dann ausgeben.
Ich denke, Du hast Glück. Du stellst also Hyperterminal auf 300 Baud, 8 Datenbits, No Parity, 2 Stoppbits. Somit kannst Du der Uhr schon mal in den Hintern treten. Empfangen kannst Du auch, aus dem Parity wird einfach das oberste Datenbit. Das sieht in Hyperterminal dann wahrscheinlich doof aus, mit einer selbstgestrickten Anwendung, kannst Du das Parity aber einfach per Und-Verknüpfung mit 0x7F ausblenden oder evtl. sogar auswerten...
Sorry, das mit dem Shift war ein Mist! Hatte nicht daran gedacht, dass zuerst das LSB gesendet wird....
Müsste ich denn nicht beim ersten Byte 1 Bit schieben, beim zweiten Byte 2 Bit, beim dritten Byte 3 Bit usw. Müßte ja bei jedem weiteren Byte ein Bit verrutschen das Ganze oder? Falls nicht, müßte ich ja nur wissen, welcher Ziffer welches Sonderzeichen zugeordnet ist. Und es sind ja nur 10 Ziffern.
Warum solltest Du das tun wollen? Denke nicht zu kompliziert. Probier's aus! 50% der Zeichen, die aus der Uhr kommen, sollten ja eh schon korrekt dargestellt werden. Nachdem es eine Atomuhr ist, sollte eine bekannte Uhrzeit/Datum erscheinen. Hast Du's schon gewagt, die Uhr mal anzuschließen. Und? Was passiert? Du wirst ja nicht für alle Zukunft Hyperterminal verwenden wollen, oder?
Was ist, wenn Du mit 7,e,2 sendest? Die Chancen stehen 50:50, dass das Parity des o so ist wie das erwartete Bit7, nämlich low... Nein, geht nicht, 0D 0A kommt auch noch.... Wie reagiert die Uhr auf gesetztes Bit7 (=gesendetem Parity)? Wenn Du 2 Serielle hast, kannst Du ja auf der einen senden und auf der anderen mit anderen Parametern empfangen. (2x Hyperterm oder anderes Programm aufmachen). Nochmal zum Mitdenken: Sta 0 1 2 3 4 5 6 7 Sto Sto 8,n,2 Sta 0 1 2 3 4 5 6 P Sto Sto 7,e,2 0 1 1 1 1 0 0 1 0 1 1 o 8,n,2 Parity falsch 0 1 1 1 1 0 0 1 1 1 1 o 7,e,2 0 1 0 1 1 0 0 0 0 1 1 CR 8,n,2 Parity falsch 0 1 0 1 1 0 0 0 1 1 1 CR 7,e,2 0 0 1 0 1 0 0 0 0 1 1 LF 8,n,2 0 0 1 0 1 0 0 0 0 1 1 LF 7,e,2 Bin mir nicht sicher, ob die Parities so richtig sind, aber mindestens einmal ist sie sicher falsch.
Danke erst mal, dass ihr euch die Arbeit gemacht habt. Ich habe gerade die ausgegebenen Ziffern in der DOS-ASCII-Tabelle http://www.free-solutions.de/js/zeichensatz_ascii-dos_code.html herausgesucht und deren Binärdarstellung mit den Ziffern verglichen die hätten erscheinen müssen. Dabei kam ich auf folgendes: Ziffern 0,3,5,6 und 9 wurden korrekt übertragen. Bei den anderen Ziffern wurde das höchste Bit von einer Null zur Eins und damit dem ASCII-Code die Zahl 128 aufaddiert. Sieht schwer danach aus, als ob das Parity-Bit das höchste Bit der 8 Bit Ziffer überschrieben hat. Ich müsste also in meiner Software schauen ob die Parität gerade ist und falls ja, von dem übergebenen ASCII-Wert 128 abziehen. Dann würde es stimmen. Die Frage ist nur, ob ich das in meine gewünschte Anwendung umsetzen kann. Mal kräftig nachgrübeln. Werde daraus dann wahrscheinlich einen neuen Thread eröffnen, wenn ich alleine nicht weiter komme.
@all, ich ahbe zwar keine Erfahrungen mit dem hier gestellten Problem doch mit Hyperterminal hatte ich auch so meine Probleme, dass Zeichen nicht ganz richtig übertragen bzw. empfangen wurden. Habe im Netz ein anderes Tool gefunden das wesentlich einfacher aufgebaut ist eventuell versuchst Du es mal mit diesen Tool. Bei go* einfach Realterm eingeben und downloaden ca. 1,5 MB und staunen was es alles kann. TOM
@Karl-Alfred Es ist nicht so komlipiziert. Wie gesagt: Setze einfach immer das oberste Bit auf null und Du hast den gesuchten ASCII-Code. Du musst nicht ein einziges aml Einsen zählen...
Könntest Du mal bitte folgende oben gestellte Fragen beantworten: Hast Du 2 serielle Schnittstellen zur Verfügung? Hast Du schon versucht, was die Uhr macht, wenn sie falsche Parität empfängt? Hast Du schon mit 7,e,2 probiert zu Senden und Empfangen? Hast Du im Hyperterm schon die verschiedenen Terminal-Emulationen versucht? Eigenschaften | Einstellungen | Emulation und Eigenschaften | Einstellungen | ASCII-Konfiguration | 7-bit-Empfang
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.