Anzeige:
Ergebnis 1 bis 4 von 4

Thema: Perl: Problem mit der Kommunikation zu einem seriellen Port

  1. #1
    Registrierter Benutzer
    Registriert seit
    06.09.2010
    Beiträge
    2

    Angry Perl: Problem mit der Kommunikation zu einem seriellen Port

    Hallo zusammen,

    ich habe ein grosses Problem mit der Kommunikation mit einem seriellem Port. Und zwar würde ich gerne AT-Kommandos an ein Modem absetzen und die Antwort zurück erhalten. Das Senden des Kommandos funktioniert einwandfrei, aber die Antwort landet entweder nicht mal mehr auf meinem PC oder ich lese sie einfach nicht korrekt aus. Hier ist erstmal der Code:
    Code:
        use IO::Socket;
        use IO::Select;
    
        my $COMport=33;
    
        while (1)
        {
            #open Port or die if blocked / wrong port
            if (!open( PORT, "+>\\\\.\\COM$COMport" ))
                {  
                    die ("Can't open COM$COMport");
                }
                PORT->autoflush(1);
                PORT->flush();
                print "\nEnter AT command:";
                my $ATcmd=<STDIN>;
                chomp($ATcmd);         # remove CRLF
                $ATcmd =~ s/^\s+//;        # remove leading space
                $ATcmd =~ s/\s+$//;            # remove trailing space
                print "Sending: '$ATcmd'\n";
                print PORT $ATcmd . "\r\n";
            
                print "reading\n";
                #Reading the response
                while (my $ret=<PORT>)
                {   
                    print $ret;
                    if ($ret=~/^OK/ || $ret=~/^ERROR/) { last}
                }
                close(PORT);
        }
    
        print "done!";
    Das Kommando kommt am Momdem an und funktioniert (getestet indem ich mit Putty direkt auf's Modem verbunden habe). Sobald das Script in der while (my $ret=<PORT>) landet, bleibt es stecken weil $ret=undef. Ich habe jetzt schon den halben Tag Google gewälzt, aber die meisten Antworten verweisen auf das Perl-Modul Win32::Serialport welches ich nicht benutzen möchte da das fertige Programm auf möglichst vielen Maschinen mit Default Perl-Installation laufen sollte.
    Habe auch schon einige andere Varianten ausprobiert (mit read() und sysread() ) welche aber das gleiche Ergebnis bringen.

    Hat jemand von euch vielleicht noch eine gute Idee oder einen Link?

    Vielen Dank schonmal!
    Stefan

  2. #2
    Registrierter Benutzer Avatar von Molaf
    Registriert seit
    15.11.2004
    Beiträge
    127
    Hallo,

    ich habe das auf ähnliche Weise erfolglos versucht.

    Was allerdings funktioniert ist ein Zugriff mit Win32::SerialPort (oder Device::SerialPort unter Linux).

    Allerdings funktionieren dort nur COM-Ports bis 9, ab zweistellig kriege ich zumindest keine Verbindung mehr hin.

    Gruß,
    Molaf

  3. #3
    Registrierter Benutzer
    Registriert seit
    06.09.2010
    Beiträge
    2
    Das Modul ist mir bekannt, funktioniert auch wunderbar mit 2-stelligen ports. Aber ich bin auf der Suche nach einer Lösung die nicht die Installation eines Moduls auf X PCs benötigt.

  4. #4
    Registrierter Benutzer Avatar von Molaf
    Registriert seit
    15.11.2004
    Beiträge
    127
    Schreib das Programm fertig und packe es beispielsweise mit PAR zu einem Executable zusammen.
    Dann musst Du das Modul nicht installieren, nicht einmal Perl, und das Programm funktioniert auf der gleichen Betriebssystemfamilie, wo es auch gepackt wurde.

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •