USART Terminal Übertragung

OP #1590691
Hallo, wollte mit einem PIC eine Verbindung über USB aufbauen indem ich 
über ein Terminal ein Zeichen sende und dann eine Antwort bekomme.
Allerdings will die Übertragung nicht so recht funktionieren, dass heißt 
bei einer Aufforderung im Terminal funktioniert die Antwort nur 
sporadisch. Ich muss dazu sagen dass ich in diesem Bereich noch neu bin, 
was habe ich falsch gemacht?


void serialInit()
{
// Das SYNC-Bit auf 0 gesetzt, weil hier der SCI-Modus nicht benötigt 
wird
sync = 0;
// Mit dem BRGH-Bit wird der Baudratenbereich ausgewählt, sollte es 
gesetzt
// sein wird der High Speed Bereich aktiviert
brgh = 1;

spbrg = 129; // 9600 BAUD bei 20MHz Taktfrequenz

// Durch das SPEN-Bit wird der Serial Port aktiviert, damit können die 
Pins
// der USART-Schnittstelle konfiguriert werden
spen = 1;

txen = 1; // Der Datentransfer wird aktiviert
cren = 1; // Der Datenempfang wird aktiviert(kontinuierlich)
rcie = 1; //Für Interrupt rcif
}


char ser_getchar(long waittime)
{
   do
   {
// Wurden Daten empfangen, wird das RCIF-Bit gesetzt
        if (rcif)
        {
// Empfangene Daten werden vom RCREG-Register geholt und zurückgegeben
           return(RCREG);
         }
    waittime--;
    } while(waittime==0);  // Wartezeit wird abgezogen
    return(0xff);  // Wenn Timeout, dann wird 0xff zurückgegeben

}

void ser_char(char zeichen)
{
   //int n = 250;
// Wenn der Buffer leer ist und Daten gesendet werden dürfen

   while(!trmt )//&& n==0
   {
  // --n;
       delay_us(10);
   }
   TXREG = zeichen;
   putc(TXREG);
// Daten werden in das TXREG-Register gespeichert,dann automatisch 
gesendet
}

void main()
{

set_tris_a(0b11111111);
set_tris_b(0b11111111);
set_tris_c(0b11111100); // Hier wird RC7 und RC6 als Eingang definiert 
(RCV-Pin)
port_b_pullups(FALSE);

serialInit();  // Initialisierung der RS232-Schnittstelle

   while (1)
   {

     char startwert;
      startwert = ser_getchar(100);

         delay_ms(500);

         switch(startwert)
         {

         case 0x30:ser_char( '!'); break;//Ascii 0

         default: ser_getchar(100); break;
         }
   }

}
Persönliche Seite #1590746
Andi C. schrieb:

> char ser_getchar(long waittime)
> ...
>     waittime--;
>     } while(waittime==0);  // Wartezeit wird abgezogen
              ^^^^^^^^^^^

So lange Schleife drehen, wie noch waittime vorhanden ist, ist

     } while(waittime);  // Wartezeit wird abgezogen


>void ser_char(char zeichen)
> ...
>   TXREG = zeichen;
>   putc(TXREG);

Es kann problematisch sein hier TXREG wieder zu lesen, weil das 
Auswirkungen auf die UART-Hardware haben kann. Besser zur Erzeugung des 
Echos diese Zeile verwenden:

  putc(zeichen);

> void main()

int main()

> ...
>         switch(startwert)
>         {
>           case 0x30:ser_char( '!'); break;//Ascii 0
>           default: ser_getchar(100); break;
                     ^^^^^^^^^^^^^^^^^

Da können Zeichen verloren gehen. Nur eine zentrale Stelle zum Einlesen 
verwenden (die ist vor dem switch vorhanden).

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.