PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Perl: Problem mit der Kommunikation zu einem seriellen Port



adiuva
05-12-2012, 16:08
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:

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

Molaf
12-12-2012, 10:11
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

adiuva
15-12-2012, 19:59
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.

Molaf
16-12-2012, 09:44
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.