www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik dumme Frage


Autor: Paul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hei Leute,

ich versuche gerade mit meinem Mikrocontroller(rabbit 3000) zu
Testzwecken nur eine dauernde Folge von "A"'s ueber die serielle
Schnittstelle zu senden. Wenn ich das Signal aber messe, wiederholt
sich das Signal aber nicht ungefaer alle 10 Bits. Wie kann das sein,
normalerweise werden doch die Daten Byte fuer Byte in ASCII-Codierung
gesendet??? Bin voellig ratlos. Weiss jemand was darueber???

VG Paule

Autor: Torsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich dachte dumme Fragen gibts nicht ? ;)

Kannste mal den Quellcode posten? Das kann sonst alles mögliche sein...

Autor: Detlef _a (detlef_a)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>Es gibt keine dummen Fragen, nur dumme Frager.<<

Sorry, konnte ich an der Stelle nicht vorbeiziehen lassen.

Cheers
Detlef

Autor: Paule (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#define DINBUFSIZE 127
#define DOUTBUFSIZE 127
#class static

//************************************************
void SerDwrite(int *s) {

      serDopen(9600);
    serDrdFree;
    serDrdFlush;
    serDwrFree;
    serDwrFlush;
    serDflowcontrolOff();
    serDdatabits(PARAM_8BIT);

    while(1) {serDwrite(*s,11);}
      serDclose(); Und hier schreibt er keine As
                  }
//************************************************

main () {

          auto int *pointer;
          const char s1[11]="AAAAAAAAAAA";
          pointer=&s1;

          SerDwrite(*pointer);
         }

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich erwarte, dass der Compiler mindestens drei Warnungen ausgespuckt
hat. Diese Warnungen bzgl. inkompatiblen Typen hängen ursächlich mit
der Nichtfunktion des Programms zusammen. Es lohnt sich den Warnungen
nachzugehen.

Beim angegebenen Code fehlen die Includedateien. Insbesondere der
Prototyp von serDwrite() ist interessant.

Mit while(1) baust du eine Endlosschleife. Die Stelle mit deinem
Kommentar "Und hier schreibt er keine As" wird nie erreicht.

Autor: Paule (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke fuer die Antwort Stefan,
aber der Compiler hat nur eine Warnung ausgespuckt nämlich, dass die
Initialisierung "AAAAAAAAAAA" gleich groß ist wie das array s1 und so
keine 0 Terminierung stattfindet. MAcht das was? Includen brauche ich
hier nix, weil ich mit Dynamic C von Z-world arbeite(ist leicht
abgewandelte Version von Standard C).
Weiss jemand, was Stefan mit inkompatiblen Typen meint. Was soll hier
inkompatibel sein???
VG Paule

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Diese drei Zeilen sind in Standard C fischig. Und ich denke deine C
Version unterscheidet sich bei den Pointern nicht, musst du aber
nachsehen.

while(1) {serDwrite(*s,11);}   // 1
pointer=&s1;                   // 2
SerDwrite(*pointer);           // 3

1:
s ist laut Argumentliste der aufrufenden Funktion ein int *. *s ist
somit ein int. Es sträuben sich einfach die Nackenhaare des
Programmierers, weil man den Aufruf üblicherweise mit Pointerübergabe
programmiert. Daher auch die Frage nach dem Prototypen.

2:
pointer ist ein int *. S1 ist ein char []. &s1 ist somit ein char **
und die Zuweisung an pointer ist nicht OK. Ich denke es ist char
*pointer = s1; oder char * pointer = &s1[0]; gemeint.

3:
Gleicher Fall wie 1 nur dass man weiss, dass der Typ vom Argument nicht
passt.

Das fehlende Nullbyte bei s1 ist möglicherweise unkritisch (aber sehr
unschön), jenachdem  wie serDwrite() programmiert ist. Das zweite
Argument 11 verhindert möglicherweise einen ansonsten vorprogrammierten
 Bufferoverflow.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum so kompliziert mit dem Zwischenpointer?
Ich weiss schon, das war weil dir der Compiler das sonst
nicht akzeptiert haette. Du hast das aber falsch gelöst
(wie Stefan bereits ausgeführt hat).

void SerDwrite(const char *s) {

    serDopen(9600);
    serDrdFree;
    serDrdFlush;
    serDwrFree;
    serDwrFlush;
    serDflowcontrolOff();
    serDdatabits(PARAM_8BIT);

    while(1) {serDwrite(s,11);}
      serDclose(); Und hier schreibt er keine As
                  }
//************************************************

main () {
          const char s1[] = "AAAAAAAAAAA";
          SerDwrite( s1 );
         }

Autor: Paule (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Stefan und Karl Heinz Buchegger,

es tut jez!!!!!! Hattet recht mit den Pointern, daran lags.

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.