www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Empfangsprobleme mit UART?!


Autor: semo (Gast)
Datum:

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

Autor: Sebastian (Gast)
Datum:

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

Autor: semo (Gast)
Datum:

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

Autor: semo (Gast)
Datum:
Angehängte Dateien:

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

Autor: Fiffi (Gast)
Datum:

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

Autor: semo (Gast)
Datum:

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

Autor: Fiffi (Gast)
Datum:

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

Autor: semo (Gast)
Datum:
Angehängte Dateien:

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

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.