Ecrire et lire (sans blocage) sur un Port COM série RS232 en PHP

Description

bonjour,
En recherchant sur le net comment accéder à la liaison série en PHP, j'ai vu que pas mal de développeurs PHP avaient du mal, comme moi, à piloter un port COM série via PHP, surtout sous Windows.
Et donc moi même aussi, j'ai bien galéré pendant un long moment avant de trouver une solution acceptable !!
(notamment en me décidant finalement à lire les tutos sur les Extensions et les sources de la DIO).
Lire ceci pour commencer :
--> https://codes-sources.commentcamarche.net/forum/affich-10105000-cherche-documentation-pour-concevoir-1-extension-php-port-serie
--> https://www.developpez.net/forums/d2107223/php/langage/recherche-documentation-concevoir-1-extension-php/

J'avais même été jusqu'à développer en C++ sous Qt (avec le composant, la classe "QSerialPort" ) une solution intermédiaire mitigée, aboutissant à 1 exécutable perso opérationnel nommé "QtComSerieX.exe" proche de celui "comxs.exe" présent en fin de page web ici sur le lien suivant :
--> https://radiovibrations.com/techblog.php?i=10
appelé en PHP avec l'instruction suivante :

// émission + réception sur port Com
$result = shell_exec( "QtComSerieX.exe $comport $attente2 $envoi" ) ;
// $attente = délai d'attente (timeout) avant de sortir de l'exécutable.
...

Cela n'était que des solutions PHP intermédiaires mitigées avec un port COM qui est constamment permuté en ouvert puis fermé lorsque le script PHP est exécuté via un client navigateur web.

En fait, ce n'est pas l'extension Direct-IO (DIO) qui ne fonctionne pas bien, c'est juste la Ducobumentation technique "Officielle" qui n'est pas à jour ici :
--- https://www.php.net/manual/fr/book.dio.php

De mon côté maintenant, ça fonctionne en écriture et lecture sans blocage (no blocking), mais il ne faut pas utiliser les fonctions de base mentionnées dans cette doc incomplète :
(qui fonctionnent, mais pas comme on voudrait)
- pas de perte de données à la lecture! --> BIEN !!

Mon 1ier exemple donné ci-joint "Direct_IO_test_1.php" fonctionne en mode console "cmd.exe" (PHP CLI) sous Windows-10 x64 avec la dll DIO version 0.1.0
( http://pecl.php.net/package/dio --> Thread-safe pour Apache ) installée et le moteur PHP : PHP5630vc11x86 :


*
            • SVP voir le code source du script PHP "Direct_IO_test_1.php" en appuyant sur le bouton en haut à gauche ******


Pour requéter DIO via un client navigateur web (type Firefox ), mais je n'ai pas encore testé :

- on bannira forcément les boucles ; on peut basiquement rafraîchir la page web .. mais veiller à ce que le script PHP en exécution se termine bien après avoir
refermer le port COM ouvert avant de quitter et de fermer le navigateur web !!! .... --> MOYEN BIEN !
Rappel : bien se remémorer que DIO (comme tout script PHP) fonctionne toujours côté serveur en PHP !

... ou + pro encore, utiliser DIO dans un serveur de websocket, écrit en PHP (fonctionnant en console "cmd.exe" côté serveur), requété, via 1 navigateur web,
par un client léger websocket écrit en html/javascript : mais dans ce cas, il faudra 1 port TCP en + pour le websocket ; --> BIEN !!
... mais là, y du taff !! ...

Bonne programmation Hardware PHP,
cordialement, A++ Did

PS :
- les caractères points-virgules apparaissant dans l'image de la console jointe sont là uniquement pour prouver que la lecture n'est pas bloquante !
- voir aussi le post associé nommé : "Outils logiciels sur RS232 pour créer des ports série virtuels"

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.