Forum: Mikrocontroller und Digitale Elektronik Empfangsprobleme mit UART?!


von semo (Gast)


Lesenswert?

Hi Leute,

was kann es denn eigentlich für Gründe geben, dass der MC plötzlich
nichts mehr empfangen kann (über UART)?
Habe sowohl an der HW als auch SW nichts geändert, aber trotzdem hat es
den anschein als ob nichts mehr in den MC reinkommt...!

habt ihr vielleicht irgendwelche ideen / vorschläge?


gruß,
semo

von Sebastian (Gast)


Lesenswert?

Kabel richtig dran? MAX232 tot? Einfach mal die +-10V messen, wenn die
nicht mehr anliegen, ist der MAX kaputt. Nach dem Fehler hab ich mal
drei Stunden lang gesucht ...

von semo (Gast)


Lesenswert?

verwende garkeinen MAX zum Empfang!
aber danke für deine antwort..!
;o)

-> MC ist mit einem Handy (S45) verbunden - als Spannungswandler dienen
Z-Dioden!


semo

von semo (Gast)


Angehängte Dateien:

Lesenswert?

ok, alles klar...nehme alles wieder zurück...
-> hatte eine falsche abfrage!
;o)

jedoch bin ich nun auf ein anderes problem gestoßen:
ich schreibe meine empfangenen Zeichen in ein array rein
-> RecBuffer[cn]=UDR;  (char RecBuffer[65])
nun frage ich dieses array mit einer funktion auf einen bestimmten
inhalt ab, aba ich bekomme jedesmal ein andres ergebnis (andere
ausgabe). -> scheint so, als befinden sich ständig andere zeichen im
array obwohl ich jedesmal den zähler (cn) auf null setze wenn die selbe
nachricht reinkommt.
-> kann es sein, dass ich mein empfangsarray "löschen" muss oder so?

bin für jede antwort dankbar,
gruß
semo

von Fiffi (Gast)


Lesenswert?

Hallo semo,

>-> kann es sein, dass ich mein empfangsarray "löschen" muss oder
so?

deine Indexvariable "cn":
- läuft dir über die Puffer-Grenze. (65)
- der Datentyp "char" läuft über bei 255

Du musst in deinen Interrupt z.B. folgendes einfügen:

if(cn > sizeof(RecBuffer))
  cn=0;


(Ich habe den Code nur überflogen ...)

Gruß

Fiffi

von semo (Gast)


Lesenswert?

danke Fiffi,
das wäre natürlich eine erklärung dafür...

obwohl, theoretisch müsste es doch auch klappen wenn ich vorher schon -
bevor wieder etwas erneut empfangen wird - die indexvariable "cn" auf
null setze, oder?
(hab das nämlich so in meinem bisherigen gesamt-code gemacht!
-> wenn ext. Int0, dann setze cn=0, führe einen befehl aus und
empfange...!)

-> oder ist es trotzdem besser ("sicherer") zusätzlich noch deine
abfrage einzubauen?

gruß,
semo

von Fiffi (Gast)


Lesenswert?

Hallo semo,

je länger ich deiner Code betrachte, je mehr Fragezeichen sammeln sich
über meinem Kopf.

1. Ich bin nicht sicher ob du zwei mal das selbe Ergebnis bekommst,
wenn du zwei mal UDR ausliesst.

2. Zeitlich vollkommen unabhängig prüfst du in der Hauptschleife die
Variable "received" ab. Das ist doch nur ein Glücksspiel ...

3. Die Variable "received" hast du nicht als "volatile"
deklariert.

Wenn du eine Variable mit volatile deklarierst, wird die Variable
jedesmal neu gelesen, und nicht in einem Register bis zur nächsten
Verwendung verwahrt ...

4. Wann wird die Variable "rec" beim Einschalten "== 1" ?

Prüfe es im Interrupt:

volatile unsigned char bRecv = 0;

SIGNAL(SIG_UART_RECV)
{
  RecBuffer[cn]=UDR;

  if((RecBuffer[cn] == 0x30) && (bRecv == 0))
    bRecv = 1;

  cn++;
}

int main (void)
{
  for(;;)
  {
    if((rec==1) && (bRecv != 0))
    {
      selectNumber();
      rec=0;
      bRecv = 0
    }
  }
}


Was hat dein Code für eine Funktion ?


Gruß

Fiffi

von semo (Gast)


Angehängte Dateien:

Lesenswert?

sorry, wär natürlich besser gewesen ich hätte gleich den kompletten code
gepostet...

also, hier die Funktion von meinen Code:

Beim ext. Int0 (Schalter On) wird ein Befehl ausgeführt (at+cpbr=99) um
den Telefonbucheintrag vom Handy auszulesen -> Handy antwortet dann wie
folgt: <+CPBR: 99,"06504900111",129,"Test-Max"> -> wenn nun dieser
String empfangen wurde (RecBuffer) dann führe die Funktion
"selectNumber" aus um NUR die Telefonnummer auszulesen (zwischen den
beiden ")und anzurufen! -> wenn Verbindug besteht
(received==0x39)dann...weiter im programm (enable interrupt +
overflow)...!

sodale, hoffe nun ist es etwas klarer; vielleicht hast du ja kurz zeit
um den code mal durchzucheckn...

erstmals danke - d. antworten haben mir jetzt scho ziemlich helfen
können! (wie du sicha scho bemerkt hast, is des programmieren net
unbedingt meine stärke... g)

gruß,
semo

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.