TCp-socket und Serielle Schnittstelle – SELFHTML-Forum Forum als Ergänzung zum SELFHTML-Wiki und zur Dokumentation SELFHTML https://forum.selfhtml.org/self TCp-socket und Serielle Schnittstelle Wed, 11 Jan 12 23:26:46 Z https://forum.selfhtml.org/self/2012/jan/12/tcp-socket-und-serielle-schnittstelle/1537871#m1537871 https://forum.selfhtml.org/self/2012/jan/12/tcp-socket-und-serielle-schnittstelle/1537871#m1537871 <p>Hallo allerseits,</p> <p>nach diversen Versuchen und mittlerweile unleserlichem Code muss ich mich mal an euch wenden.</p> <p>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.</p> <p>Den Socket-Aufbau als solchen multithreaded habe ich, ich habe aber Probleme bei der Verwendung der seriellen Schnittstelle.<br> Ich verwende das CPAN:Serialport. "Normales" senden und lesen mit lookfor gehen.</p> <p>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.</p> <p>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 ...</p> <p>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.</p> <p>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?</p> <p>Any ideas für ein sauberes programm design?</p> <p>Vielen Dank bis hierher.</p> <p>Mit freundlichen Grüßen<br> .lw</p> TCp-socket und Serielle Schnittstelle Thu, 12 Jan 12 09:26:12 Z https://forum.selfhtml.org/self/2012/jan/12/tcp-socket-und-serielle-schnittstelle/1537872#m1537872 https://forum.selfhtml.org/self/2012/jan/12/tcp-socket-und-serielle-schnittstelle/1537872#m1537872 <p>Moin Moin!</p> <blockquote> <p>nach diversen Versuchen und mittlerweile unleserlichem Code muss ich mich mal an euch wenden.</p> </blockquote> <p>Hmmm, nicht nur Dein Code ist unleserlich. Dein Posting ist auch kein Musterbeispiel für eine nachvollziehbare Problembeschreibung.</p> <blockquote> <p>Ausgangssituation: Ich habe an einem Linuxrechner per serial-Adapter</p> </blockquote> <p>Was für einen Adapter?</p> <blockquote> <p>einen Mikrocontroller angeschlossen. Der empfängt und sendet Daten</p> </blockquote> <p>Wer? Der µC oder der Linux-Rechner?</p> <blockquote> <p>welche ihm vorher ein oder mehrere TCP-clients gesendet haben.</p> <p>Den Socket-Aufbau als solchen multithreaded habe ich, ich habe aber Probleme bei der Verwendung der seriellen Schnittstelle.<br> Ich verwende das CPAN:Serialport.</p> </blockquote> <p>Was ist ein "CPAN:Serialport"? Meinst Du irgendeines der verschiedenen Packages für die Kommunikation mit der seriellen Schnittstelle, die man <a href="http://search.cpan.org/search?query=serial+port&mode=all" rel="nofollow noopener noreferrer">auf CPAN findet</a>? Wenn ja, welches der 186?</p> <blockquote> <p>"Normales" senden und lesen mit lookfor gehen.</p> </blockquote> <p>Was ist "lookfor"?</p> <blockquote> <p>ABER, nun kommt der Knackpunkt, der TCP-Client sendet in einem eigenen Thread -</p> </blockquote> <p>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.</p> <p>Was Du hier zu basteln versuchst, klingt für mich nach einer großen <a href="http://perldoc.perl.org/functions/select.html" rel="nofollow noopener noreferrer">select</a>-Schleife, die immer das Handle bedient, das gerade Daten anliefern bzw. abnehmen kann. <a href="http://search.cpan.org/perldoc?IO::Select" rel="nofollow noopener noreferrer">IO::Select</a> verpackt select in ein etwas freundlicheres Objekt. <a href="http://search.cpan.org/dist/IO-Event/" rel="nofollow noopener noreferrer">IO::Event</a> verpackt den Rest der Schleife auch noch.</p> <blockquote> <p>Any ideas für ein sauberes programm design?</p> </blockquote> <p>Ja. Bleistift, Radiergummi und viel Papier für einen *PLAN*.</p> <p>Alexander</p> <div class="signature">-- <br> Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so". </div> TCp-socket und Serielle Schnittstelle Sun, 15 Jan 12 13:27:49 Z https://forum.selfhtml.org/self/2012/jan/12/tcp-socket-und-serielle-schnittstelle/1537873#m1537873 https://forum.selfhtml.org/self/2012/jan/12/tcp-socket-und-serielle-schnittstelle/1537873#m1537873 <blockquote> <blockquote> <p>nach diversen Versuchen und mittlerweile unleserlichem Code muss ich mich mal an euch wenden.</p> </blockquote> <p>Hmmm, nicht nur Dein Code ist unleserlich. Dein Posting ist auch kein Musterbeispiel für eine nachvollziehbare Problembeschreibung.</p> </blockquote> <p>ich wüßte nicht wo ich mich unklar ausgedrückt habe.</p> <blockquote> <blockquote> <p>Ausgangssituation: Ich habe an einem Linuxrechner per serial-Adapter</p> </blockquote> <p>Was für einen Adapter?</p> </blockquote> <p>ein USB-Serial-Adpater, einer der mr dev/ttyUSBx zur Verfügung steht, mit FTDI chip. so ein standard teil eben.</p> <blockquote> <blockquote> <p>einen Mikrocontroller angeschlossen. Der empfängt und sendet Daten</p> </blockquote> <p>Wer? Der µC oder der Linux-Rechner?</p> </blockquote> <p>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.</p> <blockquote> <p>Was ist ein "CPAN:Serialport"? Meinst Du irgendeines der verschiedenen Packages für die Kommunikation mit der seriellen Schnittstelle, die man <a href="http://search.cpan.org/search?query=serial+port&mode=all" rel="nofollow noopener noreferrer">auf CPAN findet</a>? Wenn ja, welches der 186?</p> </blockquote> <p>google das erste suchergebniss<br> http://search.cpan.org/~cook/Device-SerialPort-1.04/SerialPort.pm</p> <blockquote> <p>Was ist "lookfor"?</p> </blockquote> <p>eine methode aus der class von serialport.pm</p> <blockquote> <p>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.</p> </blockquote> <p>dann mach einen anderen vorschlag.</p> <blockquote> <p>Was Du hier zu basteln versuchst, klingt für mich nach einer großen <a href="http://perldoc.perl.org/functions/select.html" rel="nofollow noopener noreferrer">select</a>-Schleife, die immer das Handle bedient, das gerade Daten anliefern bzw. abnehmen kann. <a href="http://search.cpan.org/perldoc?IO::Select" rel="nofollow noopener noreferrer">IO::Select</a> verpackt select in ein etwas freundlicheres Objekt. <a href="http://search.cpan.org/dist/IO-Event/" rel="nofollow noopener noreferrer">IO::Event</a> verpackt den Rest der Schleife auch noch.</p> </blockquote> <p>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.<br> vielleicht hättest du ja die güte dies ein wenig auszuholen.</p> <blockquote> <blockquote> <p>Any ideas für ein sauberes programm design?<br> Ja. Bleistift, Radiergummi und viel Papier für einen *PLAN*.</p> </blockquote> </blockquote> <p>genau diesen erhoffte ichmir mit meiner frage hier, anstatt dessen erhalte ich von dir nur schnippische antworten, das kann es doch nicht sein.</p> <p>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.</p> <p>danke.</p> TCp-socket und Serielle Schnittstelle Mon, 16 Jan 12 14:02:37 Z https://forum.selfhtml.org/self/2012/jan/12/tcp-socket-und-serielle-schnittstelle/1537874#m1537874 https://forum.selfhtml.org/self/2012/jan/12/tcp-socket-und-serielle-schnittstelle/1537874#m1537874 <p>Moin Moin!</p> <blockquote> <blockquote> <blockquote> <p>nach diversen Versuchen und mittlerweile unleserlichem Code muss ich mich mal an euch wenden.</p> </blockquote> <p>Hmmm, nicht nur Dein Code ist unleserlich. Dein Posting ist auch kein Musterbeispiel für eine nachvollziehbare Problembeschreibung.</p> </blockquote> <p>ich wüßte nicht wo ich mich unklar ausgedrückt habe.</p> </blockquote> <p>Überall da, wo ich nachfragen mußte. Bedenke bei der Schilderung deines Problems, dass sich der Rest der Welt *AUSSERHALB* Deines Kopfes befindet.</p> <blockquote> <blockquote> <blockquote> <p>Ausgangssituation: Ich habe an einem Linuxrechner per serial-Adapter</p> </blockquote> <p>Was für einen Adapter?</p> </blockquote> <p>ein USB-Serial-Adpater, einer der mr dev/ttyUSBx zur Verfügung steht, mit FTDI chip. so ein standard teil eben.</p> </blockquote> <p>Wer hat denn die Dinger genormt? Marktüblich vielleicht, aber nicht Standard.</p> <blockquote> <blockquote> <blockquote> <p>einen Mikrocontroller angeschlossen. Der empfängt und sendet Daten</p> </blockquote> <p>Wer? Der µC oder der Linux-Rechner?</p> </blockquote> <p>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.</p> <blockquote> <p>Was ist ein "CPAN:Serialport"? Meinst Du irgendeines der verschiedenen Packages für die Kommunikation mit der seriellen Schnittstelle, die man <a href="http://search.cpan.org/search?query=serial+port&mode=all" rel="nofollow noopener noreferrer">auf CPAN findet</a>? Wenn ja, welches der 186?</p> </blockquote> <p>google das erste suchergebniss</p> </blockquote> <p>Klar, Google-Suchergebnisse sind ja auch über lange Zeit konstant. Wie konnte ich das nur übersehen?!</p> <blockquote> <p>http://search.cpan.org/~cook/Device-SerialPort-1.04/SerialPort.pm</p> <blockquote> <p>Was ist "lookfor"?</p> </blockquote> <p>eine methode aus der class von serialport.pm</p> </blockquote> <p>Was denn nun? Device/SerialPort.pm oder serialport.pm? Perl unterscheidet zwischen Klein- und Großschreibung ebenso wie Non-IRC-Deutsch.</p> <blockquote> <blockquote> <p>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.</p> </blockquote> <p>dann mach einen anderen vorschlag.</p> </blockquote> <p>Hab ich. Siehe unten.</p> <blockquote> <blockquote> <p>Was Du hier zu basteln versuchst, klingt für mich nach einer großen <a href="http://perldoc.perl.org/functions/select.html" rel="nofollow noopener noreferrer">select</a>-Schleife, die immer das Handle bedient, das gerade Daten anliefern bzw. abnehmen kann. <a href="http://search.cpan.org/perldoc?IO::Select" rel="nofollow noopener noreferrer">IO::Select</a> verpackt select in ein etwas freundlicheres Objekt. <a href="http://search.cpan.org/dist/IO-Event/" rel="nofollow noopener noreferrer">IO::Event</a> verpackt den Rest der Schleife auch noch.</p> </blockquote> <p>juhu, sorry, das sind nichtssagende einfach lustlos hingeworfene fetzen, mit denen man (ich) wenig anfangen kann,</p> </blockquote> <p>Folge den Links.</p> <blockquote> <p>ich habe da in der richtung auch schon ein wenig unternommen, aber keine ergebnisse erziehlt.<br> vielleicht hättest du ja die güte dies ein wenig auszuholen.</p> </blockquote> <p>select in der Form mit vier Parametern wartet, bis eines von vielen Filehandles bereit ist, Daten abzuliefern bzw. Daten anzunehmen. Dahinter steckt der <a href="http://linux.die.net/man/2/select" rel="nofollow noopener noreferrer">gleichnamige Syscall</a>, den Perl nur geringfügig benutzerfreundlicher weiterreicht.</p> <p>Grundprinzip von Programmen rund um select:</p> <p>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. <a href="http://linux.die.net/man/2/select_tut" rel="nofollow noopener noreferrer">select_tut(2)</a>.</p> <p>Wie gesagt, IO::Select und IO::Event sparen Dir, das ganze select-Gebrösel selbst zu schreiben.</p> <blockquote> <blockquote> <blockquote> <p>Any ideas für ein sauberes programm design?<br> Ja. Bleistift, Radiergummi und viel Papier für einen *PLAN*.</p> </blockquote> </blockquote> <p>genau diesen erhoffte ichmir mit meiner frage hier, anstatt dessen erhalte ich von dir nur schnippische antworten, das kann es doch nicht sein.</p> <p>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.</p> </blockquote> <p>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.</p> <p>Alexander</p> <div class="signature">-- <br> Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so". </div>