IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[Système] Lecture de données sur le port Série avec PHP


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2006
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 31
    Points : 23
    Points
    23
    Par défaut [Système] Lecture de données sur le port Série avec PHP
    Salut,
    Pour un projet d'étude, j'essaye de mettre en place un système de lecture de TAG RFID via le port série, avec un traitement sous PHP.

    L'environnement :
    Windows XP / EasyPHP 1.8 (donc PHP 4.3.10)

    Le code (de test) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <?php
    exec(`mode com4: BAUD=4800 PARITY=N data=8 stop=1 xon=on`);
    $flux = fopen ("COM4:", "r");
    if (!$flux) {echo "Erreur d'ouverture du port.";} 
    else {
    echo "Lecture des données :";
    $resultat = fgets($flux,10);
    echo $resultat;
    fclose ($flux);
    }
    ?>
    L'erreur :
    La page se charge, se charge, se charge et rien n'apparait ...

    Cela doit donc signifier qu'il reste figé sur la ligne de lecture des données !
    (J'ai essayé fgets et fgetc : idem)

    Sous hyperterminal, aucun probleme tous s'affiche correctement.
    Mais impossible d'obtenir le moindre caractère avec PHP.

    Après quelques recherches, j'ai trouvé le jeu de fonction dio*, mais elle ne semblent pas fonctionner sous windows !

    On ne peut pas dire que ce code soit compliqué ! J'ai aussi essayé de choper des caractères à'lintérieur d'une boucle, mais dans tous les cas, il semble que le code PHP ne passe pas la première lecture de données.

    Mes Questions :
    1 - Quelqu'un à t il une idée de la raison pour laquelle cela ne fonctionne pas ?
    2 - Est ce que l'un de vous a déjà utilisé le port série pour ce genre d'application ?
    3 - Comment faire un code propre pour que la lecture du port série se fasse en continue, une fois que la page est chargée ? (et non pas à l'ouverture de la page)
    4 - Peut on être sur que le exec(mode com ...) fonctionne bien ?
    5 - Des commentaires ?

    Merci pour votre aide ...

  2. #2
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Salut

    Je fais court car je ne voudrais pas dire trop de bêtises. Il me semble que l'un des ports (série ou parallèle) est bloqué sous WinXP et qu'il faut utiliser une DLL spéciale pour y avoir accès.
    Sinon, est-ce que PHP est la meilleure méthode pour le faire ? Si tu souhaites que PHP s'exécute en continu, tu as deux options : le lancer par un shell ou en utilisant PHP-GTK.

  3. #3
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut Re: Lecture de données sur le port Série avec PHP
    Citation Envoyé par slokix
    4 - Peut on être sur que le exec(mode com ...) fonctionne bien ?
    Quand tu tape la commande dans la console, qu'est ce qui te fait dire que ca marche ou pas ?
    ben là, c'est pareil il faut analyser le résultat de la commande. voir les fonctions systemes car chacune renvoie différents résultats exec/passthru/system

  4. #4
    Nouveau Candidat au Club
    Inscrit en
    Septembre 2007
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Bonjour,


    Moi aussi je suis entrain de me casser les dents sur ce probleme.

    Comme toi, j'aimerais lire les données de mon port serie avec PHP, alors si tu as la solution je serais ravi de la connaitre.

    Je continu mes recherches et si je trouve un truc, je t'en fait part.

    A bientot

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juillet 2011
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    Coucou ! Merci pour la solution qui ne marche pas, car j'en ai fait une qui marche !
    J'utilise PHP 5.2.17 et Windows 2000, pas Windows XP (mais ça devrait être pareil).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $flux = fopen("COM3", "w+");
    if (!$flux) {
    	echo '<font color="red">Erreur d\'initialisation de la communication.</font>';
    } 
    else {
    	fputs($flux, '1?'."\r\r");
    	echo 'Donnée lue&nbsp;:';
    	$resultat = fgets($flux); // Fonctionne car <LF> en fin de trame. Utiliser fgetc avec le nombre d'octet désiré sinon.
    	echo $resultat;
    	fclose($flux);
    }
    Changement par rapport à la proposition de départ :
    - enlevé les 2 points sur le n° de port COM,
    - remplacé 'r' (lecture seule) par 'w+' (lecture + écriture) dans la commande fopen,
    - envoyé une commande avec fputs, interrogeant le µC pour recevoir une réponse (sinon attendre que le µC envoie un message tout seul),
    - fgets utilisé sans 2ème argument : fgets lit la ligne en cours, et s'arrête dès qu'un caractère <LF> est reçu (ASCII 0x0A), qui est envoyé à chaque fin de message de mon µC.

    L'utilisation de fgets doit être faite avec prudence : tant que <LF> n'est pas reçu, ça tourne. Et en tant que module pour Apache HTTPD, PHP ne libère pas le port avec fclose comme il l'aurait fait sinon, et vous serez obligé de redémarrer Apache HTTPD pour le libérer.

    Si vous voulez lire jusqu'à réception d'un certain caractère ou alors lire un nombre d'octets fixe, il faut utiliser fgetc à la place pour lire un octet à la fois.

    Merci pour la solution simple à mettre en œuvre !

    P.S. : Je ne me suis pas dispensé d'exécuter un mode COM3 au début avant ce morceau de script. J'utilise la fonction de console Windows echo ...> COM3 pour envoyer des commandes simples. Mais attention, echo ajoute un <CR> et un <LF>, qui doivent être correctement gérés par le µC.

    EDIT : J'ai redémarré le serveur, et je n'arrive plus à lire quoi que ce soit. J'arrive par contre à écrire. Je cherche la source du souci.

    EDIT2 : Tout n'est pas perdu : j'ai récupéré l'accès. Je vais chercher ce qui a débloqué l'accès, pour être certain.

    EDIT3 : Tout semble vouloir dire que c'est l'HyperTerminal de Windows 2000 qui débloque la solution. J'ai même essayé la commande type COM3, et rien ne s'affiche. Je n'ai donc qu'une seule explication : le système lui-même n'autorise pas la lecture du port COM3. Si cela n'a pas été vu sous Windows XP, c'est peut-être parce que son HyperTerminal (qui a été mis à jour) remet le port dans son état d'origine. Je cherche une solution pour ne pas avoir à le lancer manuellement sur mon serveur...

    EDIT4 : Avec mes tentatives de résolution, même l'HyperTerminal ne reçoit plus rien du port COM3 tout en pouvant émettre ! Bon je cherche encore une solution malgré tout, mais j'avoue être en grande difficulté.

    EDIT5 : Ouf, ce problème généralisé était en fait lié à ma connectique peu robuste : cordon RJ45 droit non blindé de 30 mètres pour faire de la transmission UART avec télé-alimentation 5V... Mais ça marchait sans problème au début !
    Je reprendrai mes tentatives de solution et en ferai part à qui veut bien (ici c'est mort à ce que je vois).

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juillet 2011
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    Ouf, solution trouvée : exécution d'un programme en tant que service à l'aide de l'outil SRVANY et utilisation de la commande SLEEP du Windows Server 2003 Resource Kit Tools dans le batch utilisé.

    1er test non fonctionnel : service qui lance un programme en Visual Basic exploitant MSCOMM32.OCX et lançant la commande mode COM3 via un batch après attente de 1 seconde (SLEEP). Mais c'est KO : au lieu de ne plus avoir de réponse du tout (tourne en boucle), j'ai une réponse vide. C'est bien mieux, mais ça ne sert à rien pour lire.

    2ème test fonctionnel : service qui lance un batch tout simple, qui lance le mode COM3, qui lance un 2ème service qui charge l'HyperTerminal avec une connexion sauvée (dans ce cas le port s'ouvre sans intervention), et qui arrête ce même service 20 secondes plus tard (avec SLEEP).

    Pour tous les détails répondez à la suite pour me le demander !

  7. #7
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    c'est soit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    `mode com4: BAUD=4800 PARITY=N data=8 stop=1 xon=on`;
    soit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    exec('mode com4: BAUD=4800 PARITY=N data=8 stop=1 xon=on');
    mais pas les 2


    si tu veux ouvrir un processus regarde du coté de popen ou proc_open

  8. #8
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juillet 2011
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    Seule la 2ème proposition est correcte, évidemment.

    Dans ma solution, la fonction exec('mode COM3: ...') ne figure plus dans mon code PHP car je l'exécute une seule fois au lancement du système.

    Par contre après que j'aie lu le résultat d'une commande envoyée à mon µC, je fais une petite attente avec cette ligne de PHP : qui permet simplement de ne pas bourrer, sinon ça plante et je me retrouve avec des caractères non lus lors de l'envoi de la commande suivante.

Discussions similaires

  1. [Débutant] simplfier ma reception de donné sur le port série
    Par gastoncs dans le forum VB.NET
    Réponses: 0
    Dernier message: 13/01/2012, 23h44
  2. Lecture de donnée à partir de port série
    Par Sonda09 dans le forum MATLAB
    Réponses: 2
    Dernier message: 25/09/2011, 15h38
  3. ecriture de données sur le port série
    Par sanatou dans le forum Windows
    Réponses: 2
    Dernier message: 20/12/2006, 18h09
  4. Envoyer des données sur le port série
    Par jbidou88 dans le forum Flash
    Réponses: 3
    Dernier message: 18/09/2006, 11h33
  5. [javax.comm] Envoyer des données sur le Port série
    Par deuspi dans le forum Applets
    Réponses: 2
    Dernier message: 29/08/2006, 09h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo