mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik USART Terminal Übertragung


Autor: Andi C. (spex)
Datum:

Bewertung
0 lesenswert
nicht 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;
         }
   }

}

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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).

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.