mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Peter Fleury Uart Problem


Autor: Tommy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
habe folgendes Problem mit der UART von Peter Fleury! Ich verwende seine 
Uart um mit einem GSM Modul zu kommunizieren. Dazu möchte ich die 
empfangenen Zeichen in einem String speichern. Dafür habe ich folgenden 
Code gefunden.
uint8_t uart_getc_wait()
{
  unsigned int c;

  do
  {  
  c=uart_getc();
  }while( c== UART_NO_DATA );

  return (uint8_t)c;
}

void uart_gets_r( char* Buffer, uint8_t MaxLen)
{
  uint8_t NextChar;
  uint8_t StringLen = 0;

  NextChar = uart_getc_wait();

  if(NextChar!='\0')
  while( NextChar != '\r' && StringLen < MaxLen - 1)
  {
    *Buffer++ = NextChar;
    StringLen++;
    NextChar = uart_getc_wait();
  }
  *Buffer = '\0';
}

Wenn ich jetzt ein AT Kommando zum GSM Modul schicke kann es passieren, 
dass kein Zeichen zurückkommt und das Programm kommt aus der uart_gets_r 
Funktion nicht mehr raus! Verbinde ich die UART mit dem Hyperterminal 
sehe ich, das der Befehl aber vom GSM Modul rausgeschickt wurde.
Habe dadurch ein Hardware Handshake eingebaut bzw. wenn ich ein Zeichen 
sende geht CTS auf High und gesendet wird nur, wenn RTS auf Low ist.
Aber das Problem besteht weiterhin.
Hat vielleicht jemand eine Idee?

Autor: Schorsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi,

ich kenn jetzt die Lib nicht aber ich würde vermuten dass du nen 
Rx-Interrupt mit entsprechender ISR für den RS232 Receive brauchst.

Gruss,
Georg.

Autor: Tommy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, die ist Interrupt gesteuert!
Habe aber jetzt folgendes rausgefunden:
Bevor ich in die while(1) Schleife reinkomme initialisiere ich uart und 
uart1.

Dann läuft jetzt das Programm einmal durch und beim zweiten mal belibt 
er an der genannten Stelle hängen!
Wenn ich aber im zweiten Durchlauf vorher in der While(1) Schleife noch 
mal die Uarts initialisiere, hängt sich das Programm später auf!
Was soll man davon halten?

Autor: Tommy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich zum Beispiel AT\r zum GSM Modul schicken will mache ich 
folgendes!

const char gsm_at_check[]  ={"at\r"};

ich verwende diese Funktion:
put_gsm_cmd(gsm_at_check,gsm_cmd,gsm_result,MaxLen);

void wait_until_r()
{  
  unsigned int c=0;
  while(c!='\r')
  {
    c=uart_getc();
  }
}
void wait_until_n()
{  
  unsigned int c=0;
  while(c!='\n')
  {
    c=uart_getc();
  }
}
void put_gsm_cmd(const char *gsm_net_check,char *gsm_cmd, char *gsm_result, uint8_t MaxLen)
{
    uart_puts(gsm_net_check);
    uart_gets_r( gsm_cmd,MaxLen);
    wait_until_r();
    wait_until_n();
    uart_gets_r( gsm_result,MaxLen);
    wait_until_n();
  
    uart1_puts(gsm_cmd); // hier gebe ich es an der anderen Uart aus
    uart1_puts(gsm_result);
}

Als Antwort vom GSM Modul erhält man <\r><\n>Code<\r><\n>

Kann es sein, dass durch den Interrupt ein einzelnes Zeichen Verloren 
gehen kann? Also dass dies eine schlechte Lösung ist. Wäre es besser 
z.B. zuserst bis zum K vom OK zu warten? Aber dann würde das Programm 
schon weiterlaufen obwohl noch ein Zeichen über die UART gesendet wird, 
das könnte dann doch spätere Komplikationen mit sich bringen!

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.