IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

Portage d'un script Linux vers Windows


Sujet :

Langage Perl

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Stagiaire
    Inscrit en
    Juillet 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Stagiaire

    Informations forums :
    Inscription : Juillet 2014
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Portage d'un script Linux vers Windows
    Bonjour,

    j'ai récupéré un script (voir ci-dessous depuis http://www.jibble.org/currentcost/
    Dans la version Windows, j'ai ajouté le module Win32:: SerialPort et changé les appels du script en conséquence.
    Actuellement, je bute sur la ligne open(SERIAL, "+>$PORT"); qui me renvoie un Permission denied.
    D'ailleurs, je pense que le port devrait être ouvert en lecture, mais cela ne change rien à l'erreur.
    Merci pour votre aide et vos suggestions.

    Version d'origine :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    #!/usr/bin/perl -w
     
    # Reads data from a Current Cost device via serial port.
     
    use strict;
    use Device::SerialPort qw( :PARAM :STAT 0.07 );
     
    my $PORT = "/dev/ttyS0";
     
    my $ob = Device::SerialPort->new($PORT);
    $ob->baudrate(2400);
    $ob->write_settings;
     
    open(SERIAL, "+>$PORT");
    while (my $line = <SERIAL>) {
        if ($line =~ m!<ch1><watts>0*(\d+)</watts></ch1>.*<tmpr> *([\-\d.]+)</tmpr>!) {
            my $watts = $1;
            my $temp = $2;
            print "$watts, $temp\n";
        }
    }
    Version adaptée pour Windows qui plante (j'ai ajouté des settings pour le port COM mais cela ne pose pas de pb)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    use strict;
     
    use Win32::SerialPort qw( :PARAM :STAT 0.07 );
    my $PORT = "COM4";
     
    my $ob = Win32::SerialPort->new($PORT);
     
    $ob->baudrate(57600);
    $ob->parity("none");
    $ob->databits(8);
    $ob->stopbits(1);
    $ob->write_settings;
    open(SERIAL, "+>$PORT") or die "Can't open COM4: $!"; 
    while (my $line = <SERIAL>) {
    	if ($line =~ m!<tmpr> *([\-\d.]+)</tmpr>.*<watts>0*(\d+)</watts>!) {
    		my $temp = $1;
    		my $watts = $2;
    		print "$watts, $temp\n";
    	}
    }

  2. #2
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Sur quelle plateforme Perl ? (cygwin, ActivePerl, Strawberry perl) ?
    Si tu parles de /dev/ttyS0, je suppose que c'est cygwin ? Si c'est bien Cygwin, tu peux utiliser directement Device::SerialPort, c'est ce que j'ai fait.
    Si tu utilises Strawberry ou ActivePerl, il faudrait que j'expérimente.
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Stagiaire
    Inscrit en
    Juillet 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Stagiaire

    Informations forums :
    Inscription : Juillet 2014
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    ActivePerl sous Windows.
    Le code Windows est à partir de la ligne 23 (ce sont 2 codes différents mais en rédigeant mon post sur ce forum, ils ont été regroupés)

  4. #4
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Désolé, je ne tourne qu'à Strawberry ou cygwin, et je ne peux pas me permettre d'installer AP en plus pour éviter tout pb sur ma version en production (Strawberry).
    Cela dit, tu as essayé avec un hyper-terminal d'accéder à ce port ? Ne dois-tu pas exécuter ton pgm perl en mode "Admin" ?
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Stagiaire
    Inscrit en
    Juillet 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Stagiaire

    Informations forums :
    Inscription : Juillet 2014
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Pas de pb avec HyperTerminal et d'autres softs 100% Windows.
    Même avec élévation de privilèges sous Windows, ça plante.
    Le code sous Strawberry ne doit pas être différent de celui indiqué. Tu peux le tester stp ?

  6. #6
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Je ne peux pas le tester, car Strawberry refuse d'installer Win32::SerialPort (pb de désarchivage). Faudrait que j'essaye de l'installer à la main, et je ne sais pas si j'aurais le temps aujourd'hui.
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  7. #7
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    C:\Users\pleverone\Documents>perl JC38N.pl
    Can't open COM1: Permission denied at JC38N.pl line 13.
    (pas de COM4 chez moi)
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  8. #8
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    En fait, je n'avais pas vu ton programme, mais tu essayes d'ouvrir avec open un port déjà ouvert avec Win32::SerialPort->new
    Tu dois utiliser ton objet $ob pour écrire/lire sur le port, ou bien fermer ton instance $ob, genre :
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  9. #9
    Nouveau Candidat au Club
    Homme Profil pro
    Stagiaire
    Inscrit en
    Juillet 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Stagiaire

    Informations forums :
    Inscription : Juillet 2014
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Excellent, c'est bien cela !
    Je suis parti du lien indiqué dans le 1er post, le gars fermait pas l'objet dans son script pour Linux.
    Bon, je continue enfin mon script Windows et je reviendrai fermer le topic si tout est ok.
    Encore merci.

  10. #10
    Nouveau Candidat au Club
    Homme Profil pro
    Stagiaire
    Inscrit en
    Juillet 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Stagiaire

    Informations forums :
    Inscription : Juillet 2014
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Merci pour l'attention et l'aide apportée, voici le code dans sa totalité.
    C'est la ligne 20 qui fait toute la différence. A priori pas utile sous Linux, mais nécessaire sous Windows.
    Je précise que je n'ai pas testé sous Linux, la déclaration de PortName est bien entendu à changer dans ce cas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    use warnings;
    use strict;
    my $PortObj;
    my $PortName = "COM4";
    # print "OS : $^O \n";
    if ( $^O =~ m/Win32/ ) {
         require Win32::SerialPort;
         $PortObj = new Win32::SerialPort ($PortName) or die "Can't open $PortName: $!\n";
    }
    else {
        require Device::SerialPort;
        $PortObj = new Device::SerialPort ($PortName) or die "Can't open $PortName: $!\n";
    }
     
    $PortObj->baudrate(57600) || die "fail setting baud";
    $PortObj->parity("none");
    $PortObj->databits(8);
    $PortObj->stopbits(1);
    $PortObj->write_settings || die "no settings"; 
    undef $PortObj;
     
    open(SERIAL, "<$PortName") or die "Can't open COM4: $!";
    while (my $line = <SERIAL>) {
    	if ($line =~ m!<tmpr> *([\-\d.]+)</tmpr>.*<type>(\d+)</type>.*<watts>0*(\d+)</watts>!) {
    		my $temp = $1;
    		my $type = $2;
    		my $watts = $3;
    		print "$type,$watts,$temp\n";
    	}
    }

  11. #11
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Citation Envoyé par JC38N Voir le message
    C'est la ligne 20 qui fait toute la différence. A priori pas utile sous Linux, mais nécessaire sous Windows.
    Lié à la gestion des droits d'accès sur chaque système : en général en mode exclusif sur Windows, et en mode partagé sur les système basés sur POSIX
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

Discussions similaires

  1. debogage et portage d'une biblio de linux vers windows
    Par shadowless dans le forum Langage
    Réponses: 3
    Dernier message: 03/05/2011, 09h08
  2. Portage de linux vers windows d'une bibliothèque
    Par shadowless dans le forum Débuter
    Réponses: 31
    Dernier message: 24/04/2011, 23h58
  3. Problème portage code Linux vers Windows
    Par scary dans le forum Windows
    Réponses: 14
    Dernier message: 11/01/2010, 17h56
  4. problème portage ioctl socket Linux vers Windows
    Par progfou dans le forum Réseau
    Réponses: 19
    Dernier message: 06/10/2009, 19h44
  5. Problème de portage Linux vers Windows, wxwidgets
    Par zoom* dans le forum wxWidgets
    Réponses: 6
    Dernier message: 22/07/2008, 09h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo