Question

Je cherche un moyen de communiquer avec le port COM série RS232 sous Windows. J'ai trouvé deux solutions sur le net, une non totalement gratuite (introduit délibérément retards sur la fonction) et une autre avec une capacité limitée sous Windows. Ce dernier ne peut écrire que sur un port COM de Windows, pas lire.

Je ne peux pas regarder le code de la première solution car il est compilé dans un fichier .dll (cela a du sens, sinon les gens peuvent simplement éditer le délai et ne pas l'acheter ...) et le second semble ne plus être utilisé fopen () pour ouvrir le port et ensuite fwrite () pour l'écrire, comme on le ferait pour un flux. Mais apparemment, cela ne rend rien.

Je sais que c'est possible avec la première solution, bien qu'Apache soit obligé d'utiliser un module php-cgi au lieu de php5module.

Des idées?

Était-ce utile?

La solution

Chaque solution ci-dessus est inefficace ou demande trop de travail.

Vous pouvez simplement utiliser la bibliothèque PHP-DIO (dio_fcntl, dio_open, dio_read, dio_write, dio_seek, ...). C'est également dans l'entrée du manuel PHP pour DIO :

Ce package PECL n'est pas disponible par défaut. Pour l'obtenir pour Windows si vous avez PHP 5.2.x supérieur à 5.2.6, vous pouvez le télécharger avec un fichier ZIP:

Ces deux liens ont été trouvés dans http: // www.deveblog.com/index.php/download-pecl-extensions-for-windows/

Voici la version de Linux , procurez-vous la et exécutez la commande phpize / configure / make / make install chose.

Je ne sais pas s'il devrait être utilisé dans une session Apache, mais allez-y.

Autres conseils

Le moyen le plus simple de s'y attaquer serait d'écrire un programme dans un autre langage (tel que C ++), puis de l'exécuter à partir de votre script php avec system () . Faire des E / S de communication en C ++ est trivial.

Cela suppose que vous avez suffisamment accès au serveur pour le configurer afin de permettre à l'exécutable d'être exécuté par php, etc.

Une autre solution consisterait à utiliser l'API Win32 à l'aide de w32api_register_function () ou ffi , puis utilisez appels de communication série pour le faire fonctionner sous Windows.

J'ai eu le même problème et j'avais déjà envisagé d'écrire ma propre extension php lorsque je suis tombé sur cette solution très appréciée des développeurs Arduino: "serproxy" (trouvée à de nombreux endroits, c'est-à-dire. http://www.lspace.nildram.co.uk/freeware.html ) configure une pile tcp de / vers les ports série et m'a permis d'utiliser les fonctions de socket php pour communiquer avec elle.

Vous devez configurer le port com à l'aide d'une commande semblable à DOS.

Par exemple, la ligne suivante exécute la commande via php:

$output = `mode COM1: BAUD=115200 PARITY=N data=8 stop=1 XON=off TO=on`;

Pour afficher les résultats, vous pouvez utiliser:

echo "$output"; 

Créez l'ID de la ressource:

$fp = fopen('COM1', 'r+');

if (!$fp)
{
      echo "Port not accessible";
}
else
{
     echo "Port COM1 opened successfully";
}

Écrire sur le port:

$writtenBytes = fputs($fp, "Hello");

echo"Bytes written to port: $writtenBytes";

Lecture du port:

$buffer = fgets($fp);

echo "Read from buffer: $buffer";

Peut-être que quelqu'un peut m'aider à résoudre le problème fgets . Il y reste pendant exactement une minute si TO = on , ou y reste pour toujours si TO = off . Cela semble être un " MODE COM ". option alors peut-être un expert DOS peut vous aider.

Peut-être qu'au lieu de fgets , on devrait utiliser fgetc , puisque fgets est capturé jusqu'à la newline , tandis que fgetc capture un seul caractère. Si aucune nouvelle ligne n'est rencontrée, elle peut être bloquée jusqu'à ce qu'il y en ait une ou jusqu'à ce que la mémoire tampon soit vidée. Le délai d’une minute peut être une fenêtre vidant son tampon sur un intervalle.

Une autre option consiste à utiliser un objet via ActiveX sous Windows. Il existe plusieurs objets série, principalement commerciaux, pour COM sous Windows. Vous pouvez également exposer un objet basé sur .Net et l'enregistrer pour une utilisation COM. Bien entendu, cela suppose que vous avez le contrôle sur le serveur pour enregistrer un contrôle COM, comme vous auriez besoin d’une interface série.

Un autre problème concerne les conflits de ressources, s’ils sont destinés au Web. S'il s'agit d'une imprimante série, par exemple, un gestionnaire de file d'attente d'impression serait votre meilleure option par rapport à la communication directe.

Si vous souhaitez gérer les SMS avec le port de communication, voici le plus célèbre Classe de communication série php par Rémy Sanchez avec google exemple de code . Voici un fil contenant ce sujet.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top