Eingabe-Problem

Gast #2157692
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 ;).
#2157704
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!"
#2157766
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.
Gast #2161863
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
#2161901
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.
Gast #2163890
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
Gast #2164309
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren