Code geht nicht, was ist falsch?

was ist an diesem Script falsch?

Ich erhalte keine Daten vom Scaner. Also keine ausgabe auf dem Bildschirm

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

?>

Hallo,

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 = ""; /\* beginn des wortes, alles ab hier in $word sammeln \*/
 break;
 case '3': break 2; /\* fertig, raus aus dem while \*/
 default : $word .= $char;
 break;
 }
 echo "$char: $word
\n";flush(); // nur zu Debugzwecken
 }
 echo $word; // Augabe am Bildschirm

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

was ist an diesem Script falsch?

  • etwas umständlich, die 2 und 3 zu speichern und dann wieder wegzuwerfen, so sollte es auch gehen
  • beim Lesen der 3 soll das while abgebrochen werden, daher das break 2;
  • das flush() sorgt dafür, das zwischengespeicherte Daten an den Browser gesendet werden
  • fclose ist bei fehlgeschlagenem fopen nicht sinnvoll

Ich erhalte keine Daten vom Scaner. Also keine ausgabe auf dem
Bildschirm

Naja, weil er bis zum Timeout wahrsheinlich in der while-Schleife wartet… aber zumindest wenn der Timeout-Fehler kommt, sollten die bis dahin empfangenen Zeichen ausgegeben werden.

Hast du eigentlich mal auf der Eingabeaufforderung versucht, ob überhaupt etwas ankommt ?

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

und dann scannen…

Alexander

PS: Hättest du besser in den angefangenen Thread ein Stück tiefer posten sollen, da man so nicht weiss, as es dort dazu gehört…

PPS: Wenn in den Nutzdaten eine 2 oder 3 vorkommen kann, geht das so nicht…

Noch mal ne Frage
Also
Du erhältst doch von deinem Scanner eine Zeichenfolge in der Art:
nutzlose Zeichen - 2 - Code - 3 - nutzlose Zeichen - 2 - Code …

wenn du diesen String in $buffer eingelesen hast, kannst du ja erst mal mit echo $buffer; prüfen, ob der String wirklich da ist. Und dann könntest du mit

$strarr = explode(chr(3),$buffer);
array\_pop($strarr);
foreach ($str\_arr as $string)
 echo strstr($string, chr(2)) . "
\n";

Erklärung:
Mit explode() trennst du den String an den Dreien auf und speicherst die Einzelstrings in ein Array. Mit array_pop() verwirfst du den letzten Arraywert, denn nach der letzten Drei kommt nichts Wichtiges mehr. Mit strstr() suchst du in jedem Arraywert nach einer Zwei und lässt dir den Reststring gefolgt von einem Zeilenumbruch ausgeben.

Johannes Matschke

Hallo

danke erstmal für die Ausführliche Antwort. jetzt habe ich die aller letzte Frage . Wie kann ich die 2 Scripst die du mir geschickt hast sinnvoll miteinander verbinden. Ich habe das so gemacht:


Test Ausgabe Com Port
//-------------------------------------------------------------------//

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

?>
//-------------------------------------------------------------------//


Das Script hängt sich irgendwo auf und ich bekomme keine Fehlermeldung. Was könnte das sein?

Sorry wenn ich nerve.

LG
Michael

Hallo

Das ist schon richtig so, aber wenn am Com-Port keine Daten bereit stehen, dann hängt sich PHP bei fgets() auf. Vielleicht solltest du erst den Port öffnen, dann eine leere Schleife laufen lassen und dann den String lesen. In der Schleifenzeit musst du aber unbedingt scannen.

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





> -----------------------------------------------------------------------  
>   
>   
>   
> Test Ausgabe Com Port  
>   
>   
> //-------------------------------------------------------------------//  
>   
>   
> 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");  
>   
> ?\>  
> //-------------------------------------------------------------------//  
>   
>   
>   
> -----------------------------------------------------------------------  
>   
> Das Script hängt sich irgendwo auf und ich bekomme keine  
> Fehlermeldung. Was könnte das sein?  
>   
> Sorry wenn ich nerve.  
>   
> LG  
> Michael