Schrift
[thread]7370[/thread]

nochmal rs232: daten empfangen



<< >> 5 Einträge, 1 Seite
popcorn5
 2005-10-19 12:29
#59015 #59015
User since
2003-09-24
60 Artikel
BenutzerIn
[default_avatar]
Hallo,

auf meinen erste frage wusste wohl niemand ne antwort.
ich bin aber schon etwas weiter gekommen und muss nun
das nächste problem lösen.

Ich Sende einen String via rs232 an einen anderen PC. Auf diesem PC läuft
ein ziemlich altes (DOS) Proggie was mir auf meine Anfrage
einen langen text zurückschickt. Das ganze wird eine steuerung für eine
CNC-Maschine (Plasma-Schneider).

Der Text den ich nun empfangen möchte hat eine sehr unterschiedliche länge.
Zwichen 1 und 60kb ist alles dabei.
Eines ist aber immer gleich: Die letzten 4 Zeilen lauten immer:

64
0
/
/

Nun mein eigentliches Problem: Ich möchte alles was ich über rs232 empfange in eine Datei schreiben und zwar so lange bis
ich die o.g. Zeilen empfangen habe (oder auch nur die beiden Schrägstriche, geht auch).

Mein jetziges Script sieht wie folgt aus:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#!/usr/bin/perl

use strict;
use vars qw($ob $port1 $return);
use Win32::SerialPort;

$port1="COM1";

$ob = Win32::SerialPort->new($port1) || die "Can't open $port1: $!";
$ob->baudrate (9600) || die "fail setting baudrate";
$ob->parity ("even") || die "fail setting parity";
$ob->databits (7) || die "fail setting databits";
$ob->stopbits (1) || die "fail setting stopbits";
$ob->handshake ("none") || die "fail setting handshake";
$ob->write_settings || die "no settings";

system "cls";

# Read Port Configuration

my $baud=$ob->baudrate;
my $parity=$ob->parity;
my $data=$ob->databits;
my $stop=$ob->stopbits;
my $hshake=$ob->handshake;


print "### Projekt Plasma ###\n\n";
print "Schnittstelle: $port1\nBaudrate: $baud\nParity: $parity\nDatabits: $data\nStopbits: $stop\nHandschake: $hshake\n\n";

my $tx="L00 -k .033 -0 -8.516,0 -1 .0025%\r";

$ob->write("$tx") or die ("Could not write to PC: $!");

sleep 1;

$return=$ob->input;

undef $ob;


In diesem script habe ich ein "sleep 1;" eingesetzt damit ich überhaupt etwas empfange. wenn ich das nicht mache dann bleibt $return leer. So stehen wenigstens die ersten 300 bytes drin. Wenn ich jetzt sleep 10 eingeben würde, dann ginge das mit kleineren dateien aber das ist ja nicht sinn der sache.

Ich hoffe ich habe alles gut beschrieben und es fällt jemandem was dazu ein. Danke.
kristian
 2005-10-19 12:53
#59016 #59016
User since
2005-04-14
684 Artikel
BenutzerIn
[Homepage] [default_avatar]
sesth
 2005-10-19 16:59
#59017 #59017
User since
2005-02-01
181 Artikel
BenutzerIn
[default_avatar]
Das Problem ist der abgeschaltete Handshake. Da bleibt nur ein Pollen der Schnittstelle bis alle Daten da sind - das kannst Du ja an der Schlußsequenz feststellen.

Falls möglich würde ich aber versuchen mit einem Hardware-Handshake zu arbeiten (5-Draht Leitung). Dann läuft Dein Programm zuverlässiger. Alternativ gibt es noch den Software-Handshake, da reicht dann die normale Leitung - ist aber nicht so zuverlässig.
Gruß
Thomas
Gast Gast
 2005-10-19 17:09
#59018 #59018
Hi, kann dir zwar bei deinem Problem nicht helfen aber durch deinen Code hab ich endlich geschnallt warum es bei mir nicht funktioniert hat. Endlich kann ich meine Baudrate und all solche Sachen aendern und auslesen. Als naechstes kommt es zum senden von Daten, mal schaun ob ich das auch hin kriege.

Solltest du allerdings dafuer Anregungen haben, kannst du ja unter dem Topic "Problem mit Serial Port Modul" posten

MFG

fritz
popcorn5
 2005-10-19 19:43
#59019 #59019
User since
2003-09-24
60 Artikel
BenutzerIn
[default_avatar]
@kristian: ist zwar gut, das hilft mir leider auch nicht weiter :(
@sesth: Das Problem ist das ich mit so einen sch*** uralt proggie kommunizieren muss. bs ist dabei "VENIX" von 1982 !? Ich habe nichts gefunden wo ich irgendwelche einstellungen bezüglich handschake ändern könnte. Zum Testen verwende ich bereits ein vollverdrahtetes Kabel, bringt aber leider nix.
@fritz: schön das ich dir helfen konnte :)

@all: ich fange mit Perl normalerweise auch was anderes an (CGI und DB...) das mit rs232 ist mal ne ausnahme. Aber das ist für meinen Brötchengeber und ich will mir da nicht die blösse geben ;)
ich hab gesagt "jo, kein thema" und dann mache ich das auch so.

falls es jemanden interessiert, ich habe jetzt eine lösung (ok nicht sehr schön und eher ein beispiel für "so macht man es normalerweise NICHT". das ist mir jetzt auch völlig egal, hauptsache es geht ;)

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
while($complete eq "")
{
$rx=$ob->input;
$received=$received.$rx;
$receivedlength=$receivedlength+length($rx);

if($i == 0)
{
print "Warte auf Daten...\n\n";
}
if($i == 1 and $receivedlength > 0)
{
print "Empfange Daten...\n\n";
}
if($rx =~ "\/")
{
$checksum=$ob->status;
$complete=1;
$msg="ok";
}
if($rx =~ "not found")
{
$complete=1;
$msg="Datei wurde nicht gefunden.\nPruefen Sie Ihre Eingaben.";
}
if($i > $timeout and $receivedlength == 0)
{
$complete=1;
$msg="Timeout !\nDer PC antwortet nicht. Pruefen Sie die Verbindung.";
}
sleep 1;
$i++;
}


Vielleicht gibts ja jemanden, der das noch etwas verschönern kann oder will.

Mfg

Matze
<< >> 5 Einträge, 1 Seite



View all threads created 2005-10-19 12:29.