USART RS232 Probleme

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo,

    wer hat Erfahrung mit der Seriellen Schnittstelle des Raspberry Pi Modell B?
    Wie greift man am besten darauf zu?

    Ich möchte ein Enocean Funkmodul TCM320 damit verbinden.
    Das Enocean Modul sendet einfach nacheinander 14 byte los wenn ein Funktelegramm empfangen wurde.
    Wird nur mit RXD/TXD verbunden, keine Steuerleitungen.

    Das klappte mit verschiedenen Boards, Prozessoren und PC einwandfrei und ging immer problemlos.

    Auf dem Pi arbeite ich mit Lazarus und SynaSer des Synapse Projekts,
    da ich Linux Neuling bin und keine Ahnung habe wie man anders auf
    die Schnittstelle zugreifen kann und das Einzige war was ich im Netz dazu gefunden habe.

    Den USART habe ich freigemacht (Einträge in cmdline.txt und inittab entfernt), dazu habe ich viele Tipps gefunden.

    Folgende Zeilen zeigen zwar ein Ergebnis, aber auser dem ersten Übertragenen Zeichen sind alle übrigen nur Mist:

    ser:=TBlockSerial.Create;

    try
    ser.RaiseExcept:=True;
    Ser.Connect('/dev/ttyAMA0');
    ser.config(9600, 8, 'N', 1,false,false); //Konfiguration der Schnittstelle stimmt sicher

    str := ser.RecvBufferStr(14,4000); // hier habe ich schon verschiedene andere Proceduren aus der Unit probiert

    //Hex Ausgabe
    Xstr := '';

    for z := 1 to 20 do
    begin
    Xstr := Xstr + inttohex(byte(str[z]),2);
    end;
    Label1.Caption:= Xstr;

    finally
    ser.free;

    end;

    Weiß jemand was dazu?

    Viele Grüße

  • Wenn das erste Zeichen korrekt, die folgenden aber fehlerhaft dann drängt sich einem der Verdacht auf,
    daß mit den Einstellungen von Start und Stopbit was nicht stimmt.

    Ich weiß zwar nicht wie das bei der RasPI ist, aber ich hatte so einen ähnlichen Fehler mal bei nem anderen Gerät.

  • Hallo Ordoban,

    danke für den Beitrag.

    Mit den Einstellungen funktioniert die Kommunikation mit einem 89S52, einem STM32 und dem PC einwandfrei.
    So ist der USART des TCM 320 auch programmiert.
    Hab aber auch schon andere Einstellungen durchprobiert.

    Denke, dass da irgendwas dazwischen funkt und den Empfang der Daten stört.
    Leider scheint der USART nicht viel eingesetzt zu werden. Habe jedenfalls keine weiteren Beiträge dazu im Internet gefunden.

    Kennt jemand eine allgemeine Dokumentation zum Thema Linux und Verwendung des USART?

    Werd jetzt noch versuchen die RXD/TXD Leitung mit Pull Up Widerstanden zu stützen, die Signal Flanken sind etwas
    krumm, aber auf den STM32 gehe ich auch direkt drauf und es geht.

    Viele Grüße

  • Hallo,

    ich bin auch gerade dabei den UART des Pi in Betrieb zu nehmen. Ich habe es in C gemacht und hier bisher keine Probleme. Würde Dir C denn auch weiterhelfen?

    Viele Grüße
    Philipp

  • Hallo Phillip,

    ja klar :) , hab zwar noch keinen Compiler auf dem Raspberry Pi, aber C ist kein Problem.

    Hast du ein Codebeispiel für mich? Und vielleicht einen Tipp für eine brauchbare IDE?
    Was verwendest du da?

    Danke und viele Grüße

    Walther

  • Hallo Walther,

    ich verwende bisher Programmers Notepad unter Windows. Dort habe ich mir ein paar Skripte reingepackt, die das C File über scp auf den Pi kopieren und dort dann einfach mit dem gcc compilieren (der ist ja wahrscheinlich auch bei Dir schon installiert). Sobald das Projekt mehr als ein C File umfasst wäre make sicherlich sinnvoll.

    Ein Beispiel für die nicht blockierende Nutzung des UART findest Du hier:

    http://www.raspberry-projects.com/pi/programming…/using-the-uart

    Um das Echo abzuschalten kannst Du noch

    options.c_lflag &= ~(ECHO | ECHOE);

    hinzufügen. Wie auch schon im Beispiel angedeutet findet man eigentlich alles was man noch wissen muss unter

    http://pubs.opengroup.org/onlinepubs/007…/termios.h.html

    Viele Grüße
    Philipp

  • Hallo zusammen.

    Mein USART funktioniert jetzt auch mit Lazarus und Synapse!:)

    Die Konfiguration der Schnittstelle muss einfach nur vor dem Ser.Connect
    durchgeführt sein, eigentlich ja klar. Hab soviel rumprobiert, aber das hab ich
    nicht gecheckt.


    begin
    ser:=TBlockSerial.Create;

    try

    ser.config(9600, 8, 'N', 1,false,false);

    ser.RaiseExcept:=True;
    Ser.Connect('/dev/ttyAMA0');
    str := ser.RecvBufferStr(14,4000);
    Xstr := '';
    for z := 1 to 20 do
    begin
    Xstr := Xstr + inttohex(byte(str[z]),2);
    end;

    Label1.Caption:= Xstr;

    finally
    ser.free;

    end;

    end;


    Viele Grüße

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!