Lars W.: TCp-socket und Serielle Schnittstelle

Hallo allerseits,

nach diversen Versuchen und mittlerweile unleserlichem Code muss ich mich mal an euch wenden.

Ausgangssituation: Ich habe an einem Linuxrechner per serial-Adapter einen Mikrocontroller angeschlossen. Der empfängt und sendet Daten welche ihm vorher ein oder mehrere TCP-clients gesendet haben.

Den Socket-Aufbau als solchen multithreaded habe ich, ich habe aber Probleme bei der Verwendung der seriellen Schnittstelle.
Ich verwende das CPAN:Serialport. "Normales" senden und lesen mit lookfor gehen.

ABER, nun kommt der Knackpunkt, der TCP-Client sendet in einem eigenen Thread - ich lasse ihn da auch auf Serial schreiben. Nun habe ich einen unabhängigen 2. (eigentlich 3. [main + 1xtcp + 1xserial]) thread in dem ich von serial einlese (da lookfor m.e. blockiert) und ausserdem sollen die tcp clients noch andere daten senden können, die nichts mit der serial zu tun haben.

ich habe es schon über zwei variablen probiert, die sich gegenseitig bei read und write verriegeln, aber das führt bei einem blockierten lookfor nicht so richtig weit ...

weiterhin sollen alle clients immer alle infos aus der seriellen abfrage erhalten, während andere abgefragte daten in dem TCP-Thread 'privat' bleiben sollen. Ich habe es auch noch nicht ein client-referenziertes Array oder Hash zu erstellen in dem die Daten so stehen das ich per for/foreach drankomme.

in .Net würde ich mir ne Klasse Clients erstellen und ne List (of clients) und gut ... wie geht das in Perl? Oder denke ich da etwas zu kompliziert?

Any ideas für ein sauberes programm design?

Vielen Dank bis hierher.

Mit freundlichen Grüßen
.lw

  1. Moin Moin!

    nach diversen Versuchen und mittlerweile unleserlichem Code muss ich mich mal an euch wenden.

    Hmmm, nicht nur Dein Code ist unleserlich. Dein Posting ist auch kein Musterbeispiel für eine nachvollziehbare Problembeschreibung.

    Ausgangssituation: Ich habe an einem Linuxrechner per serial-Adapter

    Was für einen Adapter?

    einen Mikrocontroller angeschlossen. Der empfängt und sendet Daten

    Wer? Der µC oder der Linux-Rechner?

    welche ihm vorher ein oder mehrere TCP-clients gesendet haben.

    Den Socket-Aufbau als solchen multithreaded habe ich, ich habe aber Probleme bei der Verwendung der seriellen Schnittstelle.
    Ich verwende das CPAN:Serialport.

    Was ist ein "CPAN:Serialport"? Meinst Du irgendeines der verschiedenen Packages für die Kommunikation mit der seriellen Schnittstelle, die man auf CPAN findet? Wenn ja, welches der 186?

    "Normales" senden und lesen mit lookfor gehen.

    Was ist "lookfor"?

    ABER, nun kommt der Knackpunkt, der TCP-Client sendet in einem eigenen Thread -

    Ich steige hier mal aus. Threads sind in Perl nicht immer die beste Idee. Nicht alle Module sind threadsafe, und oft sind Threads auch gar nicht nötig.

    Was Du hier zu basteln versuchst, klingt für mich nach einer großen select-Schleife, die immer das Handle bedient, das gerade Daten anliefern bzw. abnehmen kann. IO::Select verpackt select in ein etwas freundlicheres Objekt. IO::Event verpackt den Rest der Schleife auch noch.

    Any ideas für ein sauberes programm design?

    Ja. Bleistift, Radiergummi und viel Papier für einen *PLAN*.

    Alexander

    --
    Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
    1. nach diversen Versuchen und mittlerweile unleserlichem Code muss ich mich mal an euch wenden.

      Hmmm, nicht nur Dein Code ist unleserlich. Dein Posting ist auch kein Musterbeispiel für eine nachvollziehbare Problembeschreibung.

      ich wüßte nicht wo ich mich unklar ausgedrückt habe.

      Ausgangssituation: Ich habe an einem Linuxrechner per serial-Adapter

      Was für einen Adapter?

      ein USB-Serial-Adpater, einer der mr dev/ttyUSBx zur Verfügung steht, mit FTDI chip. so ein standard teil eben.

      einen Mikrocontroller angeschlossen. Der empfängt und sendet Daten

      Wer? Der µC oder der Linux-Rechner?

      der linux rechner empfängt die tcp daten und sendet diese per serial an den µC weiter, der empfängt diese und sendet daten zurück, und alles geht retour.

      Was ist ein "CPAN:Serialport"? Meinst Du irgendeines der verschiedenen Packages für die Kommunikation mit der seriellen Schnittstelle, die man auf CPAN findet? Wenn ja, welches der 186?

      google das erste suchergebniss
      http://search.cpan.org/~cook/Device-SerialPort-1.04/SerialPort.pm

      Was ist "lookfor"?

      eine methode aus der class von serialport.pm

      Ich steige hier mal aus. Threads sind in Perl nicht immer die beste Idee. Nicht alle Module sind threadsafe, und oft sind Threads auch gar nicht nötig.

      dann mach einen anderen vorschlag.

      Was Du hier zu basteln versuchst, klingt für mich nach einer großen select-Schleife, die immer das Handle bedient, das gerade Daten anliefern bzw. abnehmen kann. IO::Select verpackt select in ein etwas freundlicheres Objekt. IO::Event verpackt den Rest der Schleife auch noch.

      juhu, sorry, das sind nichtssagende einfach lustlos hingeworfene fetzen, mit denen man (ich) wenig anfangen kann, ich habe da in der richtung auch schon ein wenig unternommen, aber keine ergebnisse erziehlt.
      vielleicht hättest du ja die güte dies ein wenig auszuholen.

      Any ideas für ein sauberes programm design?
      Ja. Bleistift, Radiergummi und viel Papier für einen *PLAN*.

      genau diesen erhoffte ichmir mit meiner frage hier, anstatt dessen erhalte ich von dir nur schnippische antworten, das kann es doch nicht sein.

      ich habe mich bemüht mein problem klar und deutlich zu schildern, man mag mir verzeiehen wenn das nicht 100%ig geklappt hat, dann erwarte ich da hinweise drauf und kein runtergemache.

      danke.

      1. Moin Moin!

        nach diversen Versuchen und mittlerweile unleserlichem Code muss ich mich mal an euch wenden.

        Hmmm, nicht nur Dein Code ist unleserlich. Dein Posting ist auch kein Musterbeispiel für eine nachvollziehbare Problembeschreibung.

        ich wüßte nicht wo ich mich unklar ausgedrückt habe.

        Überall da, wo ich nachfragen mußte. Bedenke bei der Schilderung deines Problems, dass sich der Rest der Welt *AUSSERHALB* Deines Kopfes befindet.

        Ausgangssituation: Ich habe an einem Linuxrechner per serial-Adapter

        Was für einen Adapter?

        ein USB-Serial-Adpater, einer der mr dev/ttyUSBx zur Verfügung steht, mit FTDI chip. so ein standard teil eben.

        Wer hat denn die Dinger genormt? Marktüblich vielleicht, aber nicht Standard.

        einen Mikrocontroller angeschlossen. Der empfängt und sendet Daten

        Wer? Der µC oder der Linux-Rechner?

        der linux rechner empfängt die tcp daten und sendet diese per serial an den µC weiter, der empfängt diese und sendet daten zurück, und alles geht retour.

        Was ist ein "CPAN:Serialport"? Meinst Du irgendeines der verschiedenen Packages für die Kommunikation mit der seriellen Schnittstelle, die man auf CPAN findet? Wenn ja, welches der 186?

        google das erste suchergebniss

        Klar, Google-Suchergebnisse sind ja auch über lange Zeit konstant. Wie konnte ich das nur übersehen?!

        http://search.cpan.org/~cook/Device-SerialPort-1.04/SerialPort.pm

        Was ist "lookfor"?

        eine methode aus der class von serialport.pm

        Was denn nun? Device/SerialPort.pm oder serialport.pm? Perl unterscheidet zwischen Klein- und Großschreibung ebenso wie Non-IRC-Deutsch.

        Ich steige hier mal aus. Threads sind in Perl nicht immer die beste Idee. Nicht alle Module sind threadsafe, und oft sind Threads auch gar nicht nötig.

        dann mach einen anderen vorschlag.

        Hab ich. Siehe unten.

        Was Du hier zu basteln versuchst, klingt für mich nach einer großen select-Schleife, die immer das Handle bedient, das gerade Daten anliefern bzw. abnehmen kann. IO::Select verpackt select in ein etwas freundlicheres Objekt. IO::Event verpackt den Rest der Schleife auch noch.

        juhu, sorry, das sind nichtssagende einfach lustlos hingeworfene fetzen, mit denen man (ich) wenig anfangen kann,

        Folge den Links.

        ich habe da in der richtung auch schon ein wenig unternommen, aber keine ergebnisse erziehlt.
        vielleicht hättest du ja die güte dies ein wenig auszuholen.

        select in der Form mit vier Parametern wartet, bis eines von vielen Filehandles bereit ist, Daten abzuliefern bzw. Daten anzunehmen. Dahinter steckt der gleichnamige Syscall, den Perl nur geringfügig benutzerfreundlicher weiterreicht.

        Grundprinzip von Programmen rund um select:

        Handles öffnen, d.h. in Deinem Fall TCP-Socket und seriellen Port. Handles in Strukturen für select stopfen. select aufrufen und abwarten, bis select ein Ergebnis liefert. Nachsehen, ob Fehler, Signal, oder echtes Ergebnis, entsprechend verfahren -- Abbruch, nochmal versuchen, oder bereites Handle ermitteln. Daten aus dem Handle in einen Puffer lesen bzw. aus einem Puffer ins Handle schreiben. Ggf. Daten weiter verarbeiten. Schleife zum select-Aufruf. Siehe z.B. select_tut(2).

        Wie gesagt, IO::Select und IO::Event sparen Dir, das ganze select-Gebrösel selbst zu schreiben.

        Any ideas für ein sauberes programm design?
        Ja. Bleistift, Radiergummi und viel Papier für einen *PLAN*.

        genau diesen erhoffte ichmir mit meiner frage hier, anstatt dessen erhalte ich von dir nur schnippische antworten, das kann es doch nicht sein.

        ich habe mich bemüht mein problem klar und deutlich zu schildern, man mag mir verzeiehen wenn das nicht 100%ig geklappt hat, dann erwarte ich da hinweise drauf und kein runtergemache.

        Oh, entschuldige bitte, ich hab Deine kostenpflichtige Platinum-Support-Karte nicht gesehen. Dann darfst Du natürlich Deine Frage beliebig hinrotzen und erhältst binnen fünf Minuten eine ausgearbeitete Lösung.

        Alexander

        --
        Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".