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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.