Forum: Mikrocontroller und Digitale Elektronik USART Terminal Übertragung


von Andi C. (spex)


Lesenswert?

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;
         }
   }

}

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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

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.