Auslesen COM1 Port vie PHP Script, wie gehts das?

Hallo

ich habe mal eine Frage und zwar habe ich das vollgende Problemm,

an die Serielle Schnittstelle (COM1) ist ein Barcode Scanner angeschlossen und ich muss jetzt die Daten die ich mit diesem Scaner einlese in einem Browser ausgebn. Wobei eine Textdatei es auch tut.

Ich habe im Internet ein Script gefunden mit dem man den COM1 Port ansprechen kann aber der Funktioniert nicht.

Hat jemand eine Lösung was falsch sein kann? Oder vieleicht eine andere Lösung (ein PHP Script)? Bitte, bitte ich brauch es dringend.

Danke schon mal im Voraus

Hier ist das Script:

error_reporting(0);
ini_set(„pfpro.defaulttimeout“,5);

`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
{

$daten = fgets($fp,200);
echo "vor Exploade - $daten

„;
$daten = preg_replace(“/ + /", ‚;‘, $daten);
$daten = trim($daten);
$daten = ltrim($daten);

echo "vor Exploade2 - $daten

„;
$daten2 = explode(“;",$daten);

$datei = „com.txt“;
$dateioeffnen = fopen($datei,‚a+‘);
fwrite( $dateioeffnen, $daten);

}

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

Hallo

ich habe mal eine Frage und zwar habe ich das vollgende
Problemm,

an die Serielle Schnittstelle (COM1) ist ein Barcode Scanner
angeschlossen und ich muss jetzt die Daten die ich mit diesem
Scaner einlese in einem Browser ausgebn. Wobei eine Textdatei
es auch tut.

Ich habe im Internet ein Script gefunden mit dem man den COM1
Port ansprechen kann aber der Funktioniert nicht.

Hat jemand eine Lösung was falsch sein kann? Oder vieleicht
eine andere Lösung (ein PHP Script)? Bitte, bitte ich brauch
es dringend.

Für welches Betriebssystem ? Direkt mit PHP geht das nicht komplett, so das du ggfs. entsprechende Programme des Betriebssystems aufrufen musst…

error_reporting(0);

Zum Debuggen besser E_ALL statt 0

ini_set(„pfpro.defaulttimeout“,5);

?

`mode com1: BAUD=9600 PARITY=E data=7 stop=1 xon=off;
$fp = fopen („COM1:“, „r“);

So sollte es unter DOS / Windows gehen…
Bei Linux:
stty -F /dev/ttyS0 speed 9600 evenp -ixon
$fp = fopen ("/dev/ttyS0", „r“);

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

$daten = fgets($fp,200);

200 Bytes werden da von COM1: gelesen, Rest ist Weiterverarbeitung…

Alexander

Habe ich gemacht, klappt trotzdem nicht!!!

Für welches Betriebssystem ? Direkt mit PHP geht das nicht
komplett, so das du ggfs. entsprechende Programme des
Betriebssystems aufrufen musst…

Ich arbeite mit dem Windows 2000 Proffesional.

error_reporting(0);

Zum Debuggen besser E_ALL statt 0

Das habe ich gemacht aber er Zeigt mir immer wieder den gleichen Fehler an:
„Parse error: parse error unexpecterd $end in C:stuck_out_tongue:rogramme/Apache Groups/Apache/htdocs/test11.php on line 32“

Zeile 32 ist die 1 Zeile unten in der nichts mehr steht also nach der endung ?>.
Was kann das bedeuten?

ini_set(„pfpro.defaulttimeout“,5);

?

ehrlich gesagt weis ich auch nicht so richtig was das bewirken soll! habe ich jetzt auskommentiert!

`mode com1: BAUD=9600 PARITY=E data=7 stop=1 xon=off;
$fp = fopen („COM1:“, „r“);

So sollte es unter DOS / Windows gehen…

Habe ein Windows System drauf und die Zeile stimmt genau mit der überein!

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

$daten = fgets($fp,200);

200 Bytes werden da von COM1: gelesen, Rest ist

Weiterverarbeitung…Was meinst du mit Weiterverarbeitung? Also ich weis nicht genau aber ich kann nicht die ausgabe am Bildschirm erkennen. Die aufgab ist es ja das mir das ding die Werte im Browser ausgibt, unabhängig davon wie oft ich etwas scane. aber das klappt mit diesem Script nicht. Eine Idee warum oder was man verbessern muss?

Danke
Michael

Hallo Michael,

Das habe ich gemacht aber er Zeigt mir immer wieder den
gleichen Fehler an:
„Parse error: parse error unexpecterd $end in
C:stuck_out_tongue:rogramme/Apache Groups/Apache/htdocs/test11.php on line 32“

Irgendwo fehlt eine schließende Klammer oder ähnliches .

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

Da fehlt schonmal das schließende ` am Ende vor dem Semikolon

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

So sollte es unter DOS / Windows gehen…

Habe ein Windows System drauf und die Zeile stimmt genau mit
der überein!

Solange der Parse Error kommt, wird nix ausgeführt… nochmal versuchen, nachdem das fehlende ` drin ist (Shift+Taste neben Backspace, ’ geht nicht)…

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

$daten = fgets($fp,200);

200 Bytes werden da von COM1: gelesen, Rest ist

Weiterverarbeitung…Was meinst du mit Weiterverarbeitung?

Naja, in $daten stehen jetzt 200 Bytes von der COM-Schnittstelle drin, alle weiteren Zeilen in deinem Script bearbeiten dann nur noch den Text weiter, trennen z.B. an „;“ auf, etc…
Zum Testen kannst du hier echo $daten schreiben, die Klammer schließen und den Rest auskommentieren

Also ich weis nicht genau aber ich kann nicht die ausgabe am
Bildschirm erkennen. Die aufgab ist es ja das mir das ding die
Werte im Browser ausgibt, unabhängig davon wie oft ich etwas
scane. aber das klappt mit diesem Script nicht. Eine Idee
warum oder was man verbessern muss?

Evtl. musst du warten, bis der Scanner Daten liefert, d.h. dein Script ist schon fertig, bevor Daten gelesen wurden… oder dein Script wartet auf zu viele Daten und läuft bis zum Timeout, ohne etwas anzuzeigen… ist ohne das man probieren kann, d.h. ohne passende Hardware schwer herauszufinden.

Alexander

Hallo,

mal ne dumme Frage: Ist ...; ein Ersatz für exec("…"); ?

mal ne dumme Frage: Ist ...; ein Ersatz für exec("…"); ?

Leider bin ich kein experte drin aber ich glaube das sind 2 unterschiedliche Sachen du meinst bestimmt ‚…‘ und „…“ Das ist das gleiche aber in meinem Code wurden diese Zeichen Verwendet ... (Shift + die taste links neben Backspace!)

Hallo

Leider bin ich kein experte drin aber ich glaube das sind 2
unterschiedliche Sachen du meinst bestimmt ‚…‘ und „…“ Das
ist das gleiche aber in meinem Code wurden diese Zeichen
Verwendet ... (Shift + die taste links neben Backspace!)

Nein, ich meine mode com1 ...;
mode ist ein DOS-Befehl und müsste nach meinem Verständnis mit exec(), system() oder passthru() ausgeführt werden. Die Schreibweise mit den schrägen Anführungszeichen habe ich hingegen noch nie gesehen und wollte deshalb wissen, ob sie den gleichen Effekt haben.

Johannes Matschke

Nein, ich meine mode com1 ...;
mode ist ein DOS-Befehl und müsste nach meinem Verständnis mit
exec(), system() oder passthru() ausgeführt werden. Die
Schreibweise mit den schrägen Anführungszeichen habe ich
hingegen noch nie gesehen

Ich weis es nicht aber, Das aufmachen und zumachen des COM Ports hat funktioniert. Also denke ich dass es auch so geht.

Wie würdest du denn die Zeile schreiben? mode com1 ...;

Ich habe jetzt aber ein anderes Problem:

Ich muss mittels eine Barcodescanner die Informationen von einem Strichcode in den rechner einlesen und diese dann im Browser ausgeben. 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“);

?>

Hast du vieleicht eine Idee was sich da machen lässt?

Michael Ruvinsky

Hallo

Wie würdest du denn die Zeile schreiben? mode com1 ...;

exec(„mode com1…“);

Ich habe jetzt aber ein anderes Problem:

Ich muss mittels eine Barcodescanner die Informationen von
einem Strichcode in den rechner einlesen und diese dann im
Browser ausgeben. 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);

Diese Zeilen kannst du eigentlich weglassen.

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

Was du damit bezweckst, ist mir nicht klar.

Wenn du einfach nur das erste und das letzte Zeichen abschneiden willst, kannst du das so machen:
$string = substr($buffer,1,strlen($buffer)-2);

Erklärung: substr() liefert einen Teilstring. Das erste Argument ist der Quellstring, das zweite gibt an, bei welchem Zeichen des Quellstrings der Teilstring beginnt (1. Zeichen = 0) und das dritte Argument gibt die Länge des Teilstrings an. strlen gibt die Länge eines Strings zurück.

Das mit dem Start- und Endwert habe ich nicht verstanden, kannst du das noch mal erklären?

Johannes Matschke

exec(„mode com1…“);

habe ich jetzt umgeändert! das Programm gibt keinen Fehler zurück, also denk ich das das geht!

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

die habe ich auch auskomentiert!

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

Was du damit bezweckst, ist mir nicht klar.

Das weis ich ja auch nicht so genau. Es ist so. wenn ich einen Strichcode (z.B. 97855648) einlese wird noch eine Hexadezimale Zahl 2 am anfang des Codes und eine Hexadezimale 3 am ende des Codes eingefügt. Mir wurde erklärt das die für die Control Characters 2 = STX (Start of Text)und 3 = ETX (End of Text)stehen.

Verstehst du was ich meine! Ich will nach dem Ausführen des Programms und dem Scannen eine Strichcodes nur (wie oben als Beispiel) 97855648 Stehen haben. Die Zahlen 2 und 3 (Hexadezimal) Zeigen nur den Anfang und das Ende des Textfeldes an.

PS: danke deine Antworten helfen mir sehr weiter hoffe das wir das auch noch schaffen!

Michael Ruvinsky

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

Was du damit bezweckst, ist mir nicht klar.

Wenn du einfach nur das erste und das letzte Zeichen
abschneiden willst, kannst du das so machen:
$string = substr($buffer,1,strlen($buffer)-2);

Kannst du mir das in mein script einfügen und den ganzen script posten? ich verstehe nicht ganz wohin ich diese Zeile infügen soll oder ist diese nicht mehr gültig nach meinen letzten informationen?

Hallo

Wenn du einfach nur das erste und das letzte Zeichen
abschneiden willst, kannst du das so machen:
$string = substr($buffer,1,strlen($buffer)-2);

Kannst du mir das in mein script einfügen und den ganzen
script posten? ich verstehe nicht ganz wohin ich diese Zeile
infügen soll oder ist diese nicht mehr gültig nach meinen
letzten informationen?

Wenn du jetzt zB den Code 9845635 einscannst, dann erhältst du doch 298456353, oder?

dieser wert ist in $buffer gespeichert. Jetzt musst du nichts weiter tun, als das erste und das letzte Zeichen zu löschen. Das machst du mit

$string = substr($buffer,1,strlen($buffer)-2);

Jetzt kannst du den Code mit

echo $string;

ausgeben.

Johannes Matschke

Wenn du jetzt zB den Code 9845635 einscannst, dann erhältst du
doch 298456353, oder?

nein die Zahlen sind in ANSI Code also die 9845635
Die 9 in ANSI entspricht der 57 in Dezimal.
8 ANSI = 56 Dezimal
4 ANSI = 52 Dezimal
5 ANSI = 53 Dezimal
6 ANSI = 54 Dezimal
3 ANSI = 51 Dezimal
5 ANSI = 53 Dezimal

Die 2 Die am Anfang steht und die 3 die am Ende steht sind aber Dezimale Zahlen. und nicht im ANSI. Für diese Dezimal Zahlen exestiert kein ANSI code. du kannst es dir hier http://www.dtp-praxis.de/wissen/datei/ansi.pdf angucken.

Also muss ich eine Schleife machen die die 2 in Dezimal erkennt und weis dass es der Anfang ist. Dann muss ich jede einzelne Zahle einzeln auslesen (ich denke mit switch, case) die aber in ANSI code stehen (mir wurde gesagt dass diese Automatisch dann in dezimal umgewandelt werden) und wenn ich an der Dezimalen 3 am Ende ankomme muss er aufhören und dass dann im Browser ausgeben. Verstehst du die Aufgabenstellung. Sorry ich weis das ist nicht so einfach, will dich auch nicht damit nerven.

Würde mich freun wenn du wenigstens ein Ansatz findest wie man das Problem lösen kann.

Michale Ruvinsky

Wenn du jetzt zB den Code 9845635 einscannst, dann erhältst du
doch 298456353, oder?

nein die Zahlen sind in ANSI Code also die 9845635
Die 9 in ANSI entspricht der 57 in Dezimal.
8 ANSI = 56 Dezimal
4 ANSI = 52 Dezimal
5 ANSI = 53 Dezimal
6 ANSI = 54 Dezimal
3 ANSI = 51 Dezimal
5 ANSI = 53 Dezimal

Die 2 Die am Anfang steht und die 3 die am Ende steht sind
aber Dezimale Zahlen.

Ach so. Ja stimmt, dezimal 2 ist „Anfang des Textes“ und dezimal 3 „Ende des Textes“. Diese Zeichen kannst du in PHP mit chr(2) bzw. chr(3) darstellen (sie sind als normale Zeichen zu verstehen, sie haben bloß keine Visualisierung).

Also muss ich eine Schleife machen die die 2 in Dezimal
erkennt und weis dass es der Anfang ist. Dann muss ich jede
einzelne Zahle einzeln auslesen (ich denke mit switch, case)
die aber in ANSI code stehen (mir wurde gesagt dass diese
Automatisch dann in dezimal umgewandelt werden) und wenn ich
an der Dezimalen 3 am Ende ankomme muss er aufhören und dass
dann im Browser ausgeben. Verstehst du die Aufgabenstellung.

Wenn ich dich richtig verstehe, sehen vor der 2 und nach der 3 noch andere Zeichen, die du abschneiden willst.

strpos(String, Suchstring) - Sucht erstes Vorkommen des Suchstrings und liefert die Position
substr(String, Anfang, Länge) - Gibt einen Teil eines Strings zurück

um nur den gesuchten Barcode anzuzeigen, müsstest du

$string = substr($buffer,strpos($buffer,chr(2))+1,strpos($buffer,chr(3))-strpos($buffer,chr(2))-1);

schreiben.

Wenn ich dich richtig verstehe, sehen vor der 2 und nach der 3
noch andere Zeichen, die du abschneiden willst.

Ja das Stimmt es kommt ja ein Datenstromm aus Verschiedenen Zahlen und ich muss dann nur das auslesen was zwischen der 2 und der 3 steht.

Muss das jetzt aber in eine Schleife paken! Es kann ja sein das ich nicht nur einmal scanne sondern 3 mal dann will ich die drei Sachen auch im Browser eingezeigt bekommen.

Brauche ich keine Switch, case Anweisung hier? Oder reicht die Zeile aus die du mir geschickt hast?

ICh schicke dir das was ich jetzt habe, kannst du bitte gucken ob du irgendwelche ergänzungen machen kannst?

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
{
while (!feof($fp))
{
$buffer = fgets($fp, 1);
}
}

$string = substr($buffer,strpos($buffer,chr(2))+1,strpos($buffer,chr(3))-strpos($buffer,chr(2))-1);

echo $string;

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

?>

Ich bedanke mich schon jetzt bei dir du hast mir schon mit sehr vielen Sachen schon geholfen

Michael Ruvinsky

Halllo ich bins nochmall. Also der Stand der Dinge sieht immer noch aus wie gestern. Also das jetzige Programm habe ich aus meiner Sicht kommentiert. Ich weis aber nicht ob es Richtig ist. Also:


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“);

?>


So wenn ich jetzt dieses Programm starte hängt er sich anscheinen Auf, ich vermute mal in der While Schleife. Also ich kriege ein Dos Fenster mit der Überschrift PHP.exe und das bleibt dann nach einer Zeit geht das wieder weg und der Compiler gibt mir volgendes aus: NO output produced!

Und er gibt mir eine Fehlermeldung in der Zeile 13 aus. Ds ist die Zeile: while (!feof($fp). Da wo die While schleife Anfängt.
Dei Fehlermeldung lautet:
Fatal error: Maximum executiontime of 30 seconds exceeded in C:"Der Datei Pfad.

Was kann das sein? Hast du eine Ahnung?

NAchtrag:

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.

was ist an diesem Script falsch?

ich kriege keine ausgabe!

Test Ausgabe Com Port
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“;
}

//$word = 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 $word; // Augabe am Bildschirm

}

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

?>