Empfangsprobleme mit UART?!

Gast #90300
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
Gast #90303
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
Angehängte Dateien:
Gast #90304
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
Gast #90305
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
Gast #90306
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
Gast #90307
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
Angehängte Dateien:

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 22 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.