PHP é à quinta-feira – Controlar uma porta COM

33 Comentários

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.

php1

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

Download: php_serial.class.zip

Partilhar:
Tags:

Comentários

33

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *

  1. Avatar de Zé Tolas
    Zé Tolas

    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.

    1. Avatar de Pedro Pinto

      Permissões na porta????? Hum… 🙂

      1. Avatar de Zé Tolas
        Zé Tolas

        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.

    2. Avatar de Pedro Peixoto
      Pedro Peixoto

      Boa tarde, a porta acedida é local, ou seja, o script acede a uma porta do servidor.

    3. Avatar de Rogério
      Rogério

      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.

      1. Avatar de Zé Tolas
        Zé Tolas

        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).

  2. Avatar de Hélder
    Hélder

    Que é interessante é! Infelizmente em windows não funciona…

    1. Avatar de Pedro Peixoto
      Pedro Peixoto

      Boa tarde,
      Eu uso em windows e funciona bem.

      1. Avatar de Hélder
        Hélder

        Eu já tentei várias vezes… e em nenhuma consegui colocar essa classe a funcionar em windows com apache.

      2. Avatar de Hélder
        Hélder

        Eu já tentei várias vezes… e em nenhuma consegui colocar essa classe a funcionar em windows com apache.

        Algum truque?

        1. Avatar de Pedro Peixoto
          Pedro Peixoto

          Nenhum truque, foi logo à primeira. Tens a certeza que era esta versão? O que acontecia para não dar? Algum erro específico?

          1. Avatar de Hélder
            Hélder

            Warning: Reading serial port is not implemented for Windows in php_serial.class.php on line 503

          2. Avatar de Pedro Peixoto
            Pedro Peixoto

            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

    2. Avatar de Pedro Pinto

      Ai ai Helder….então andas viciado em Linux 🙂

      1. Avatar de Hélder
        Hélder

        Até estou… mas apenas para o server side 🙂

  3. Avatar de rodasp
    rodasp

    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?

    1. Avatar de Pedro Peixoto
      Pedro Peixoto

      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.

      1. Avatar de rodasp
        rodasp

        espero bem que as que eu tenho aqui sejam assim… obrigado pela resposta

    2. Avatar de Rogério
      Rogério

      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.

      1. Avatar de Pedro Sousa
        Pedro Sousa

        Se funcionar como um teclado não consegues ter acesso aos dados como terias pelo stdin?

  4. Avatar de QueroTenho

    Mais um excelente tutorial 🙂
    Muitos parabéns a equipa pplware 😉
    já não consigo passar um dia sem vir aqui 😀

  5. Avatar de YaBa
    YaBa

    Excelente, isto + o Arduino e é deixar a imaginação trabalhar 😀

  6. Avatar de Mandrake

    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 😉

  7. Avatar de david
    david

    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.

  8. Avatar de Jurandir
    Jurandir

    Olá amigo onde eu coloco a classe “php_serial.class.php”?
    Desde ja agradeço

    1. Avatar de Pedro Peixoto
      Pedro Peixoto

      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.

      1. Avatar de Jurandir
        Jurandir

        Olá Pedro,depois de tanto tempo,passei por aqui para agradescer.
        Obrigado!

  9. Avatar de rodrigo
    rodrigo

    Ó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.

  10. Avatar de Ictor
    Ictor

    Alguém sabe me informar como seria o comando para impressão?

    1. Avatar de Mario
      Mario

      Ictor, tambem estou querendo saber vc ja descobriu??

  11. Avatar de Mario
    Mario

    Pedro,

    Gostaria de saber como eu faria para enviar uma impressão? já procurei pra caramba e não acho.

    1. Avatar de Pedro Peixoto
      Pedro Peixoto

      Olá Mário, depende da impressora!

  12. Avatar de Aerson Beto Mazivile
    Aerson Beto Mazivile

    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