Announcement

Collapse
No announcement yet.

RS232 mit Umsetzer auf RS485

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • RS232 mit Umsetzer auf RS485

    Hi,

    ich hab mit der seriellen Schnittstelle unter c# so meine Probleme.

    Da an der normalen RS232 Schnittstelle ein Umsetzer auf RS485 hängt würde es mir reichen TX, RX, und RTS zu kontrollieren.
    Das Senden krieg ich noch hin, aber Empfang vom µC klappt nicht einwandfrei, da die RTS Leitung zu lange auf High steht bzw gar nicht zurückgesetzt wird oder überhaupt erst gesetzt wird.
    Momentan verwende ich dafür die Klasse SerialPort.
    Kann ich die Klasse irgendwie dazubringen RTS zu aktivieren, wenn Daten gesendet werden und wieder zu deaktivieren, wenn die Übertragung beendet wurde?

  • #2
    So für das RTS Problem hab ich mitlerweile eine Lösung gefunden.

    Aber ich hab da noch was

    In der Routine für den Event DataReceived lass ich einen Zähler mitlaufen, der mitzählt wie viele Pakte (nicht Bytes) empfangen wurden. Nur scheint dieser Zähler nicht zu stimmen.
    Folgende Situation.
    Das Programm schickt kontinuierlich (in einem seperaten Thread) Pakete über die serielle Schnittstelle, der µC schickt seinerseits ein Antwortpaket sobald er ein Paket empfangen hat.
    Auf der µC Seite ist auch ein Paket Zähler eingebaut und der stimmt soweit, nur auf der PC Seite werden viele dieser Antwortpakete anscheinend nicht berücksichtigt. Woran kann das liegen?

    Comment


    • #3
      Hallo Cyberian!


      Dein Problem liegt meiner Meinung nach in folgendem Sachverhalt begründet:
      Das SerialPort-Objekt kennt Deine logische Einheit "Paket" nicht, sondern nur einen Strom aus einzelnen Bytes.
      Ob nun ein Byte zum Paket 1 oder Paket 2 gehört, ist dem SerialPort-Objekt nicht bekannt.
      Das Ereignis "DataReceived" wird immer dann vom Workerthread des SerialPort-Objektes ausgelöst,
      wenn es aktiv die Hardware abfrägt und neue Daten gemeldet bekommt. Es erhält dabei genau die Daten,
      die exakt zu dem Zeitpunkt der Abfrage im Puffer stehen. Dieser Zeitpunkt ist bei einem Multitasking-System nicht
      genau bestimmbar. Deshalb kann das Ereignis "DataReceived" pro logische Einheit "Paket" mehrmals auftreten
      oder eben auch nur ein Ereignis für mehrere Pakete.
      Du mußt Dir schon die Mühe machen und die zurückgelieferten Daten auf die logische Einheit "Paket" zu analysieren
      und gegebenenfalls ein eigenes Ereignis "PackageReceived" auslösen.




      Mit freundlichen Grüßen,


      rednax

      Comment


      • #4
        das hab ich schon soweit angepasst,

        jedes mal wenn des Event ausgelöst wird lese ich alle verfügbaren Bytes aus und speicher sie ab.

        So lange ich nur einen Befehl sende und dessen Antwort auswerte klappts ja.
        Aber sobald ich das Programm selbstständig die Befehle schicken lasse werden mir Antwortpakete unterschlagen, d.h. der Event wird nur bei jedem x-ten Empfang ausgelöst.

        Mal abgesehn davon, dass das c#-programm eh recht "langsam" reagiert. Anstatt 50ms warten dauert es teilweise 150ms.

        Edit:
        Für meine Anwendung bräuchte ich eine blockierende Funktion, da nach jedem gesendeten Befehl auf Antwort gewartet werden muss.
        Zuletzt editiert von Cyberian; 22.03.2007, 12:57.

        Comment

        Working...
        X