Bonjour,
J'ai un problème et peut être vous allez savoir y répondre, il est pas compliqué à exposer et à cerner mais il peut être compliqué à résoudre voir impossible (j'espère pas) si PHP ne le permet pas.
C'est à propos d'un problème de communication avec le port série.
J'appel une fonction (ci-joint) qui est censée écrire une température de chauffage dans un régulateur pour cela j'initialise mon port série avec la fonction fopen() jusqu'à la pas de problème l'initialisation du port avec ses caractéristiques fonctionne.
`mode com2: BAUD=9600 PARITY=E data=8 stop=1 xon=off`;
$fp = fopen ("COM2:", "w+");
Ensuite je crée une variable qui contient ma trame de données à envoyer
(trame modbus que je dois envoyer en caractères héxadécimaux). Dans l'exemple je veux écrire une valeur de consigne de 123°C. Après je pourrais toujours m'arranger pour que la valeur à envoyer soit une variable issu de la base de données.
$e = chr(27);
//DEMANDE D'ECRITURE
$string = $e . "00"; //adresse de l'esclave (ici ecriture en broadcast)
$string .= $e . "06"; //fonction ecriture ou lecture
$string .= $e . "0C"; //debut adresse code table
$string .= $e . "6C"; //fin adresse code table
$string .= $e . "00"; //valeur
$string .= $e . "7B"; //valeur
$string .= $e . "0B"; //CRC byte 1
$string .= $e . "75"; //CRC byte 2
Pour être sûr de ma trame à envoyer est correcte j'ai installé un logiciel qui me permet de simuler l'envoie de trame
qui s'appelle Multiway. Lorsque j'envoie 00060C6C007B0B75 à partir de ce logiciel la valeur de consigne (123°C) est écrite et afficher sur le régulateur. J'en conclue que la structure de ma trame est correcte.
Enfin je viens envoyer les données à l'aide de l'instruction "fputs" ou "fwrite" (j'ai essayé les deux).
J'utilise ces instructions car je viens écrire sur le port série comme si on vient écrire dans un fichier.
fputs ($fp, $string );
Quand je test rien ne se passe : ni écriture de la valeur, ni génération d'erreur.
J'ai donc installé un logiciel qui me permet analyser les données lues et écrites sur le port série qui s'appel
free serial port monitor et j'ai regarder ce que j'envoyais précisement d'une part avec le logiciel Multiway avec lequel l'écriture de valeur fonctionne et d'autre part avec mon code que j'ai écris.
Evidemment les données envoyées ne sont pas interprétées de la même manière :
- avec Multiway les données envoyées (voir image jointe) sont interprétées dans le même format donc l'écriture de la valeur fonctionne (je lui envoie des codes héxadécimal donc le régulateur comprend)
- avec mon interface (voir image jointe) les données envoyées (de la variable string) sont interprétées octet par octet et converties en ASCII (c'est mon avis mais je pense qu'il est juste) donc évidemment ça ne fonctionne pas.
Je me suis donc intéressé aux instructions fwrite et fputs et dans la documentation PHP ci-jointe et j'ai remarqué que ces instructions envoient une variable en paramètre de type string (chaîne de caractère).
Je crois que le problème vient d'ici, le fait d'envoyer une chaîne de caractère même constituée de caractères héxadécimaux provoque une mauvaise interprétation des données qui sont par la suite converti en ASCII.
Alors pourquoi avec Multiway ça fonctionne et pas avec mon code je ne sais pas, j'ai planché 3 jours la semaine dernière en essayant de trouver une autre instruction autre que fputs ou fwrite sans succès. J'ai également essayé toutes sortes de conversions au niveau de ma variable sans succès non plus : toujours le même problème quel que soit les données envoyées
elles ne sont pas traiter comme avec le logiciel Multiway mais comme décris précédemment.
J'ai entendu parler d'expressions régulières je ne sais pas si cela pourrais m'aider à débloquer la situation.
Peut être connaissez vous un moyen quelconque
de résoudre le problème ou peut être vous capable de me dire que ce n'ai pas possible en PHP et dans ce cas
je serais bien embêté il me faudrais un autre langage qui me permette de s'intégrer au PHP et qui me permette de
communiquer plus facilement avec le port série. Je ne sais pas si en intégrant du langage C c'est possible ou avec un applet java?
Voilà j'espère avoir été clair dans mon explication et si vous pouviez m'envoyer quelques éléments de réponses
ça me permettrai d'avancer et peut être de finir mon projet car je n'ai plus que ce problème de communication à résoudre
pour pouvoir finaliser le projet.
Merci d'avance.
K1rou.
Partager