Strings empfangen klappt nicht

Guten Morgen!

Mit dem U2X-Flag habe ich noch nichts gemacht. Werde das heute Abend mal testen (bzw. mich da einlesen).
 
Hallo Ditron!

Es spricht natürlich nichts dagegen, sich in diesen Bereich der Manual mal einzulesen!

Letztlich bleibt aber der interne "Quarz" immer sehr ungenau und temperaturabhängig..... was dir wieder Fehlerwerte bei den Baud`s bringt. :wink:
Wenn du also grundsätzlich etwas mit USART am AVR machen möchtest, dann befolge den Ratschlag von Dino und verwende einen externen Quarz.
Am Besten noch Einen, der dir auch "gerade" Baudwerte ermöglicht!

Grüße,
Cassio
 
Habe nun einiges gelesen, aber so richtig *klick* hat es noch nicht gemacht.

Wenn ich den Rechner von Dirk zu Rate ziehe, dann verstehe ich das so: 16MHz-Quarz und 19200 Baud = 0,16% Fehler
 
Hi,

versuch mal einen 14.7456 MHz- Quarz, da geht alles fehlerfrei bis 115.2k; zumindest können sich MEINE AVR störungsfrei unterhalten. Darüber habe ich noch nichts ausprobiert.
 
Hallo!

Michael hat so gesehen schon recht.....
Der 14,7456MHz Quarz ist generell dafür am Besten geeignet.....
Allerdings nur, wenn der AVR die >14MHz auch vertragen kann. :cool:


Ansonsten hast du den Rechner von Dirk schon richtig bedient. ;)
Ist doch wirklich ein ganz praktisches Hilfsmittel!

Grüße,
Cassio
 
Einfach mal ein Blick in's DB ab Seite 165 werfen.
@Grandpa: Du meintest jetzt nicht zwischen 2 AVR, oder? Da sollte doch jede beliebige Rate passen, solange bei beiden gleich. Mit den krummen Quarzen paßt man sich doch nur den "krummen Standards" an. Btw: bei meinem DSO (Mega88@16MHz) gabs bei 115k2 auch keine Probleme.
 
3 AVR mit PC- Ausgabe - Dino's "Ringleitung". 1 x Mega32 als Master, je ein Mega8 und ein Tiny85 pro Slot.

Ich bleibe bei den krummen Takten. Ob 16 oder 14,...MHz ist eigentlich egal. Die AVR werden sowieso die meißte Zeit mit Warten verbringen. Ca. 5 Sekunden pro Sektorzeit für die Berechnungen sind laaaaaang...(da würden sogar 9600baud ausreichen).
 
Zwischendurch eine kleine Erfolgsmeldung:
In einer Grabbelkiste habe ich noch ein 4Mhz-Quarz gefunden und nun läuft alles ohne Probleme. Die 14,... Mhz Quarze sind bestellt, damit der uC sich nicht langweilt ;)
 
Danke noch für den Link. Ich nutze den Rechner von Dirk, den Cassio verlinkt hat.
 
Kann es sein, dass es Probleme mit dem Empfangen von Sonderzeichen gibt (in diesem Fall / und \)?

Auf einem Pc läuft ein Programm, das die Daten aus dem Netzwerk empfängt (zB A/40\1200/30\275) und diese an Com1 sendet. Diese empfange ich im uC und möchte die entsprechend auseinander sortieren, so dass ich zB 40 und 1200 als Werte hab. Leider hab ich gerade mein Programm nicht da. Aber ich habe den Verdacht, dass bei der Auswertung mit den / und \ etwas schief läuft. Sowohl mit dem Ascii-Code als auch mit dem Zeichen klappt es nicht.
 
Hallo Ditron !

Hier mal die ASCII-Zeichen-Tabelle:

Decimal Octal Hex Binary Value

------- ----- --- ------ -----

000 000 000 00000000 NUL (Null char.)
001 001 001 00000001 SOH (Start of Header)
002 002 002 00000010 STX (Start of Text)
003 003 003 00000011 ETX (End of Text)
004 004 004 00000100 EOT (End of Transmission)
005 005 005 00000101 ENQ (Enquiry)
006 006 006 00000110 ACK (Acknowledgment)
007 007 007 00000111 BEL (Bell)
008 010 008 00001000 BS (Backspace)
009 011 009 00001001 HT (Horizontal Tab)
010 012 00A 00001010 LF (Line Feed)
011 013 00B 00001011 VT (Vertical Tab)
012 014 00C 00001100 FF (Form Feed)
013 015 00D 00001101 CR (Carriage Return)
014 016 00E 00001110 SO (Shift Out)
015 017 00F 00001111 SI (Shift In)
016 020 010 00010000 DLE (Data Link Escape)
017 021 011 00010001 DC1 (XON) (Device Control 1)
018 022 012 00010010 DC2 (Device Control 2)
019 023 013 00010011 DC3 (XOFF)(Device Control 3)
020 024 014 00010100 DC4 (Device Control 4)
021 025 015 00010101 NAK (Negative Acknowledgement)
022 026 016 00010110 SYN (Synchronous Idle)
023 027 017 00010111 ETB (End of Trans. Block)
024 030 018 00011000 CAN (Cancel)
025 031 019 00011001 EM (End of Medium)
026 032 01A 00011010 SUB (Substitute)
027 033 01B 00011011 ESC (Escape)
028 034 01C 00011100 FS (File Separator)
029 035 01D 00011101 GS (Group Separator)
030 036 01E 00011110 RS (Request to Send)(Record Separator)
031 037 01F 00011111 US (Unit Separator)
032 040 020 00100000 SP (Space)
033 041 021 00100001 ! (exclamation mark)
034 042 022 00100010 " (double quote)
035 043 023 00100011 # (number sign)
036 044 024 00100100 $ (dollar sign)
037 045 025 00100101 % (percent)
038 046 026 00100110 & (ampersand)
039 047 027 00100111 ' (single quote)
040 050 028 00101000 ( (left/opening parenthesis)
041 051 029 00101001 ) (right/closing parenthesis)
042 052 02A 00101010 * (asterisk)
043 053 02B 00101011 + (plus)
044 054 02C 00101100 , (comma)
045 055 02D 00101101 - (minus or dash)
046 056 02E 00101110 . (dot)
047 057 02F 00101111 / (forward slash)
048 060 030 00110000 0
049 061 031 00110001 1
050 062 032 00110010 2
051 063 033 00110011 3
052 064 034 00110100 4
053 065 035 00110101 5
054 066 036 00110110 6
055 067 037 00110111 7
056 070 038 00111000 8
057 071 039 00111001 9
058 072 03A 00111010 : (colon)
059 073 03B 00111011 ; (semi-colon)
060 074 03C 00111100 < (less than)
061 075 03D 00111101 = (equal sign)
062 076 03E 00111110 > (greater than)
063 077 03F 00111111 ? (question mark)
064 100 040 01000000 @ (AT symbol)
065 101 041 01000001 A
066 102 042 01000010 B
067 103 043 01000011 C
068 104 044 01000100 D
069 105 045 01000101 E
070 106 046 01000110 F
071 107 047 01000111 G
072 110 048 01001000 H
073 111 049 01001001 I
074 112 04A 01001010 J
075 113 04B 01001011 K
076 114 04C 01001100 L
077 115 04D 01001101 M
078 116 04E 01001110 N
079 117 04F 01001111 O
080 120 050 01010000 P
081 121 051 01010001 Q
082 122 052 01010010 R
083 123 053 01010011 S
084 124 054 01010100 T
085 125 055 01010101 U
086 126 056 01010110 V
087 127 057 01010111 W
088 130 058 01011000 X
089 131 059 01011001 Y
090 132 05A 01011010 Z
091 133 05B 01011011 [ (left/opening bracket)
092 134 05C 01011100 \ (back slash)
093 135 05D 01011101 ] (right/closing bracket)
094 136 05E 01011110 ^ (caret/circumflex)
095 137 05F 01011111 _ (underscore)
096 140 060 01100000 `
097 141 061 01100001 a
098 142 062 01100010 b
099 143 063 01100011 c
100 144 064 01100100 d
101 145 065 01100101 e
102 146 066 01100110 f
103 147 067 01100111 g
104 150 068 01101000 h
105 151 069 01101001 i
106 152 06A 01101010 j
107 153 06B 01101011 k
108 154 06C 01101100 l
109 155 06D 01101101 m
110 156 06E 01101110 n
111 157 06F 01101111 o
112 160 070 01110000 p
113 161 071 01110001 q
114 162 072 01110010 r
115 163 073 01110011 s
116 164 074 01110100 t
117 165 075 01110101 u
118 166 076 01110110 v
119 167 077 01110111 w
120 170 078 01111000 x
121 171 079 01111001 y
122 172 07A 01111010 z
123 173 07B 01111011 { (left/opening brace)
124 174 07C 01111100 | (vertical bar)
125 175 07D 01111101 } (right/closing brace)
126 176 07E 01111110 ~ (tilde)
127 177 07F 01111111 DEL (delete)


Du musst also nach dem ASCII-Werten "47" und "92" (dezimal) bzw. "2F" und "5C" (HEX) in der Übertragung gucken.....

Grüße,
Cassio
 
Ja, das mache ich. Aber trotzdem bekomme ich den String nicht zerlegt. In der PC-Technik sind / und \ ja Sonder-, bzw. Steuerzeichen. Das spielt aber bei der Übertragung über RS232 keine Rolle, oder?
 
Hallo Ditron!

Ist natürlich "blöd" dass du einmal / und \ in einem String hast....
Schau dir doch mal in der BASCOM-Hilfe den Befehl SPLIT() an.
Vielleicht hilft dir das schon weiter. :)

Mit SPLIT() kannst du einen String nach einem vorher definiertem Zeichen absuchen und in ein Array zerlegen lassen.


Grüße,
Cassio
 
Das es unterschiedliche Zeichen sind, macht Sinn.

Es sind Daten aus einem Flugsimulator, die über ein Programm auf einem zweiten PC an die RS232-Schnittstelle geschickt werden. Bei "A/40\1200/30\275" würde A für die Antwort/Anfang stehen, /40 für den Höhenanzeiger, \1200 für die Flughöhe (1200 Meter), /30 für den Geschwindigkeitsmesser und \275 für 270 km/h. Ich werte nach folgendem Schema aus: was zwischen / \ steht ist ein Anzeiger, was zwischen \ / der Wert. Ich werde heute Abend noch ein, zwei Tests machen und das Programm mal posten.

Vielen Dank für den Tipp mit dem Split-Befehl! Der könnte sehr hilfreich sein!
 
Ich werte nach folgendem Schema aus: was zwischen / \ steht ist ein Anzeiger, was zwischen \ / der Wert.

Hallo Ditron!

Bist du denn auf diese Zeichen angewiesen, weil der Flugsimulator den String so ausgibt?
Oder hast du dir das selber so ausgedacht? :hmmmm:

Wenn du die Zeichen / und \ selbst bestimmen kannst, dann nimm doch einfach grundsätzlich ein Komma.
Anschließend kannst du die einzelnen Werte mit SPLIT() in ein Array teilen und hast alles was du benötigst.

Sollte der Flugsimulator aber die beiden Schrägstriche grundsätzlich so rausgeben, dann klappt das so natürlich nicht.

Grüße,
Cassio
 
Jap, die Daten kommen direkt vom Flugsimulator, die kann ich nicht ändern/beeinflussen. Übrigens ist es nur ein Beispiel, der String kann je nach anzuzeigenen Werten noch länger sein.

Leider kann Split nur ein Zeichen verarbeiten, hilft mir nur bedingt weiter. Einzige Möglichkeit wäre den String einmal nach / und ein weiters mal nach \ zu zerlegen und dann die Arrays gegeneinander vergleichen und auswerten (ist nun schwer zu beschreiben... aber wenn man vom zweiten Array die Länge bestimmt und vom ersten 'abzieht', hat man das erste Array (dazu noch im Wechsel / und \ )).
 
Hallo Ditron!

Nein, dann macht SPLIT() keinen Sinn!
Allerdings würde ich den eigehenden String dann auch nicht erst im Ganzen speichern und später zerlegen, sondern dies gleich bei Dateneingang.

Überprüfe noch mal deine Datenübergabe via RS232!
Da muss ja das ASCII-Zeichen 47d oder 92d mit auftauchen!

Sobald eines der beiden Zeichen via RS232 reinkommt, werden die anschließenden Daten in eine neue Variable gespeichert.
Du kannst dafür ja ein Array nehmen und musst dann nur noch hoch zählen.
Anschließend hast du alle Werte einzeln und kannst sie auch wieder in ein Byte/Word verwandeln.

Das wäre zumindest mein Ansatz.....

Grüße,
Cassio
 
So in der Art habe ich das versucht und dabei verschiedene Wege genutzt: sei es die Abfrage der RS232 über Interrupt oder über Inkey. Dann entsprechende If-Klauseln (zum Teil auch mit Case) um die Daten zu sortieren. Ich werde noch etwas testen und mal ein Listing hier posten. Vielleicht liegt der Fehler ja auch zwischen den Kopfhöhrern...
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)