serielle schnittstelle

Die Scriptsprache PHP fĂĽr die Gestaltung von dynamischen Websites.

serielle schnittstelle

Beitragvon cazper » Di 31 Mai, 2005 12:05

ich möchte daten an die serielle schnittstelle senden und empfangen.
material das ich für das projekt benötige, bekomme ich später erst.
daher weiĂź ich grad nicht, wie ich testen kann ob das funktioniert...

der code sieht so aus:
[php]$comport = "COM1";
$string = "Hallo Schnittstelle!\n";
$buffer = "";

$pointer = fopen($comport,"w");
if(fwrite($pointer, $string) == strlen($string)) echo 'erfolgreich an <b>' . $comport . '</b> gesendet.';
while(!feof($pointer)) {
$buffer .= fgets($pointer, 4096);
$buffer .= "<br>";
}
fclose($pointer);

echo '<br>';

if($buffer > 0){
echo 'Daten von <b>' . $comport . '</b> empfangen:<br><i>' . $buffer;
}else{
echo 'keine Daten von <b>' . $comport . '</b> empfangen.';
}[/php]
die ausgabe sieht so aus:
erfolgreich an COM1 gesendet.
keine Daten von COM1 empfangen.


hat jmd von euchn tipp?

grĂĽĂźe,
alex
Bild
cazper
Junior Board-Mitglied
Junior Board-Mitglied
 
Beiträge: 34
Registriert: Mo 18 Apr, 2005 14:02

Beitragvon speedy4gamers » Di 31 Mai, 2005 12:12

Hast du das selbst geschrieben, oder irgendwo geladen?
Irgendwie schaut das ein wenig komisch aus, denn da PHP eine Plattformunabhängige Programmiersprache ist, klingt das ein wenig konfus.
z.B Linux verwendet zum ansprechen den Com-Ports nicht COMx. Wie soll das gehen?
Ich kann mich auch irren...
Dennoch bin ich der Meinung, dass du mit C/C++/C# oder einer ähnlichen Programmiersprache besser aufgehoben bist.
Speedy
speedy4gamers
Board-Mitglied
Board-Mitglied
 
Beiträge: 208
Registriert: So 23 Jan, 2005 18:23

Beitragvon cazper » Di 31 Mai, 2005 12:30

ich hab das schon selber geschriebn.
da ich hier WINxp hab wird das wohl schon richtig sein mit COM1.
schlieĂźlich sendet er es ja. ich lege noch ne konfigurationsdatei an,
in der dann auch der comport geändert werden kann. für linux wärs
ja "/dev/ttyS0" oder so...

und da die daten in ner db gespeichert werden sollen ist php schon
okay. aber da hab ich eh keinen einfluss drauf...

naja... jedenfalls soll das script wie folgt ablaufen:
erst ein programm ausfĂĽhren
dies sendet daten über die schnittstelle an nen µC
diese daten abfangen, interpretieren und in ner db speichern.
ggf kommen daten zurĂĽck. diese auch abfangen und handlen.

jetzt versuche ich die daten die ich sende, auch wieder con der
schnittstelle auszulesen...
ich glaube dafĂĽr muss ich 2 scripte parallel laufen lassen oder?
eines das an der schnittstelle 'lauscht'
und das andere sendet die daten...

aber bin z.zt. noch etwas ratlos
Bild
cazper
Junior Board-Mitglied
Junior Board-Mitglied
 
Beiträge: 34
Registriert: Mo 18 Apr, 2005 14:02

Beitragvon dfx » Di 31 Mai, 2005 13:00

so einfach kannst du nicht mit dem seriellen port reden... immerhin gibt's da einen haufen an parameter zu setzen, zb. baudrate, fluĂźkontrolle usw., und sowas wie "end of file" gibt's auf der seriellen ja auch nicht. unter unix gibt's da die termios api, und ich glaub kaum, daĂź es fĂĽr php entsprechendes gibt...
xDSL unlimited 2.320 kbit/s
Bild
Bild
dfx
Board-User Level 3
Board-User Level 3
 
Beiträge: 1368
Registriert: Do 15 Jan, 2004 19:22
Wohnort: graz

Beitragvon cazper » Di 31 Mai, 2005 13:03

Bild
cazper
Junior Board-Mitglied
Junior Board-Mitglied
 
Beiträge: 34
Registriert: Mo 18 Apr, 2005 14:02

Re: serielle schnittstelle

Beitragvon ulrich » Di 31 Mai, 2005 14:59

cazper hat geschrieben:ich möchte daten an die serielle schnittstelle senden und empfangen.
material das ich für das projekt benötige, bekomme ich später erst.
daher weiĂź ich grad nicht, wie ich testen kann ob das funktioniert...

besorg dir ein null-modem kabel (zur direktverbinung zweier PCs), verbinde die erste mit der zweiten seriellen schnittstelle (ich hoffe, dein Rechner hat zwei davon), und versuche an der zweiten zu lesen, was du in die erste schreibst, u.u.
:)
ulrich
Senior Board-Mitglied
Senior Board-Mitglied
 
Beiträge: 287
Registriert: Do 13 Nov, 2003 14:27

Beitragvon cazper » Di 31 Mai, 2005 15:18

loll

sind meist die einfachsten sachen ;)

ich probiers mal aus

:)
Bild
cazper
Junior Board-Mitglied
Junior Board-Mitglied
 
Beiträge: 34
Registriert: Mo 18 Apr, 2005 14:02

Beitragvon cazper » Mi 01 Jun, 2005 07:14

fĂĽr die, dies interessiert,
hab jetzt auf php.net das gefunden:
[php]// Use this code to write directly to the COM1 serial port
// First, you want to set the mode of the port. You need to set
// it only once; it will remain the same until you reboot.
// Note: the backticks on the following line will execute the
// DOS 'mode' command from within PHP
`mode com1: BAUD=9600 PARITY=N data=8 stop=1 xon=off`;
$fp = fopen ("COM1:", "w+");
if (!$fp) {
echo "Uh-oh. Port not opened.";
} else {
$e = chr(27);
$string = $e . "A" . $e . "H300";
$string .= $e . "V100" . $e . "XL1SATO";
$string .= $e . "Q1" . $e . "Z";
echo $string;
fputs ($fp, $string );
fclose ($fp);
}[/php]

ich hoffe mal das klappt
sieht aber gut aus. passt auch zum comment von dfx
Bild
cazper
Junior Board-Mitglied
Junior Board-Mitglied
 
Beiträge: 34
Registriert: Mo 18 Apr, 2005 14:02

Beitragvon speedy4gamers » Mi 01 Jun, 2005 07:47

Das Problem ist meiner Ansicht nach nicht das senden, sondern eher das empfangen!
Da du ja den Script im Browser ausfĂĽhren wirst, wirds da irgendwann nen Timeout geben! Dann wird aber an der Schnittstelle nix mehr gelesen!
Deswegen oben mein comment, es lieber mit einer anderen Programmiersprache zu lösen.
Speedy
speedy4gamers
Board-Mitglied
Board-Mitglied
 
Beiträge: 208
Registriert: So 23 Jan, 2005 18:23

Beitragvon cazper » Mi 01 Jun, 2005 14:43

mache das so: öffnen- was machen- schliessen
nur bleibt das script in der while-schleife hängen
auch die timeout-bedingung hilft nicht
und der port 2 wird deshalb nicht geschlossen
kann ich den über die kommandozeile oder so nachträglich schliessen?

und irgendwas stimmt da mit fgets nicht

hier mal der code:
[php]
<?
define("TIMEOUT", "3"); //3 sec timeout

$comport1 = "COM1";
$comport2 = "COM2";
$string = "Hallo Schnittstelle!\n";
$buffer = "";

`mode com1: BAUD=9600 PARITY=N data=8 stop=1 xon=off`;
$fp2 = fopen ($comport1, "w+");
`mode com2: BAUD=9600 PARITY=N data=8 stop=1 xon=off`;
$fp1 = fopen ($comport2, "w+");

if (!$fp1) {
echo "Uh-oh. Port 1 not opened.";
} else {
$e = chr(27);
$string = $e . "A" . $e . "H300";
$string .= $e . "V100" . $e . "XL1SATO";
$string .= $e . "Q1" . $e . "Z";
echo $string;
echo fwrite ($fp1, $string );
fclose ($fp1);
}

if (!$fp2) {
echo "Uh-oh. Port 2 not opened.";
} else {
$time_start = round(microtime(true),0);
while(!feof($fp1) AND round(microtime(true),0)-$time_start < TIMEOUT) {
$buffer .= fgets($fp2, 4096);
$buffer .= "<br>";
}
echo $buffer;
fclose ($fp2);
}
?>[/php]

@speedy
timeout kann man aber verändern. das ist nicht das problem...
Bild
cazper
Junior Board-Mitglied
Junior Board-Mitglied
 
Beiträge: 34
Registriert: Mo 18 Apr, 2005 14:02

Beitragvon speedy4gamers » Mi 01 Jun, 2005 15:04

Sollte dich vielleicht auf einene Thread beschränken! Sonst geht die Übersicht verloren!
http://xDSL.at/phpbb2/viewtopic.php?t=29863&highlight=
Irgendwie bezewiefle ich noch immer, dass PHP hier die richtige Lösung ist!
Speedy
speedy4gamers
Board-Mitglied
Board-Mitglied
 
Beiträge: 208
Registriert: So 23 Jan, 2005 18:23

Beitragvon cazper » Mi 01 Jun, 2005 15:06

sorry
ich bleibe in diesem

hab ich keinen einfluĂź drauf
ich solls halt in php machen
Bild
cazper
Junior Board-Mitglied
Junior Board-Mitglied
 
Beiträge: 34
Registriert: Mo 18 Apr, 2005 14:02

Beitragvon speedy4gamers » Mi 01 Jun, 2005 15:07

Wie soll das mit dem Script auch gehen?
Wenn PHP zur Abfrage kommt, wo er am COM-Port 2 horcht, ist der Datenstrom von COM1 schon längst verpufft!
Du kannst den Code nicht in eine File schreiben, denn bevor 2 zu horchen beginnt, het der Text von 1 schon an 2 Schiffbruch erlitten, da 2 zu diesem Zeitpunkt noch nicht gehorcht hat!
Speedy
speedy4gamers
Board-Mitglied
Board-Mitglied
 
Beiträge: 208
Registriert: So 23 Jan, 2005 18:23

Beitragvon cazper » Mi 01 Jun, 2005 15:36

ja, genau das ist doch das problem
muss es doch auch eine lösung für geben
Bild
cazper
Junior Board-Mitglied
Junior Board-Mitglied
 
Beiträge: 34
Registriert: Mo 18 Apr, 2005 14:02

Beitragvon ulrich » Do 02 Jun, 2005 09:46

multithreading (falls möglich in php), oder 2 programme.
ulrich
Senior Board-Mitglied
Senior Board-Mitglied
 
Beiträge: 287
Registriert: Do 13 Nov, 2003 14:27

Nächste

ZurĂĽck zu PHP

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 20 Gäste