Domanda

Sto cercando un modo per comunicare con la porta COM seriale RS232 su Windows. Ho trovato 2 soluzioni in rete, una che non è totalmente gratuita (introduce deliberatamente ritardi sulla funzione) e altro con funzionalità limitate su Windows. Quest'ultimo può solo scrivere su una porta COM su Windows, non leggere.

Non riesco a guardare il codice della prima soluzione poiché è compilato in una DLL (ha senso, altrimenti le persone possono solo modificare il ritardo e non acquistarlo ...) e la seconda sembra solo usare fopen () per aprire la porta e successivamente fwrite () su di essa per la scrittura, proprio come si farebbe con uno stream. Ma apparentemente inquietante non restituisce nulla.

So che è possibile come la prima soluzione ha fatto, anche se richiede Apache per utilizzare il modulo php-cgi invece di php5module.

Qualche idea?

È stato utile?

Soluzione

Ogni soluzione sopra è inefficiente o troppo impegnativa.

Puoi semplicemente utilizzare la libreria PHP-DIO (dio_fcntl, dio_open, dio_read, dio_write, dio_seek, ...). È anche in la voce del manuale PHP per DIO :

Questo pacchetto PECL non è disponibile per impostazione predefinita. Per ottenerlo per Windows se hai PHP 5.2.x maggiore di 5.2.6, puoi scaricarlo come parte di un ZIP:

Entrambi questi collegamenti sono stati trovati in http: // www.deveblog.com/index.php/download-pecl-extensions-for-windows/

Ecco la build da Linux , basta prenderla e fare phpize / configure / make / make install thing.

Non so se dovrebbe essere usato in una sessione di Apache, ma provaci.

Altri suggerimenti

Il modo più semplice per affrontarlo sarebbe scrivere un programma in un'altra lingua (come C ++) e quindi eseguirlo dal tuo script php con system () . Fare I / O Comm in C ++ è banale.

Ciò presuppone che tu abbia abbastanza accesso al server per configurarlo per consentire all'eseguibile di essere eseguito da php, ecc.

Un altro modo possibile sarebbe usare l'API Win32 attraverso qualcosa come w32api_register_function () o ffi e quindi utilizzare chiamate di comunicazione seriale per farlo funzionare su Windows.

Ho avuto lo stesso problema e ho già pensato di scrivere la mia estensione php quando ho trovato questa soluzione che è popolare con gli sviluppatori di Arduino - 'serproxy' (l'ho trovata in molti posti, ad es. http://www.lspace.nildram.co.uk/freeware.html ) imposta uno stack tcp da / a le porte seriali e mi ha permesso di utilizzare le funzioni del socket php per comunicare con esso.

Devi impostare la porta com usando un comando simile a DOS.

Ad esempio, la seguente riga esegue il comando tramite php:

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

Per visualizzare i risultati è possibile utilizzare:

echo "$output"; 

Crea l'id risorsa:

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

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

Scrivi sulla porta:

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

echo"Bytes written to port: $writtenBytes";

Leggi dalla porta:

$buffer = fgets($fp);

echo "Read from buffer: $buffer";

Forse qualcuno mi può aiutare con il problema fgets . Si accumula esattamente per un minuto se TO = on , o si impila lì per sempre se TO = off . Sembra essere un " MODE COM " opzione quindi forse un esperto di DOS può aiutare.

Forse invece di fgets , si dovrebbe usare fgetc , poiché fgets acquisisce attraverso il newline , mentre fgetc acquisisce un singolo personaggio. Se non viene rilevata una nuova riga, potrebbe bloccarsi fino a quando non ce n'è una o fino a quando il buffer non viene scaricato. Il ritardo di un minuto potrebbe essere lo scaricamento di Windows del buffer su un intervallo.

Un'altra opzione è quella di utilizzare un oggetto tramite ActiveX su Windows. Esistono diversi oggetti seriali, principalmente commerciali, per COM su Windows. È inoltre possibile esporre un oggetto basato su .Net e registrarlo anche per uso COM. Ovviamente, ciò presuppone che tu abbia il controllo sul server per registrare un controllo COM, dato che avresti bisogno di un'interfaccia seriale.

Un altro problema è la contesa di risorse se questa deve essere utilizzata via Web. Se questo è per una stampante seriale, ad esempio, un gestore code di stampa sarebbe l'opzione migliore per la comunicazione diretta.

Se vuoi gestire gli sms usando la porta com allora ecco il più famoso classe di comunicazione seriale php di Rémy Sanchez con codice di esempio google . Ecco un thread che include quell'argomento.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top