Lecture du port com du PC

Signaler
Messages postés
18
Date d'inscription
jeudi 18 novembre 2004
Statut
Membre
Dernière intervention
2 décembre 2005
-
Messages postés
18
Date d'inscription
jeudi 18 novembre 2004
Statut
Membre
Dernière intervention
2 décembre 2005
-
Bonjour, j'essaye de lire le port COM1 de mon PC(des données venant d'un GPS y arrivent) avec le code suivant
<?php
fopen("COM1",'+r')
?>

et j'obtiens comme erreur '...failed to open stream.Permission denied in ...'

Je ne sais pas comment faire, cela fait une semaine que j'essaye de regler le problème

24 réponses

Messages postés
1406
Date d'inscription
mercredi 17 août 2005
Statut
Membre
Dernière intervention
28 août 2007
9
Salut,



Donne l'erreur en entier STP. "Permission denied in " ... quoi?
Messages postés
2350
Date d'inscription
mercredi 13 octobre 2004
Statut
Membre
Dernière intervention
18 avril 2015
4
<?php

// HOW TO USE PHP TO WRITE TO YOUR SERIAL PORT: TWO METHODS

$serproxy= true;

if ($serproxy) {

    // Use this code in conjunction with SERPROXY.EXE 

    // (http://www.lspace.nildram.co.uk/freeware.html)

    // which converts a Serial stream to a TCP/IP stream

    $fp = fsockopen ("localhost", 5331, $errno, $errstr, 30);

    if (!$fp) {

        echo "$errstr ($errno)";

    } 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);

    }

} elseif ($ com1 ) {

    // 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);

    }

}

?>D'apres PHP.net



Change w+ par r+ ? et fait une lecture ?



Messages postés
1406
Date d'inscription
mercredi 17 août 2005
Statut
Membre
Dernière intervention
28 août 2007
9
Ouah ! C'est du cash !!! Bravo... Faut que je retourne à mes études ;)



Mais juste un petit comment, histoire de t'embéter :)

Il ne suffira pas de chager le 'w' en 'r'. Because écrire est plus simple que lire.

Pour écrire, tu ouvres, t'envoi la sauce et tu te casse !

Pour lire, tu ouvres, t'attends impatiament que ça morde, tu chopes tout ce qui passe et tu te casses si y'a un caractère EOT!!!



Peut-être une socket est plus apropriée à ce genre de rigolade... Bien qu'entre fopen et fsockopen, la différence soit minime.



Bref... bonne chance
Messages postés
2350
Date d'inscription
mercredi 13 octobre 2004
Statut
Membre
Dernière intervention
18 avril 2015
4
J'ai pas trouvé pour la lecture, seulement pour l'écriture.



Enfin, la base est la, c'est déja un bon début. Ensuite il se charge du reste :)
Messages postés
18
Date d'inscription
jeudi 18 novembre 2004
Statut
Membre
Dernière intervention
2 décembre 2005

j'ai déjà utilisé ce code mais il ne donne aucune réponse, c'est pour cela que j'ai d'abord essayé fopen('COM1','+r').
Messages postés
18
Date d'inscription
jeudi 18 novembre 2004
Statut
Membre
Dernière intervention
2 décembre 2005

et la suite est 'permission denied in code.php in line 2, et line 2 c'est la ligne où il y a le fopen
Messages postés
18
Date d'inscription
jeudi 18 novembre 2004
Statut
Membre
Dernière intervention
2 décembre 2005

et avec le code elle marche en écriture mais pas en lecture , or j'ai besoin qu'elle marche en lecture
Messages postés
1406
Date d'inscription
mercredi 17 août 2005
Statut
Membre
Dernière intervention
28 août 2007
9
Fais une tentative avec fsockopen...

Le principe est quasiment identique, d'ailleur fopen("com1") utilise le même file wrapper que fsockopen



Mais c'est tout de même un peu plus dur, alors bonne chance =>
PHP: Hypertext Preprocessor
Messages postés
18
Date d'inscription
jeudi 18 novembre 2004
Statut
Membre
Dernière intervention
2 décembre 2005

est-ce que tu peux me montrer un code avec fsockopen pour ouvrir le code(pas une adresse, ni udp)


C'est peut-être mais d'après ce que j'ai lu sur php, c'est une question de permission, quelque chose comme un fichier .htacces à créer, ou quelque chose à modifier dans httpd.conf de Apache.
Messages postés
1406
Date d'inscription
mercredi 17 août 2005
Statut
Membre
Dernière intervention
28 août 2007
9
Je n'ai jamais fait ce genre de chose (connection COM1). Donc je ne vais plus vraiment t'être d'un grand secours. Désolé!



Je t'ai indiqué la solution des sockets car une connexion de socket ce fait toujours sur un port.

Tu ne te connecte pas à udp ou à une adresse mais à 154.87.23.56:80
=> port http de la machine 154.87.23.56. De même pour le port udp
154.87.23.56:??. Bref tu comprend, j'ai fait la relation entre le port
COM et un port quelconque.



Tu trouveras des milliers de sources utilisant fsockopen sur ce site. De même, sur le site officiel de PHP (Encore lui :
PHP: Hypertext Preprocessor), tu trouveras à gaver d'exemples très didactiques (voir fonction fsockopen).



Une fois que tu maitrise un peu ce principe, démerde toi pour arriver à bon port : COM1. Et le tour est joué.



Voici comment je vois les choses. Mais vu que je suis au boulot... Ne compte pas sur mon aide avant ce soir.



A+
Messages postés
18
Date d'inscription
jeudi 18 novembre 2004
Statut
Membre
Dernière intervention
2 décembre 2005

mais le fsockopen d'après php n'ouvre que des urls tels http et udp non pas des ports
Messages postés
1406
Date d'inscription
mercredi 17 août 2005
Statut
Membre
Dernière intervention
28 août 2007
9
Salut...



Bon, tu as raison. Quoique la première méthode présentée par FhX utilise fsockopen.



Par ailleur, quelque ligne plus loin, sur la même page de fr.php.net on trouve ce post. Qui devrait franchement t'intéresser



php at themastermind1 dot com

24-Oct-2001 07:37



I have found that I can do fopen("COM1:", "r+"); to open the comport in
windows. You have to make sure the comport isn't already open or you
will get a permission denied. (J_G => ben ouai, c'&#233;tait &#233;vident )



I am still playing around with this but you have to somehow flush what
you send to the comport if you are trying to communicate realtime with
a device.
Messages postés
18
Date d'inscription
jeudi 18 novembre 2004
Statut
Membre
Dernière intervention
2 décembre 2005

j'ai vu ce code et c'est de là que je suis parti mais je ne comprends pas ce qu'il veut dire par "make sure the comport is already open". Etre sûr que le port COM n'est pas déjà ouvert, mais le port COM doit être ouvert pour que les données puissent y arriver. Je dois récuperer des données qui arrivent vers le port COM
,peut-être fopen("COM1:","r+")ne marchera jamais pour mon application
Messages postés
1406
Date d'inscription
mercredi 17 août 2005
Statut
Membre
Dernière intervention
28 août 2007
9
"mais le port COM doit être ouvert pour que les données puissent y arriver"

Oui... Mais c'est toi qui doit l'ouvrir !!!! Enfin quand je dis "toi", je parle de ton serveur PHP.

Donc, si tu as une imprimante d'installé sur ce port, de fortes chances
que Windows ai déjà ouvert le port pour attendre patiemment une page à
envoyer. (Je divague beaucoup là... Ne tiens pas rigueur de ces propos)



Peut être peux-tu utiliser une de ces fonction pour voir dans quel état est le port avant ton fopen()

http://fr.php.net/manual/fr/function.file-exists.php

http://fr.php.net/manual/fr/function.stat.php

http://fr.php.net/manual/fr/function.is-writable.php

http://fr.php.net/manual/fr/function.is-readable.php



PS : Je suis toujours au boulot...
Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
25
Hello,



is_readable () sur un port COM tenverra true de toutes façons.

fileperms () donnera (sous win en ts cas ) 0666.

Et fopen () avec r échouera malgré tout...Il a raison, le port COM est
forcément déjà ouvert s'il l'utilise avec une appli. Donc le lire
semble vouer à l'échec (en php). C'est sans doute aussi pour ça que le
petit script ne fait qu'y écrire : il est fermé, c'est php qui va
l'utiliser, uniquement.

On peut peut-être essayer de le fermer d'abord, mais les données envoyées dans ce cas...

Mon avis (il vaut ce qu'il vaut) : tenter de rediriger les données
envoyées sur le port COM dans un flux quelconque, mais autre que le
port COM (peut-être même en php, avec exec(), passthrue() et cie), et
lire ce flux avec php.

De toutes façons, un truc tout con : essayez de lire un fichier en php
déjà ouvert par une autre appli...commment lire un fichier Excel en
php, quand Excel est ouvert sur ce fichier et y écrit des données en
même temps? Même en lecture seule, je pense que ça échouera (je n'ai
jamais essayé hein). On doit d'abord fermer le fichier.

Après je ne m'y connais pas assez en ports COM pour dire exactement
quelle serait la bonne démarche. Il y a sûrement moyen de
rediriger son flux. Peut-être même qu'une fois fermé il les garde (j'ai
des doutes hein lol), qui sait.

Enfin bref, je pense que tu n'es pas sorti de l'auberge, Kisaka.
Messages postés
1406
Date d'inscription
mercredi 17 août 2005
Statut
Membre
Dernière intervention
28 août 2007
9
Salut les gars,



"je pense que tu n'es pas sorti de l'auberge, Kisaka."

Ben ouai Kisaka... t'en es où ?



Malalam (ou kisaka) : as tu essayé la fonction stat ? Je porte beaucoup d'espoir dessus... ;)

(Je peux pas le tester... A mon boulot, mon directeur technique a du
dire le mot "Microsoft" avant de dire "Maman", "Papa" ou mêm "Pipi" ...
! Et j'ai pas eu le temps hier soir)
Messages postés
2350
Date d'inscription
mercredi 13 octobre 2004
Statut
Membre
Dernière intervention
18 avril 2015
4
"essayez de lire un fichier en php déjà ouvert par une autre appli" Pas besoin d'aller aussi loin.

Quand tu ouvres un fichier via fopen() par exemple,il faut savoir que
le temps que tu met à traiter ton fichier jusqu'à fclose(), le fichier
est automatiquement bloqué en lecture/écriture.
Messages postés
1406
Date d'inscription
mercredi 17 août 2005
Statut
Membre
Dernière intervention
28 août 2007
9
PS :

Un truc, peut-être utile, mais pas la solution ! : fopen("com1","rb");

A mon avis, mieux vaut ouvrir le flux en biainre...



Ceci dit, en passant, toujours pas de nouvelle du principal intéressé...

Domage, le sujet est intéressant!



FhX => Chuis pas d'accord... Un simple argument : à quoi pourrait bien servir la fonction flock() alors ???

http://fr.php.net/manual/fr/function.flock.php
Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
25
J_G => Je ne peux pas non plus essayer stat () . Au boulot, c'est
Crosoft aussi, et chez moi...mon pc est indisponible ;-) (je viens de
déménager, on m'a volé des câbles, mon écran est nase...enfin bref, on
verra plus tard!).

flock () est justement peut-être une solution...en tous cas, ça mérite
d'être essayé. D'ailleurs, puisque c'est la pause déjeûner, je vais
essayer de ce pas ;-)





Et tant pis pour l'intéressé de ce thread, au passage, lol...
Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
25
Beuh chuis con moi, faudrait déjà avoir un pointeur sur le fichier, pour ça...