comm serial com o PHP no Windows
-
06-07-2019 - |
Pergunta
Eu estou procurando uma maneira de se comunicar com a porta serial RS232 COM no Windows. Eu encontrei 2 soluções na net, um que não é totalmente livre (introduz deliberar atrasos na função) e outra com capacidade limitada no Windows. Este último só pode escrever a uma porta COM no Windows, não ler.
Eu não posso olhar para o código da primeira solução, uma vez que é compilado em um arquivo .dll (faz sentido, caso contrário, as pessoas podem simplesmente editar o atraso e não comprá-lo ...) eo segundo parece apenas para uso fopen () para abrir a porta e fwrite mais tarde () para isso por escrito, assim como um faria a um córrego. Mas, aparentemente, freading ele retorna nada.
Eu sei que é possível, como a primeira solução fez isso, embora exija Apache para uso módulo php-cgi em vez de php5module.
Todas as idéias?
Solução
Todas as soluções acima é ou trabalho ineficiente ou muito.
Você pode simplesmente usar o PHP-DIO biblioteca (dio_fcntl, dio_open, dio_read, dio_write, dio_seek, ...). É também na a entrada do manual do PHP para DIO :
Este pacote PECL não está disponível por padrão. Para obtê-lo para o Windows se você tiver PHP 5.2.x maior do que 5.2.6, você pode baixá-lo como parte de um ZIP:
Ambos os links foram encontrados em http: // www.deveblog.com/index.php/download-pecl-extensions-for-windows/
Aqui é a compilação do Linux , basta obtê-lo e fazer o phpize / configure / make / make install coisa.
Eu não sei se ele deve ser usado em uma sessão de Apache, mas ir para ele.
Outras dicas
A maneira mais fácil de resolver este seria escrever um programa em outro idioma (como C ++) e, em seguida, executá-lo a partir de seu script php com system()
. Fazendo Comm I / O em C ++ é trivial.
Isso pressupõe que você tem acesso suficiente para o servidor para configurá-lo para permitir que o executável a ser executado pelo php, etc.
Outra forma possível seria usar a API Win32 através de algo como w32api_register_function()
ou ffi e use comunicação serial chamadas para fazê-lo funcionar no Windows.
Eu tive o mesmo problema e já pensou em escrever a minha própria extensão php quando me deparei com esta solução, que é popular entre os desenvolvedores do Arduino - 'serproxy' (encontrado em muitos lugares, ou seja, http://www.lspace.nildram.co.uk/freeware.html ) conjuntos nofollow até uma pilha TCP de / para as portas seriais e me permitiu usar as funções de soquete php se comunicar com ele.
Você precisa configurar a porta COM usando um DOS-like comando.
Por exemplo, a seguinte linha executa o comando através do PHP:
$output = `mode COM1: BAUD=115200 PARITY=N data=8 stop=1 XON=off TO=on`;
Para exibir os resultados que você pode usar:
echo "$output";
Criar a ID de recurso:
$fp = fopen('COM1', 'r+');
if (!$fp)
{
echo "Port not accessible";
}
else
{
echo "Port COM1 opened successfully";
}
Escreva-port:
$writtenBytes = fputs($fp, "Hello");
echo"Bytes written to port: $writtenBytes";
Leia a partir da porta:
$buffer = fgets($fp);
echo "Read from buffer: $buffer";
Talvez alguém pode me ajudar com o problema fgets
. Empilha lá por exatamente um minuto se TO=on
, ou pilhas lá para sempre se TO=off
. Parece ser uma opção "MODE COM
" então talvez um DOS especialista pode ajudar.
Talvez em vez de fgets
, deve-se usar fgetc
, desde a captura fgets
até o newline
, enquanto capturas fgetc
um único personagem. Se uma nova linha não é encontrado, ele pode bloquear até que haja uma ou até que o buffer é lavada. O atraso de um minuto pode ser janelas rubor seu buffer em um intervalo.
Outra opção é usar um objeto via ActiveX em janelas. Existem vários objetos de série, principalmente comerciais para COM no Windows. Você também pode expor um objeto baseado em .NET e registrá-lo para uso COM bem. Claro, isso não presumo que você tem controle sobre o servidor para registrar um controle COM, como você precisaria de uma interface serial.
Outra questão é a contenção de recursos se isto é para uso via Web. Se isto é para uma impressora serial, por exemplo, em seguida, um gerenciador de filas de impressão seria sua melhor opção sobre a comunicação direta.
Se você quer lidar com sms usando a porta COM, então aqui é o mais famoso class comunicação serial php por Rémy Sanchez com google code amostra . Aqui está uma discussão que inclui o assunto.