Forum: Mikrocontroller und Digitale Elektronik Peter Fleury Uart Problem


von Tommy (Gast)


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.
1
uint8_t uart_getc_wait()
2
{
3
  unsigned int c;
4
5
  do
6
  {  
7
  c=uart_getc();
8
  }while( c== UART_NO_DATA );
9
10
  return (uint8_t)c;
11
}
12
13
void uart_gets_r( char* Buffer, uint8_t MaxLen)
14
{
15
  uint8_t NextChar;
16
  uint8_t StringLen = 0;
17
18
  NextChar = uart_getc_wait();
19
20
  if(NextChar!='\0')
21
  while( NextChar != '\r' && StringLen < MaxLen - 1)
22
  {
23
    *Buffer++ = NextChar;
24
    StringLen++;
25
    NextChar = uart_getc_wait();
26
  }
27
  *Buffer = '\0';
28
}

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?

von Schorsch (Gast)


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.

von Tommy (Gast)


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?

von Tommy (Gast)


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);
1
void wait_until_r()
2
{  
3
  unsigned int c=0;
4
  while(c!='\r')
5
  {
6
    c=uart_getc();
7
  }
8
}
9
void wait_until_n()
10
{  
11
  unsigned int c=0;
12
  while(c!='\n')
13
  {
14
    c=uart_getc();
15
  }
16
}
17
void put_gsm_cmd(const char *gsm_net_check,char *gsm_cmd, char *gsm_result, uint8_t MaxLen)
18
{
19
    uart_puts(gsm_net_check);
20
    uart_gets_r( gsm_cmd,MaxLen);
21
    wait_until_r();
22
    wait_until_n();
23
    uart_gets_r( gsm_result,MaxLen);
24
    wait_until_n();
25
  
26
    uart1_puts(gsm_cmd); // hier gebe ich es an der anderen Uart aus
27
    uart1_puts(gsm_result);
28
}

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!

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.