Forum: Compiler & IDEs Eingabe-Problem


von Wild (Gast)


Lesenswert?

Hey Leute.
Ich hab leider ein kleines Prolem mit meinem uC. Für einen 
Schülerwettbewerb bin ich grade dabei ein bischen rumzuspielen und 
wollte jetzt über nen Hyperterminal den uC steuern.
1
   char textein[10];
2
   int i;
3
4
   [...]
5
   i=0;
6
   do{
7
      textein[i]=toupper(receivechar());
8
      //sendchar(textein[i]);
9
      //sendstring(textein);
10
   }while(textein[i++]!='\0');
11
   [...]
12
    <Textvergleiche zur Steuerung>
Wen die Funktion receivechar ineressiert:
1
unsigned char receivechar (void)
2
{
3
  unsigned char data;
4
  unsigned char dummy;
5
  while (ir_s0ric == 0);     //Wait for received data
6
    ir_s0ric = 0;          //Clear serial reception flag 
7
  data = u0rbl;         // Get reception data 
8
  dummy = u0rbh;         // Get error 
9
  re_u0c1 = 1;          // Reception enabled 
10
  return data;
11
}
Wenn ich  jetzt aber den Text über den Terminal eingebe , dann überläd 
er mir mein Array und springt erst nach mehreren Eingaben aus der 
do-while raus.

Ich weiß dass das Problem nicht sehr genau beschrieben ist , aber 
vielleicht erkennt jemand den Fehler bevor ich alles mit Screenshots 
etc. poste.

LG Pit
PS: Hardware-Angaben sind nicht möglich , da die "GEILE" Testo-AG keine 
Hardware-angaben mitgegeben hat ;).

von Stefan E. (sternst)


Lesenswert?

Wild schrieb:
> Wenn ich  jetzt aber den Text über den Terminal eingebe ,

Und wie gibst du dort ein '\0' ein, was ja in deiner Schleife 
anscheinend das Ende der Eingabe markieren soll?

PS: Und bitte beim nächsten Mal ein passendes Forum aussuchen.
Bei der Beschreibung zur "Codesammlung" steht doch eindeutig:
"Wenn ihr eigene Programme oder Anleitungen geschrieben habt könnt ihr 
sie hier posten. Fragen werden gelöscht!"

von Wild (Gast)


Lesenswert?

Oh sry für falsches Unterforum...
Ich bin davon ausgegangen , dass am Ende jedes Strings eine Binäre Null 
steht. Jedenfalls war das bei z.b. Konsolen-Applikationen immer so.

von Stefan E. (sternst)


Lesenswert?

Wild schrieb:
> Ich bin davon ausgegangen , dass am Ende jedes Strings eine Binäre Null
> steht. Jedenfalls war das bei z.b. Konsolen-Applikationen immer so.

Welcher String? Im Array speicherst du die Daten ab, wie sie von der 
seriellen Schnittstelle empfangen werden. Wie, wo und wann soll da 
plötzlich automatisch eine Null auftauchen? Du selber willst dann aus 
den empfangenen Daten einen String machen, also bist du selber auch für 
das Platzieren der Null zuständig.

von DirkB (Gast)


Lesenswert?

Also liest du solange bis ein '\n' kommt und ersetzt dieses durch eine 
'\0'.
Wenn ein '\r' kommt, kannst du das verwerfen.

von Wild (Gast)


Lesenswert?

Hmmm.

> Wie, wo und wann soll da
> plötzlich automatisch eine Null auftauchen? Du selber willst dann aus
> den empfangenen Daten einen String machen, also bist du selber auch für
> das Platzieren der Null zuständig.

Hätte ich mir denken können ;).

Und zu:
> Also liest du solange bis ein '\n' kommt und ersetzt dieses durch eine
> '\0'.
Das funktioniert genauso gut... Soll wenn ich über den Hyperterminal 
etwas abschicke aufomatisch ein LF dahinter stehen?

MfG Wild

von Karl H. (kbuchegg)


Lesenswert?

Wild schrieb:

>> Also liest du solange bis ein '\n' kommt und ersetzt dieses durch eine
>> '\0'.
> Das funktioniert genauso gut... Soll wenn ich über den Hyperterminal
> etwas abschicke aufomatisch ein LF dahinter stehen?

Das hängt von der genauen Konfiguration des Hyperterminals ab. Bei jedem 
Terminalprogramm kann man einstellen, wie es einen Druck auf die Return 
Taste behandeln soll.

von Wild (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Das hängt von der genauen Konfiguration des Hyperterminals ab. Bei jedem
> Terminalprogramm kann man einstellen, wie es einen Druck auf die Return
> Taste behandeln soll.

Das werd' ich mir gleich bald mal ansehen.
Meine nächste Idee wäre einen Interrupt in die Warteschleife der 
"receivechar" einzubauen,wobei ich mit einem Timer arbeiten könnte. 
Jetzt müsste ich wissen wie lange das Senden eines chars dauert. (Bei 
baudrate von 19200)

Ich glaube mal was aufgeschneppt zu haben , dass das 19200 bits pro 
sekunde sind , wobei nach jedem char (1Byte) ein kontrollbit gesendet 
wird.
=> 1sek / (19200 / 9) = 0,0004687 ~ 0,00047sek pro char.
Is das so richtig ? Oder hab ich mal wieder nen fundamentalen Fehler 
gemacht ;)

Lg Wild

von Andreas B. (Gast)


Lesenswert?

Wild schrieb:
> Ich glaube mal was aufgeschneppt zu haben , dass das 19200 bits pro
> sekunde sind , wobei nach jedem char (1Byte) ein kontrollbit gesendet
> wird.

Das kommt auf die Konfiguration an:

* ein Startbit
* einstellbare Anzahl an Datenbits (meist 5 bis 9 Bits unterstützt)
* Paritätsbit, falls nicht deaktiviert
* einstellbare Anzahl an Stopbits (auch nicht-ganzzahlig, 1,5 etwa)

Meistens wird 8N1 benutzt, heißt 8 Datenbits, N=kein Paritätsbit, 1 
Stopbit. Macht also insgesamt (inkl. Startbit) 10 Bitzeiten für ein 8 
Bit Byte.

von DirkB (Gast)


Lesenswert?

Und dann solltest du ein Bit auch mehr als einmal abtasten.

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.