PHP é à quinta-feira – Controlar uma porta COM
Por Pedro Peixoto para o PPLWARE
O PHP é usado mais frequentemente com o objectivo de construção de Websites ou aplicações WEB para manipular dados e geri-los de uma forma mais fácil e cómoda, mas também é famoso pela sua versatilidade, flexibilidade e simplicidade. O facto de ser uma linguagem muito popular facilita a obtenção de classes que estendem as suas funcionalidades aos mais diversos fins. Hoje vamos aprender como controlar facilmente uma porta COM usando PHP.
Há uns tempos, durante a realização de projecto relacionado com a robótica, tive necessidade de enviar comandos para uma porta COM (local) usando a aplicação que estava a construir em PHP. O que poderia parecer difícil à primeira vista, veio a tornar-se simples, muito por culpa da classe disponibilizada por Rémy Sanchez. Existem muitas outras soluções, algumas delas tirando partido de funções nativas do PHP, tanto que a minha escolha acabou por ser outra, no entanto esta classe é bastante simples e eficaz para as tarefas mais necessárias, pelo que merecia destaque numa rubrica.
Vamos ao que interessa, em primeiro lugar necessitam de fazer download da classe e fazer o include da mesma:
require("php_serial.class.php"); |
Depois de incluída é preciso criar um novo objecto como em qualquer classe:
$serial = new phpSerial(); |
Agora que temos o objecto criado, vamos indicar a porta COM a controlar:
$serial->deviceSet("COM1"); |
De seguida necessitamos de indicar os parâmetros de ligação à porta:
$serial->confBaudRate(9600); //Taxa de transmissão $serial->confParity("none"); //Paridade $serial->confCharacterLength(8); //Comprimento $serial->confStopBits(1); //Bits de paragem $serial->confFlowControl("none"); //Controlo |
Agora que já temos a ligação configurada, vamos conectar:
$serial->deviceOpen(); |
E é tudo, podemos enviar as mensagens para a porta de destino, para exemplificar vamos enviar o comando “SR1”:
$serial->sendMessage("SR1\r"); |
Ao fim de enviar todos os comandos, temos de fechar a conexão:
$serial->deviceClose(); |
Para concluir, basta acrescentar que está ainda disponível a função readPort, para ler a porta COM mas apenas está implementada para servidores Linux.
Existem inúmeros dispositivos que funcionam ou estão preparados para funcionar como portas COM, esta classe vem assim possibilitar a exploração de inúmeras funcionalidades desses mesmos dispositivos, e, principalmente possibilitar a interação de aplicações WEB com mecanismos usados na robótica ou domótica. Já pensaram fazer uma aplicação WEB onde controlem as persianas/luzes da vossa casa? Até para a semana.
Últimos artigos sobre PHP
- PHP é à quinta-feira – Sabe popular uma combobox?
- PHP é a Quinta-Feira – Gerar ficheiros PDF
- PHP é à quinta-feira – Validação de dados introduzidos
- PHP é à quinta-feira – PHP + JSON
- PHP é à quinta-feira – Endereço IPv4 ou IPv6?
- PHP é à quinta-feira – Arrays Associativos
Download: php_serial.class.zip
Este artigo tem mais de um ano
Ummmm… essa explicação é muito interessante, mas carece informação de segurnaça importante como: com que permissões corre o PHP para aceder directamente a uma porta série e/ou que permissões tem a porta para poder ser acedida por um script PHP.
Permissões na porta????? Hum… 🙂
Não percebo o espanto.
A minha pergunta/afirmação não tem nada a ver com server side ou client side. É obvio que o PHP corre do lado do servidor.
Passando ao assunto: O apache normalmente corre como nobody (ou algo equivalente). Assumindo que o php é um modulo compilado e não corre como CGI (com outro tipo de configurações), os scripts vão correr como nobody igualmente. Claro que podem correr o apache como root mas isso seria no minimo estranho em produção (e até em teste).
As portas série (ttyS+), no linux, estão sujeitas ao mesmo tipo de permissões que qualquer outro ficheiro. Portanto, por norma, um utilizador comum não tem acesso directo às portas série (como em qualquer outro sistema operativo moderno que se preze).
Daí surgiu a minha pergunta relativamente a essa biblioteca para o PHP. Achei demasiado directo e fácil o acesso à porta série.
Boa tarde, a porta acedida é local, ou seja, o script acede a uma porta do servidor.
O PHP é server side, logo consegues controlar o que se passa no server, desde que aquilo que queiras controlar, não precise de permissões de administrador ou por questões de segurança, o PHP não tenha bloqueado.
Não existe perigo nenhum em controlar portas COM.
Uma nota, não experimentem este código em alojamentos partilhados, pois não vai funcionar. Nos alojamentos partilhados não têm acesso a nada do servidor físico.
Isto só funciona, localmente, em VPS’s (muito limitado) e Servidores Dedicados.
Isto não tem nada a ver com alojamentos partilhados. Em qualquer linux, por norma, um utilizador normal não terá acesso a qualquer “device”. Isto inclui as portas série (representadas por ttySx no linux). Por norma verás o PHP a correr como “nobody”, ou algo semelhante, dentro do apache (ou qualquer outro servidor HTTP).
Que é interessante é! Infelizmente em windows não funciona…
Boa tarde,
Eu uso em windows e funciona bem.
Eu já tentei várias vezes… e em nenhuma consegui colocar essa classe a funcionar em windows com apache.
Eu já tentei várias vezes… e em nenhuma consegui colocar essa classe a funcionar em windows com apache.
Algum truque?
Nenhum truque, foi logo à primeira. Tens a certeza que era esta versão? O que acontecia para não dar? Algum erro específico?
Warning: Reading serial port is not implemented for Windows in php_serial.class.php on line 503
Pois… Tal como digo no último parágrafo, a leitura de portas ainda não está implementado. Este artigo refere-se ao envio de comandos. :S
Ai ai Helder….então andas viciado em Linux 🙂
Até estou… mas apenas para o server side 🙂
por acaso tenho uma pergunta… é possível o PHP ler códigos de barras através de uma pistola ligada por USB ou por COM?
Boa tarde rodasp, normalmente as pistolas de códigos de barras funcionam como um teclado, pelo menos as que uso. Então fazendo uma página html é possível ler a partir da pistola, usando um campo input, ou recorrendo a javascript.
espero bem que as que eu tenho aqui sejam assim… obrigado pela resposta
Pelo PHP não consegues controlar o leitor de códigos de barras.
Usa antes Ajax (Javascript), lês o output do leitor, e passas para o PHP por HTTPRequest.
Se funcionar como um teclado não consegues ter acesso aos dados como terias pelo stdin?
Mais um excelente tutorial 🙂
Muitos parabéns a equipa pplware 😉
já não consigo passar um dia sem vir aqui 😀
Excelente, isto + o Arduino e é deixar a imaginação trabalhar 😀
Mais um tutorial fenômenal.
Não sabia que era possivel mexer copm portas COM com PHP, fiquei abismado.
E muitos ainda dizem que PHP é fraquinho e vai morrer… hausahusahusa
Belo Trampo no Post 😉
ola pessoal, preciso de alguem que converta um formulirio de envio de email de asp para php, ja tentei aquelas ferramentas que fazem isto automaticamente, mas não deu certo…quem puder me dar uma mão…ficarei grato.
Olá amigo onde eu coloco a classe “php_serial.class.php”?
Desde ja agradeço
Ola Jurandir, tens que criar um novo ficheiro php. Normalmente crio no notepad um ficheiro e chamo-o “index.php” onde coloco toda a programação. Não se esqueça que tem de ter istalado o PHP e o Apache! Depois é só abrir a página no browser.
Olá Pedro,depois de tanto tempo,passei por aqui para agradescer.
Obrigado!
Ótimo tutorial, gostaria de saber se tem como ler o retorno da resposta ex:
$serial->sendMessage(“EnviarMsg\r”);
Gostaria de saber qual mensagem o dispositivo retornou, para que possa tratar o retorno.
Obrigado.
Alguém sabe me informar como seria o comando para impressão?
Ictor, tambem estou querendo saber vc ja descobriu??
Pedro,
Gostaria de saber como eu faria para enviar uma impressão? já procurei pra caramba e não acho.
Olá Mário, depende da impressora!
Ola, como resolvo esse erro?
Deprecated: Methods with the same name as their class will not be constructors in a future version of PHP; phpSerial has a deprecated constructor