albyy911:
// get contents of a file into a string
$filename = "COM3";
$handle = fopen($filename, "r");
$contents = fread($handle, filesize($filename));
fclose($handle);
echo $handle;
ma il risultato è che il campo leght di fread deve essere maggiore di 0.... com'è possibile?
Come posso fare per risolvere questo problema qui?
AH, prima mi spieghi perchè stampi il puntatore a file e non il contenuto di ciò che hai letto (stampi $handle e non $contents)
Poi secondo me il filesize(); in questo caso si comporta come Serial.available(); sull'arduino. Quindi basta aggiungere un while:
$filename = "COM3";
$handle = fopen($filename, "r");
while(filesize($filename)<=0){
;//wait for some input
}
$contents = fread($handle, filesize($filename));
fclose($handle);
echo $handle;
ora piccolo problema... se ho ben capito tu apri il flusso in scrittura, mando il comando, chiudo il flusso, lo riuapri in lettura e leggi... ovvio che se nel frattempo l'arduino ti ha già risposto il messaggio viene perso. Quindi, se usi il codice arduino del primo post (e identate sto codice, in arduino sketch -> autoformat, non ci vuole nulla!) che però fa una serial.println("Qualcosa"); ogni volta che riceve un comando 8e sistemando un pò la logica, vedi sotto)...
il codice php diventa (apro il file in "rw" ovvero sia lettura che scrittura)
// lesto rulez :-D
$accendi = 'a';
$spegni = 'b';
//apertura del flusso
$filename = "COM3";
$handle = fopen($filename, "rw");
fwrite($handle, $spegni);
echo "Richiesta di spegnimento inviata, ";
while(filesize($filename)<=0){
;//wait for some input
}
$contents = fread($handle, filesize($filename));
echo "risposta arduino: ";
echo $contents;
fwrite($handle, $accendi);
echo "Richiesta di accensione inviata, ";
while(filesize($filename)<=0){
;//wait for some input
}
$contents = fread($handle, filesize($filename));
echo "risposta arduino: ";
echo $contents;
fclose($handle);
vabè per completezza metto pure quello arduino, che ha qualche "stranezza" logica (il comando di spegnimento NON era nell'if della serial avaiable, equindi si attivava ogni loop se il comando era 'b', niente di grave ma cpu sprecata), aggiunto un errore se il comando non è riconosciuto, aumentata la leggibilità con "else if":
int Led=13;
int incomingByte;
void setup()
{
pinMode(Led, OUTPUT);
Serial.begin(9600);
}
void loop()
{
if (Serial.available() > 0) {
incomingByte = Serial.read();
if (incomingByte == 'a') {
digitalWrite(Led, HIGH);
Serial.println("LED acceso!");
}
else if (incomingByte == 'b') {
digitalWrite(Led, LOW);
Serial.println("LED acceso!");
}
else{
Serial.print("comando NON riconosciuto: ");
Serial.println(incomingByte);
}
}
}
Non ho php o ethernet shield per testare, ma secondo me così funziona. senza perdere la testa con complicazioni in più (bridge tcp-com?!?!?! che bruttura!)
ps. okokok oggi sono polemico