www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik serielle Übertragung


Autor: Niki Hammler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich weiss, es könnte etwas OT sein, aber es gehört zur seriellen 
Übertragung.

Also falls es wer zu "OT" findet nicht weiterlesen und nicht aufregen ;)

Und zwar kann ich keine Zeichen am PC empfangen, die über den AVR 
geschickt wurden, wenn z.b. das Zeichen hex 0 haben.
Ich hab alles probiert, sowohl in HyperTerminal als auch in Linux, aber 
keine Chance.
Wenn ich z.B. folgendes mache:

unsigned char i;
unsigned char tx[5];
tx[0] = '[';
tx[1] = 0x00;
tx[2] = 0x01;
tx[3] = 0x02;
tx[4] = ']';
for(i=0;i<5;i++)
{
  while(!bit_is_set(UCSRA, UDRE));
  outp(tx[i], UDR);
}


Dann erhalte ich auf PC Seite einfach nur "[]", ich sollte aber, wenn 
ich mir das in eine Datei mitschreibe (HyperTerminal) und die Datei dann 
HEX betrachte ca so aussehen:
5B 00 01 02 5D
Es steht aber ganz einfach nur
5B 5D
drinnen.

Ich nehme an, dass es daran liegt, dass das Steuerzeichen sind. Fehlt 
eine Einstellung am AVR oder am PC???

Ich habe 9600 Baud, 1 Stoppbit, no parity und 8 data bits gewählt.
Ich hab unter Linux schon mit stty herumgespielt, auch keine Besserung.
Was ist das für eine Terminal einstellung??
(mit cat /dev/ttyS0 geht es nur begrenzt, d.h. wie oben beschrieben, 
aber erst nachdem mit stty umgestellt wurde).


2.) Wie schreibe ich am besten so ein Empfangsprogramm?

So auf die Art scheint es NICHT zu gehen:

[...]
while(1)
{
  if(read(serial_fd, (unsigned char*)byte, 1))
    printf("0x%2X ", byte);
}

Wie mach ich das damit das funktioniert? Gibt es irgendwo DOCS etc??

Vielen Dank

Niki

Autor: Jonas Diemer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1) nun, mag das vielleicht daran liegen, dass die zeichen als acii 
interpretiert werden?

im ascii gilt:

0x00 = NUL
0x01 = SOH
0x02 = STX

das sind alles irgendwelche steuerzeichen. so ist z.B, 0x06=ACK 
(acknowledge) und 0x0a=LF (line feed)...

Autor: Lothar (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es ligt mit Sicherheit daran, das die Zeichen vom Terminalprogramm als 
Steuerzeichen interpretiert werden und "geschluckt" werden.

Probiere doch mal folgenden Code:

unsigned char i;
unsigned char tx[5];
tx[0] = '[';
tx[1] = 0x31;
tx[2] = 0x32;
tx[3] = 0x33;
tx[4] = ']';
for(i=0;i<5;i++)
{
while(!bit_is_set(UCSRA, UDRE));
 outp(tx[i], UDR);
 }

Wenn das geht, habe ich recht.
Terminalprogramme wie Hyperterm etc. sind halt für den Benutzerdialog in 
ASCII-Zeichen gedacht. ( Einstellung z.B. VT100 ).
Das Terminalprogramm muss für die Übertragung von Steuerzeichen auf den 
reinen Binärmodus umgestellt werden. Wie das unter Linux geht, musst Du 
nachlesen.

- Lothar

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.