Ausgabe von COM PORT in dem Browser fast fertig!

Ich habe das volgende Prooblem.

Ich muss mittels eine Barcodescanner die INformationen voon einem Strichcode in den rechner einlesen und diese dann im Browser ausgeben. Ich habe nur die möglichkeit dies mittels PHP zu machen. Ich habe es schon geschaft dass mein COM1 Port an den der scanner angeschlossen ist, aufgemacht und zugemacht wird. Jetzt muss ich aber die ausgabe machen und daran verzweifele ich langsamm.

Dabei ist zu beachten dass der Scaner eine 2 als Anfangszahl und eine 3 als Endzahl automatisch einfügt. Also muss ich Praktisch nur das ausgeben was dazwischen steht. Und ich habe einen Start und einen endwert. Das ist mein code was ich geschafft habe aber weiter komme ich nicht. Jemand eine Idee?

error_reporting(E_ALL);
ini_set(„pfpro.defaulttimeout“,1);

mode com1: BAUD=9600 PARITY=E data=7 stop=1 xon=off;

$fp = fopen („COM1:“, „r“);

if (!$fp)
{
echo „Com Port nicht geöffnet.“;
}
else
{
while (!feof($fp))
{
$buffer = fgets($fp, 1);
}
}

if ($buffer == „\2“)
{
$string .= $buffer;
if ($buffer == „\3“)
{
break;
}
}
echo $string;

fclose ($fp) or die („Fehler beim schliessen der Com Verbindung“);

?>

Moin,

error_reporting(E_ALL);
ini_set(„pfpro.defaulttimeout“,1);

mode com1: BAUD=9600 PARITY=E data=7 stop=1 xon=off;

$fp = fopen („COM1:“, „r“);

if (!$fp)
{
echo „Com Port nicht geöffnet.“;
}
else
{
while (!feof($fp))
{
$buffer = fgets($fp, 1);
}
}

if ($buffer == „\2“)
{
$string .= $buffer;
if ($buffer == „\3“)
{
break;
}
}
echo $string;

Wie sieht $string aus? Sprich was wird an den Browser geliefert?

Gruß
widecrypt

Wie sieht $string aus? Sprich was wird an den Browser
geliefert?

Guten Morgen

Der String liefer nichts da das Prog nicht klappt habe jetzt das Programm ummgeschrieben so dass es fast functionieren sollte tut es aber nicht weil er sich anscheinen in der while schleife aufhängt. Hier der Script:


exec(„mode com1: BAUD=9600 PARITY=E data=7 stop=1 xon=off“); //COM Port Ansteuern

$fp = fopen („COM1:“, „r“); //Das COM Port zum schreiben Aufmachen

if (!$fp)
{
echo „Com Port nicht geöffnet.“; // beim nichtöffnen des COM Ports --> else
}
else
{
while (!feof($fp))
{
$buffer = fgets($fp, 1); //die while Schleife verstehe ich nicht, habe die aber nicht selber gemacht.
}

$string = substr($buffer,strpos($buffer,chr(2)) +1,strpos($buffer,chr(3))-strpos($buffer,chr(2))-1); //Die erste und die Letzte Dezimal Zahl abschneiden

echo $string; // Augabe am Bildschirm

}

// Das COM Port schließen
fclose ($fp) or die („Fehler beim schliessen der Com Verbindung“);

?>


Der gibt mir ein Fehler in der 13. Zeile aus. Das ist die, wo die while Schleife anfängt. Der Fehler: Fatal error, Maximum execution time of 30 seconds exceeded in C:\ „Datei Pfaad“.

Ich komme nicht weiter! Eine Idee?

PS: zur Erklärung. beim Einlesen des Strichkodes Ließt der Scaner die Zahlen im Ansi Code ein dabe fügt er aber am Anfang der Ansi Kette eine Dezimale 2 ein und am ende eine dezimale 3 ein.

Die while schleife ist falsch, weil sie zwischen der 2 und 3 nicht nur ein Zeichen Auslesen soll, sondern so lange biss sie an der 3 angelangt. Dabei würde die jetzige while Schleife jeden Wert einlesen und dann mit dem nähsten überschreiben. Sie muss aber alle werte zwische der 2 und der 3 ausgeben. Ich habe da an eine Swith Case anweisung gedacht? Aber ich kann kein Ansatz finden wie ich anfangen soll.

Danek schon mal für die antwort

LG
Michael

hallo,

nur mal so zum verständnis, du willst die anwendung im browser aufrufen oder als consolen anwendung?
du müsstest ja genau in dem moment einscanen wo du den browser aufrufst…

und
while (!feof($fp))
{
$buffer = fgets($fp, 1); //die while Schleife verstehe ich nicht, habe die aber nicht selber gemacht.
}
liest die daten von deinem com port in einen string. das problem ist aber das er so lange liest bis nichts mehr kommt. du könntest zum testen mal nach ein paar zeilen abbrechen und schauen ob was in deinem string steht.

Hallo

nur mal so zum verständnis, du willst die anwendung im browser
aufrufen oder als consolen anwendung?

Ich will die Anwendung im Browser aufrufen.

du müsstest ja genau in dem moment einscanen wo du den browser
aufrufst…

Das ist ja mein Problemm. dafür brauche ich dieSchleife er soll ständig den Port Abfragen. Und wenn er eine Dezimale 2 findet soll er ab da an alles Zahl für Zahl einlesen bis er an die dezimale Zahl 3 Ankommt. Dann soll die schleife beendet werden und das Com Port geschlossen werden.

Ich weis nicht wie ich das realesieren soll. Eine Idee?

while (!feof($fp))
{
$buffer = fgets($fp, 1); //die while Schleife verstehe ich
nicht, habe die aber nicht selber gemacht.
}
liest die daten von deinem com port in einen string. das
problem ist aber das er so lange liest bis nichts mehr kommt.
du könntest zum testen mal nach ein paar zeilen abbrechen und
schauen ob was in deinem string steht.

ja soll er auch aber nicht bis nichts mehr kommt sondern von der 2 bis zu der 3.

danke schon mal

MFG
Michael

Ich weis nicht wie ich das realesieren soll. Eine Idee?

while (!feof($fp))
{
$buffer = fgets($fp, 1); //die while Schleife verstehe ich
nicht, habe die aber nicht selber gemacht.
}

$word = "";
while ($char = fgetc($fp))
 { 
 switch ($char)
 {
 case 2: $word = "" /\* beginn des wortes tue etwas \*/; break;
 case 3: /\* ende des wortes tue etwas \*/; break;
 default: $word .= $char; break;
 }
 echo "$char:blush:word\n";
 }

du solltest aber wirklich das manual bemuehen um zu verstehen, was deine scripte tun…

 Test Ausgabe Com Port

exec("mode com1: BAUD=9600 PARITY=E data=7 stop=1 xon=off"); //COM Port Ansteuern

$fp = fopen ("COM1:", "r"); //Das COM Port zum schreiben Aufmachen

if (!$fp)
 {
 echo "Com Port nicht geöffnet."; // beim nichtöffnen des COM Ports --\> else
 }

else 
{ 
 $word = ""; 
 while ($char = fgetc($fp)) 
 { 
 switch ($char) 
 { 
 case 2: $word = "chr(2)"; /\* beginn des wortes tue etwas \*/ 
 break; 
 case 3: $word = "chr(3)"; /\* ende des wortes tue etwas \*/ 
 break; 
 default: $word .= $char; 
 break; 
 } 
 echo "$char:blush:word\n"; 
 }

$string = substr($buffer,strpos($buffer,chr(2))+1,strpos($buffer,chr(3))- strpos($buffer,chr(2))-1); //Die erste und die Letzte Dezimal Zahl abschneiden

 echo $string; // Augabe am Bildschirm 
 }



// Das COM Port schließen
fclose ($fp) or die ("Fehler beim schliessen der Com Verbindung");

?\>

Hab das jetzt in meinem Compiler stehen. Der gibt mir zwar kein fähler aus aber wenn ich irgendwas scanne dann erscheint nichts auf dem Bildschirm. was kann das sein? Sorry ich weis das ich nerve. Hab jetzt angefangen den script mal zu zelgen und im Manual nuchzugucken was es genau macht.

Würde mich aber über eine korecktur des Scripts trotzdem Freuen.

MFG
Michael

Hab das jetzt in meinem Compiler stehen. Der gibt mir zwar
kein fähler aus aber wenn ich irgendwas scanne dann erscheint
nichts auf dem Bildschirm. was kann das sein?

dann wird das teil nix am comport senden - hast du das mal mit einem serial-port-monitor geprueft?

es waere auch interessant zu wissen, ob die mode-einstellungen nach dem exec ueberhaupt beibehalten werden, oder ob die verloren gehen, weil sie in so etwas wie einer eigenen shell aufgerufen werden.

schau dir auch mal
http://archives.neohapsis.com/archives/php/2005-03/0…
die nachricht:
From: Richard Lynch [mailto:ceol-i-e.com]
Sent: 3. march 2005 20:56
die oeffnen den comport mit einem anderen modus…

Hallo

Hab jetzt vollgendes gemacht. habe ein echo nach dem Fopen und ein echo nach dem Fclose gesetzt, mit den Texten Port geöffnet, port geschlossen. Der gibt mir diese meldung dann gleichzeitig auf dem Bildschirm aus. Ich habe das gefühl das er schon das Port anspricht aber nur für eine seh kurze Zeit. also für eine sekune wie kann ich denn so machen dass ich das einstelen kann wie lange er den Port offen halten soll (also von Ihm lesen)? Muss ich eine schlefe um fopen und fclose machen. das was bei mir jetzt in der mitte steht hat mir mein Lehrer geschickt und hat gesagt ich soll es damit versuchen. Aber jetzt muss ich erst bestimmen wie lange das Port nicht geschlossen werden soll.
Also ich meine sowas wie eine Zeitliche verzögerung.

Geht das?


Test Ausgabe Com Port

exec(„mode com1: BAUD=9600 PARITY=E data=7 stop=1 xon=off“);

$fp = fopen („COM1:“, „r“);

echo „Com Port geöffnet.\n“;

if (!$fp)
{
echo „Com Port nicht geöffnet.“;
}

else
{

for ($i=0; $i


Hallo

Hab jetzt vollgendes gemacht. habe ein echo nach dem Fopen und
ein echo nach dem Fclose gesetzt, mit den Texten Port
geöffnet, port geschlossen. Der gibt mir diese meldung dann
gleichzeitig auf dem Bildschirm aus. Ich habe das gefühl das
er schon das Port anspricht aber nur für eine seh kurze Zeit.
also für eine sekune wie kann ich denn so machen dass ich das
einstelen kann wie lange er den Port offen halten soll (also
von Ihm lesen)? Muss ich eine schlefe um fopen und fclose
machen. das was bei mir jetzt in der mitte steht hat mir mein
Lehrer geschickt und hat gesagt ich soll es damit versuchen.
Aber jetzt muss ich erst bestimmen wie lange das Port nicht
geschlossen werden soll.
Also ich meine sowas wie eine Zeitliche verzögerung.

Geht das?

Bisher hat es für mich so geklungen als wenn du erst scannst und dann das Script laufen lässt. Wenn du zur Skriptlaufzeit scannst, kannst du mit

$str1='';
$endtime = time() + 10;
while (time() 
über 10 Sekunden lang aus dem Port lesen.

Johannes Matschke

Hallo noch was

man könnte doch mal eine schleife um den Teil machen:


exec(„mode com1: BAUD=9600 PARITY=E data=7 stop=1 xon=off“);

$fp = fopen („COM1:“, „r“);
if (!$fp)
{
echo „Com Port nicht geöffnet.“;
}
//-------------------------------------------------------------------//
else
{
$str1=’’;
$endtime = time() + 10;
while (time() \n"; }

}

//-------------------------------------------------------------------//

fclose ($fp) or die („Fehler beim schliessen der Com Verbindung“);
echo „Com Port geschlossen.“;
?>

Also ich habe mir das so gedacht dass man vor die Zeile $fp = fopen („COM1:“, „r“); eine Schlaeife einbauen. Die dann so lange von dem Comport ließt bis diese eine Eingabe regestriert. Wenn dann er merkt dass da was kommt soll er
$strarr = explode(chr(3),$buffer);
array_pop($strarr); foreach ($strarr as $string) {
echo strstr($string, chr(2)) . "
\n"; }
dieses Hier ausführen. Geht das irgendwie.
Weil das komplete Script nichts auf dem Bildschirm ausgibt und sich kompletz aufhängt.

LG
Michael

Hallo

wenn ich z.B. hier ein echo eingbaue dann gibt er mir auch was zurück!

$strarr = explode(chr(2),$buffer);
array_pop($strarr);
foreach ($strarr as $string)
{
echo strstr($string, chr(3)) . "
\n";
}

Beispiel:

$strarr = explode(chr(2),$buffer);
array_pop($strarr);
echo"Hallo";
foreach ($strarr as $string)
{
echo strstr($string, chr(3)) . "
\n";
}

Dann krieg ich am Bildschirm „Hallo“ angezeigt! Wenn ich aber das echo 2 Zeilen tiefer setze: also zwischen foreach und der letzten geschweisften Klammer dann klriege ich keine Ausgabe. woran kann das liegen?


Und das Script Funktioniert aber garnicht. Erklärung: Ich habe zum test an verschiedene Stellen einfach ein: echo „Hallo“; eingebaut und der gibt mir nichta am bildschirm aus! also kein echo!

$str1=’’;
$endtime = time() + 10;
while (time()