Forum: Mikrocontroller und Digitale Elektronik Problem mit serieller Schnittstelle(C-Code Bsp. gesucht)


von Turbo-Pascal (Gast)


Lesenswert?

Hallo Leute,
hocke seit 1 Woche an diesem besch.... Problem.
Ich versuche mit einem Rabbit 3000 uC ein serielles, asynchrones Signal
zu empfangen. Empfange aber immer nur 2 falsche characters und zwar
genau immer 2. Hat irgendjemand eine Idee was an meinem C-Code falsch
ist? Oder hat jemand ein C-Code Beispiel eines seriellen Empfangs(am
besten Rabbit, geht aber auch fuer andern uC). Waere sehr sehr dankbar
fuer Tipps,
Gruss Turbo-Pascal



#define EINBUFSIZE 255        //Ein-/Ausgangsbuffer
#define EOUTBUFSIZE 255
#class static

//************************************************
void SerEReceive(char *s) {

           auto int i;
           serEopen(9600);        //serieller Port Initialisierung
           serErdFree;
           serErdFlush;
       serEflowcontrolOff();
     serEdatabits(PARAM_8BIT);

  while(1) {i=serEread(*s,strlen(*s),20);
      printf("%s*%d*",*s,i);      }

//return-Wert
/*von serEread sind die erfolgreich empfangenen Bytes.*/

        serEclose();
                        }
//************************************************

main () {

          auto char *pointer;
          const char s1[]="Empfangseinheit_Version1";
          pointer=&s1;

          SerEReceive(*pointer);
      }

von Johnny (Gast)


Lesenswert?

Bin mir nicht so ganz sicher, aber vielleicht liegt der Fehler in den
wilden Pointer operationen.

Ich würde das main mal so abändern:

main()
{
  char s1[]="Empfangseinheit_Version1";

  SerEReceive(s1);
}

oder besser so:

main()
{
  char empfangsbuffer[EINBUFSIZE];

  SerEReceive(empfangsbuffer);
}

Der Empfangsbuffer sollte nicht const sein, sonst kann ja nicht
reingeschrieben werden.

Ok, als nächstes die Funktion "SerEReceive". In der Funktion
"serEread" übergibst Du "strlen(*s)" als Parameter. Das ist relativ
schlecht, da im Empfangsbuffer ja noch nichts gescheites drinsteht und
diese Funktion bestimmt nach einem Nullzeichen im String sucht, um
dessen Länge zu bestimmen. In Deiner Ursprünglichen hast Du zwar einen
String definiert gehabt, aber das schien mir nicht sehr sauber gelöst
zu sein.

Dann würde ich mir diese Punkte mal ansehen und wieder schreiben, wenn
Du nicht weiter kommst mit dem aktuellen Stand des Programmes.

von Stefan (Gast)


Lesenswert?

Zu den Pointern wurde schon mal was für Paul geschrieben und das gleiche
Problem ist hier auch vorhanden.
http://www.mikrocontroller.net/forum/read-1-425029.html#425074
http://www.mikrocontroller.net/forum/read-1-425029.html#425088

Nur so am Rande... Der Code für SerEReceive() übersetzt so nicht. Es
fehlt die abschliessende }. Es ist ineffizient, wenn man als
Fragesteller nicht den tatsächlichen Code postet.

von Johnny (Gast)


Lesenswert?

Oh ja stimmt, danke Stefan.

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.