Ricezione Dati da Seriale in PHP

Stato
Chiusa ad ulteriori risposte.

IK5NTH-Mauro

Nuovo Utente
11 Ott 2010
5
1
0
Salve a tutti,
Ho creato una funzione in PHP che legge i dati da porta seriale.
La funzione interagisce, sempre tramite seriale, con una scheda; invia un comando e si aspetta una risposta. Tutto funziona ok salvo il fatto che se la scheda non risponde la pagina web rimane in attesa fino all'esaurimento del time-out mostrando il fatidico messaggio "pagina inestitente.
Vorrei integrare un time-out nella mia funzione ma non riesco a farlo.Vi posto il codice della funzione così come è adesso.

function AttesaRisposta()
{


$filename = "/dev/ttyS2";
$fd = fopen($filename, "r" );

do{

$Char=fgetc($fd);
$Lettura = $Lettura . $Char;

}while($Char != "\n");

fclose($fd);

return $Lettura;

}
Per chiarezza: se non ricevo niente entro 2 secondi assegno a $Lettura = Errore ed esco
Grazie.
Mauro
 

genoma

Nuovo Utente
11 Ott 2010
8
0
0
Bologna
Se il problema è che raggiungi il timeout nell'apertura del file, credo che l'unica sia inserire un
Codice:
set_time_limit (2);
che non ti da la possibilità di gestire l'errore, ma di ridurre il tempo di esecuzione dello script a 2 secondi.

Sinceramente è l'unica cosa che mi viene in mente.
 

IK5NTH-Mauro

Nuovo Utente
11 Ott 2010
5
1
0
Se il problema è che raggiungi il timeout nell'apertura del file, credo che l'unica sia inserire un
Codice:
set_time_limit (2);
che non ti da la possibilità di gestire l'errore, ma di ridurre il tempo di esecuzione dello script a 2 secondi.

Sinceramente è l'unica cosa che mi viene in mente.

Grazie del suggerimento, l'ho messo in pratica, ma la gestione dell'errore derivato sarebbe abbastanza importante. Sono abbastanza digiuno di PHP ed ho iniziato da poco, ma mi sembra strano che non ci sia una strada "semplice" per ottenere quanto richiesto da un linguaggio così potente. Sono evidenti tutte le mie lacune materia...
Grazie ancora.
Mauro
 

genoma

Nuovo Utente
11 Ott 2010
8
0
0
Bologna
Si anche io ho ripreso col PHP da un paio di mesi, non sono ancora oliatissimo, comunque, mi sono venute in mente due cose:

1) cambiare il ciclo di while, anzi eliminarlo proprio e sostituire fgetc con file_get_contents($fp), poi eventualmente modificare la stringa con un explode() ed estrarre con un array_splice() i contenuti della stringa che effettivamente ti interessa vedere? In questo modo puoi mettere un errore nel caso in cui il risultato della funzione sia vuoto.

2) Inserire una sorta di timer nella funzione che hai ora, con due variabili:
Codice:
$timeout = $time() + 2;
$time = $time;
dove $time si aggiorna alla fine del ciclo di while ed un if ($time <= $timeout) all'interno del while come condizione all'esecuzione dello stesso.

Il problema dello script che hai è che il ciclo di while non ha un uscita nel caso in cui il file aperto sia vuoto, dunque il timeout error. Comunque, per aver maggiori informazioni sugli errori degli script, bisognerebbe avere x-debug attivo nel server php, altrimenti diventa dura :)

Ciao e buona giornata!
 

IK5NTH-Mauro

Nuovo Utente
11 Ott 2010
5
1
0
Grazie di nuovo per il suggerimento, stamani (tempo permettendo) cerco di metterlo in pratica. E' vero, il codice che ho non consente l'uscita dal ciclo se il file è vuoto (=se non arrivano caratteri). Le funzioni che mi stai suggerendo non le ho mai usate, quindi occorre che mi documenti leggendo il manuale, ben inteso che già lo sto facendo, ma azzeccare subito quelle giuste è dura se non altro per il fatto che ne esistono veramente un'infinità. Per inciso devo dire che la funzione che sto tentando di far funzionare l'ho già implementata anni fa in C (io provengo da lì...) usando dei micro della Atmel (ATMega128) e in questo caso non mai ha dato problemi di sorta. IL problema risiede propio nel fatto che la funzione resta in attesa di dati all'interno del while....
Grazie infinite per l'aiuto, ti terrò informato sull'esito.
Mauro
 

genoma

Nuovo Utente
11 Ott 2010
8
0
0
Bologna
Guarda stamattina sono impegnato e oggi pomeriggio non so quando mi libero, ma se riesco faccio una prova in locale con un file vuoto per implementare il codice e passartelo per provare a vedere se riusciamo ad uscirne fuori :)

Un saluto e buona giornata!
 

alessandro1997

Utente Attivo
6 Ott 2009
5.302
1
0
26
Roma
alessandro1997.netsons.org
Se il problema è la visualizzazione dell'errore puoi disabilitare completamente l'error reporting:
PHP:
error_reporting(0);
Oppure catturare l'errore:
PHP:
ob_start();

// tutto il ciclo che può generare errore

$contents = ob_get_contents();
ob_end_clean();

if($contents == 'testo di errore')
  echo 'Errore. Riprova in un altro momento.';
Ovviamente questo va gestito insieme al timeout.
 

genoma

Nuovo Utente
11 Ott 2010
8
0
0
Bologna
Dopo averle provate tutte, questa funzione dovrebbe ... funzionare.

Codice:
function AttesaRisposta() {
	$filename = "/dev/ttyS2";
	$fd = fopen($filename, "r" );
	//definisce variabili
	$Lettura=NULL;
	$Char=NULL;
	$check_time = time();
	$timeout=time()+2; //tempo di esecuzione while loop 2 secondi
	
while($Char != "\n") {//inizio while loop exit: nuova linea
	if ($check_time <= $timeout) {//controlla durata loop
			$Char=fgetc($fd);
			$Lettura = $Lettura . $Char;
			$check_time = time();//aggiorna durata del loop
	} else {
		break;//se superiore a $timeout esci dal loop		
	}	
}
	fclose($fd);
	If ($Lettura) {//se $Lettura è presente
		return $Lettura;
	} else {
		$Lettura = 'errore di timeout'; //puoi cambiare il valore di lettura (es: $Lettura = false;) per poi usarlo in un condizionale e filtrare il risultato
		return $Lettura;
	}
}

per chiamare la funzione

Codice:
$lettura = AttesaRisposta();
echo $lettura;

Dovrebbe, e sottolineo dovrebbe, funzionare, magari personalizza l'uscita dell'errore a tuo piacere per completarla come preferisci.

Fammi sapere :)

P.S.
Chiedo scusa per il triplo edit carpiato, la fretta è una pessima consigliera :)

P.P.S
Commentato e cambiato il nome ad alcune variabili per chiarezza
 
Ultima modifica:

IK5NTH-Mauro

Nuovo Utente
11 Ott 2010
5
1
0
Eccomi, dopo una giornata di lavoro intensa,
Vi ringrazio per gli aiuti, comunque, nonostante gli svariati tentativi lo script contina a bloccarsi nel caso la seriale non risponda (per es. cavo scollegato).
Ieri notte mi ci sono incaponito, ma non sono riuscito a risolvere, Ho provato il codice che ho trovato nella risposta, effettivamente con il nome del file al posto di /dev/ttyS2 sembra che vada, probabilmente il vero problema è la maniera di gestione a basso livello della funzione PHP di lettura della porta. A questo punto credo che tenterò la strada del "C", nel senso che compilerò un pezzo di codice per poi richiamarlo con il comando exec.
Questo metodo già lo utilizzo per gestire alcuni I/O della scheda interfaccia (quella che risponde in seriale per intenderci), naturalmente ciò mi comporterà il problema di reimportare il risultato di queste chiamate dentro il PHP, ma esiste sempre la possibilità di scrivere e leggere file...
Vi terrò informati.
Grazie per iltempo che mi avete dedicato, se a qualcuno interesserà potrò mettere a disposizione il codice "C" dopo averlo testato.
Mauro
 

genoma

Nuovo Utente
11 Ott 2010
8
0
0
Bologna
Quello è un discorso che infatti non fa testo, lo script l'ho infatti testato su un file bianco e poi popolato, non ho tenuto in conto del resto perchè non ho proprio i mezzi per testare il tutto.

Se quello che devi leggere è un file, puoi eventualmente aggiungere un condizionale per vedere se il file è presente o meno, in tal caso dovresti riuscire a controllare anche quell'evenienza.

PHP:
if (file_exists($filename)){
                 //do this
            } else {
                 //dothat
            }

In ogni caso buona fortuna!
 

IK5NTH-Mauro

Nuovo Utente
11 Ott 2010
5
1
0
Alla fine l'ho smazzata a modo mio!
Ho creato uno script in C che gestisce la ricezione seriale dove, ovviamente, il time-out funziona.
Questo script, una volta compilato, viene chiamato dal codice php tramite la funzione exec. A questo punto il compilato C ascolta la seriale e - in caso di traffico dati su quest'ultima - popola, con questi, una stringa che viene salvata su un file.
Se non ci sono caratteri da ricevere dopo 5 secondi scatta il time-out e la stringa viene popolata con un opportuno messaggio di errore. Ho anche inserito un carattere di controllo (<cr>) usato come terminatore di stringa in caso di ricezione.
Al termine di questo giochetto il controllo ritorna al php che lagge il file creato dalla funzione, usando la stringa per visualizzarla sulla pagina HTML.
Non credo che questo sia il miglior modo di gestire la cosa, ma non sono riuscito a fare di meglio. Mi sarebbe certamente piaciuto molto di più realizzare tutto in PHP.
Un altro (piccolo) problema è rappresentato dal recupero del dato creato dal compilato C. Sono dovuto passare attraverso la creazione e lettura di un file che non rappresenta certo il max. Vorrei percorrere altre strade, ma non so quali, infatti le funzioni exec o passthru gestiscono anche dati di "ritorno", ma nel caso del C non so come sia possibile restituire a queste una stringa...
Se avete suggerimenti sono veramente ben accetti, se a qualcuno interessa il compilato C o il sorgente non ha che da farsi avanti.
Mauro
 
  • Like
Reactions: filibertomariani

Max 1

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
29 Feb 2012
4.449
338
83
@filibertomariani
Non ti accodare a discussioni di altri con quesiti tuoi!
Apri una discussione tutta tua nella sezione idonea!
Ti prego inoltre di leggere attentamente il regolamento del forum
Grazie
 

filibertomariani

Nuovo Utente
13 Set 2018
1
0
1
@filibertomariani
Non ti accodare a discussioni di altri con quesiti tuoi!
Apri una discussione tutta tua nella sezione idonea!
Ti prego inoltre di leggere attentamente il regolamento del forum
Grazie
Chiedo scusa, non ho letto attentamente il regolamento del forum, ma temo neanche tu abbia letto il mio post, altrimenti ti saresti accorto che non mi asono accodato con "quesiti miei" ma avevo esattamente lo stesso problema discusso nel topic, inoltre non ponevo proprio quesiti, né "miei" nédi altri, semplicemente facevo seguito all'invito dell'utente di "farsi avanti" se si aveva bisogno del compliato C o del sorgente.
Comunque, il capo sei tu, fai come credi. :)
 
Stato
Chiusa ad ulteriori risposte.
Discussioni simili
Autore Titolo Forum Risposte Data
L Ricezione dei dati su file php da modulo html PHP 6
P [PHP] Ricezione dati da form PHP 10
K Gestione ricezione dati da socket e polling PHP 15
E Promblemi applet - ricezione dati Java 7
helpdesk dati di ricezione dopo il login PHP 6
A Ricezione dati di ritorno da una classe PHP 1
Sergio Unia Ricezione email con destinatari multipli [Risolto] PHP 2
M [PHP] Problema script ricezione e invio posta... PHP 1
A Ricezione corpo email vuoto PHP 2
F Problemi con ricezione mail dal form PHP 8
A IPad Air problema ricezione mail Smartphone e tablet 0
S [RISOLTO] Problemi di ricezione posta Adsl e Connettività 5
Frank10 Thunderbird: tempo ricezione delle e-mail Posta Elettronica 1
F invio e ricezione sms PHP 4
max_400 Problema apostrofo nella ricezione della variabile per poi scriverla dentro un file PHP 6
max_400 php: refresh solamente alla ricezione dei dai - by max4001976 PHP 4
M Proglema di ricezione email Classic ASP 3
G Mail service per invio/ricezione e-mail Posta Elettronica 3
N Problemi ricezione posta su Outlook Express Posta Elettronica 1
max75 query su due tabelle e dati doppioni MS Access 2
K Form che manda dati doppi PHP 1
T problemi con dati menu a tendina HTML e CSS 2
D protezione cartelle: blocco visualizzazione/scaricamento contenuto, ma abilitazione utilizzo dati da parte di file .php presenti sul sito Web Server 1
D Risultati diversi elaborazione dati fra localhost e Altervista PHP 0
C Creare Tabella Dati Meteo prelevandoli da dei Tags in un altro foglio PHP 27
M Invio dati database via email php PHP 0
K [php]form invio dati PHP 0
peppe0703 Come Estrarre dati da db wordpress e richiamarli in html esterno HTML e CSS 0
V dati scomparsi dal sito HTML e CSS 3
M Memorizzare i dati nei campi prima dell'invio al db PHP 4
A Stampare dati da form PHP 15
E Estrarre dati da doppia tabella, banale ma non sempre PHP 1
Couting95 inserire dati da un file di testo in una tabella in php PHP 1
F Scrivere dei dati in word con php PHP 0
otto9due $_FILE non passa i dati dal form PHP 1
N dati tabella non presi PHP 1
M Riportare in tabella HTML dati estratti con query SQL MySQL 0
I Assegnare dati fetch request ad una variabile globale Javascript 0
L PHPSpreadsheet inserire dati da file .xlsx/.xls su database PHP 2
L inserimento form dati multipli ? PHP 0
S Leggere dati da API e visualizzarli PHP 0
S problema con recupero dati tabella mysql PHP 2
E Progressbar estrazione dati da tabella mySQL Ajax 9
A invio massivo dati a file php Javascript 4
M Inviare dati nel db dopo risposta alert PHP 0
A recuperare i dati passati nel post PHP 1
L Estrazione dati php Database 6
L Estrazione dati casuali non doppioni MySQL 1
F Leggere e aggiornare dati di campi <input text> su file di test PHP 0
J Form inserimento dati in database Ajax 1

Discussioni simili