Forum: Mikrocontroller und Digitale Elektronik serielle Übertragung


von Niki Hammler (Gast)


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

von Jonas Diemer (Gast)


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)...

von Lothar (Gast)


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

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
Noch kein Account? Hier anmelden.