dumme Frage

Gast #407423
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
Gast #407426
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);
         }
Gast #407427
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.
Gast #407428
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
Gast #407429
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.
#407430
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 );
         }

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren