none
Communication entre deux programmes c# par USB RRS feed

  • Question

  • Bonjour,

    Je suis actuellement en DUT (réseau et télécom) et au cour de ma seconde année je doit effectuer un projet tuteuré. Ce sujet c'est révélé très compliqué car nous avons pris (mon binôme et moi même) de la progra en c# que nous n'étudions pas du tout en cour ! Bon on c'est bien démerdé jusqu'à maintenant (enfin surtout moi mon binôme est allergique à la progra). Mais j'arrive maintenant à une semaine du dossier final et il me reste deux petit bout de prog que j'arrive pas à faire avec mon niveau.

    Je vous explique donc en gros le morceau du système qui va nous intéresser. On a un module radio connecté en usb à un PC. Jusqu'à présent ce module avait pour rôle de réceptionner des messages radios et de les transmettre au PC. Il faut qu'après ma reprogra il puisse recevoir un message du PC et donc qu'il écoute l'usb. Or dans les librairies fournit avec ces modules on possède un commande pour émettre sur l'usb mais pas pour écouter ! J'aimerai donc un coup de pouce afin de savoir comment créer cette commande 8-)

    Je vous donne ci-dessous les infos qui me semble nécessaire à la réalisation de cette commande :

    La commande [CODE] SerialDump.print("\n ALARM : PERSONNE SURVEILLEE EST ALONGEE\n"); [/CODE]
    Permet actuellement de remonter le message voulu au PC.

    Cette commande se trouve dans une librairie appelé Crossbow.lib.utils et voici ce qui se rapporte à cette commande dans la librairie en question :

    00013 using System;
    00014 using Microsoft.SPOT;
    00015
    00016 namespace Crossbow.lib.utils
    00017 {
    00018
    00019     public class SerialDump
    00020     {
    00021         public static void print(byte[] str)
    00022         {
    00023             string outputString = null;
    00024             if (str.Length == 0) return;
    00025             try
    00026             {
    00027                 for (int i = 0; i < str.Length; i++)
    00028                 {
    00029                     string tmp = str[i].ToString() + " ";
    00030                     outputString += tmp;
    00031                 }
    00032
    00033                 Debug.Print(outputString);
    00034             }
    00035             catch (Exception ee)
    00036             {
    00037                 Debug.Print(ee.ToString());
    00038             };
    00039         }
    00040
    00041         public static void print(string str)
    00042         {
    00043             if (str.Length == 0) return;
    00044             try
    00045             {
    00046                 Debug.Print(str);
    00047             }
    00048             catch (Exception ee)
    00049             {
    00050                 Debug.Print(ee.ToString());
    00051             }
    00052           
    00053         }
    00054     }
    00055 }


    Je vois bien qu'il fait utiliser une commande de la librairie System.Diagnostics mais alors laquelle et comment ? Sa me dépasse un peu :roll:


    Maintenant j'ai aussi un second problème qui se trouve cette fois ci du côté PC. J'ai un programme qui permet d'écouter l'usb en permanence afin d'afficher les messages entrant. J'aimerai modifier ce programme afin non plus qu'il écoute mais qu'il puisse émettre des requêtes sur l'usb. Je comprend pas beaucoup de chose à ce programme, j'arrive à voir le rôle de chaque fonction mais je ne sais pas trop comment faire une fonction pour émettre.


    using System;
    using System.IO;
    using System.Text;
    using System.Collections;
    using System.Reflection;
    using System.Threading;
    using System.Diagnostics;
    
    using _DBG = Microsoft.SPOT.Debugger;
    using _WP  = Microsoft.SPOT.Debugger.WireProtocol;
    
    namespace Microsoft.SPOT.Tools
    {
        class SerialDump
        {
            _DBG.Engine m_eng;
            FileStream  m_output;
            bool        m_fTimestamp;
            bool        m_fUsb = true;
            bool        m_fNewLine = true;
    
            //--//
    
            SerialDump( string[] args )
            {
                _DBG.PortDefinition pd       = null;
                string              port     = null;
                uint                baudrate = 0;
    
                for(int i=0; i<args.Length; i++)
                {
                    string arg = args[i];
    
                    if(String.Compare( arg, "-dump", true ) == 0)
                    {
                        m_output = new FileStream( args[++i], FileMode.Create, FileAccess.ReadWrite, FileShare.Read );
    
                        continue;
                    }
    
                    if(String.Compare( arg, "-timestamp", true ) == 0)
                    {
                        m_fTimestamp = true;
    
                        continue;
                    }
    
                    if(String.Compare( arg, "-usb", true ) == 0)
                    {
                        m_fUsb = true;
    
                        continue;
                    }
    
                    if (String.Compare(arg, "-serial", true) == 0)
                    {
                        m_fUsb = false;
    
                        continue;
                    }
    
                    if(port     == null) { port     =               arg  ; continue; }
                    if(baudrate == 0   ) { baudrate = UInt32.Parse( arg ); continue; }
                }
    
                if(m_fUsb)
                {
                    _DBG.PortDefinition[] ports = _DBG.AsyncUsbStream.EnumeratePorts();
    
                    if(port == null)
                    {
                        if(ports.Length == 0)
                        {
                            System.Console.WriteLine( "No Usb SPOT device is present" );
    
                            throw new ApplicationException();
                        }
                        else if(ports.Length == 1)
                        {
                            pd = ports[0];
                        }
                        else
                        {
                            System.Console.WriteLine( "More than one USB SPOT device is present" );
                            System.Console.WriteLine( "To dump data from a specific device, choose your device from the list below and execute:" );
                            System.Console.WriteLine( "  serialdump -usb <device> " );
                            System.Console.WriteLine( "" );
    
                            //
                            // More than one usb device attached; dump list so user can choose
                            //
                            for(int i = 0; i < ports.Length; ++i)
                            {
                                System.Console.WriteLine( "Device " + i + ": " + ports[i].DisplayName );
                            }
    
                            throw new ApplicationException();
                        }
                    }
                    else
                    {
                        foreach(_DBG.PortDefinition pd2 in ports)
                        {
                            if(port.Equals( pd2.DisplayName ))
                            {
                                pd = pd2;
                                break;
                            }
                        }
                    }
                }
    
                if(pd == null)
                {
                    if(port     == null) port     = "COM1";
                    if(baudrate == 0   ) baudrate = 115200;
    
                    pd = _DBG.PortDefinition.CreateInstanceForSerial( port, port, baudrate );
                }
    
                m_eng = new _DBG.Engine( pd );
            }
    
            void Run()
            {
                m_eng.Silent = true;
    
                m_eng.Start();
    
                m_eng.OnNoise   += new _DBG.NoiseEventHandler  ( OnNoise   );
                m_eng.OnMessage += new _DBG.MessageEventHandler( OnMessage );
    
                Console.WriteLine( "####### PRESS RETURN TO EXIT #######" );
                Console.ReadLine();
    
                m_eng.Stop();
                m_eng = null;
            }
    
            void OnNoise( byte[] buf, int offset, int count )
            {
                HandleOutput( buf, offset, count );
            }
    
            void OnMessage( _WP.IncomingMessage msg, string text )
            {
                byte[] buf = Encoding.ASCII.GetBytes( text );
    
                HandleOutput( buf, 0, buf.Length );
            }
    
            void HandleOutput( byte[] buf, int offset, int count )
            {
                while(count-- > 0)
                {
                    if(m_fTimestamp)
                    {
                        if(m_fNewLine)
                        {
                            HandleOutput( String.Format( "[{0:HH:mm:ss:fff}]  ", DateTime.Now ) );
                        }
                    }
    
                    char c = (char)buf[offset++];
    
                    HandleOutput( new String( c, 1 ) );
    
                    m_fNewLine = (c == '\n');
                }
            }
    
            void HandleOutput( string text )
            {
                Console.Write( text );
    
                byte[] buf = Encoding.ASCII.GetBytes( text );
    
                if(m_output != null) m_output.Write( buf, 0, buf.Length );
            }
    
            //--//
    
            static void Main( string[] args )
            {
                try
                {
                    SerialDump o = new SerialDump( args );
    
                    o.Run();
                }
                catch(ApplicationException)
                {
                    System.Threading.Thread.Sleep(5000);
                }
                catch(Exception e)
                {
                    Console.WriteLine( "{0}", e.ToString() );
                }
            }
        }
    }


    J'arrive à comprendre vite fait que ce programme établie une connexion avec le module si celui est présent (Je précise aussi qu'on utilise que la connexion usb jamais de serial !). Puis que celui-ci fait appel à la fonction OnMessage pour récupérer les info qui lui sont envoyé pour les afficher.

    En gros il me faudrait juste une fonction pour envoyer un message sur la connexion établie. Je sais pas si c'est difficile à réaliser, je ne pense pas, mais bon en tous cas c'est au dessus de mes compétences ! :cry:


    Voila c'est les deux problèmes qu'il me reste à traiter j'ai réussi à faire tous le reste de mon projet seul 8-). Un grand merci à tous ceux qui pourrait me donner un coup de main ;)
    dimanche 7 mars 2010 13:23

Réponses

  • Bonjour,

    étant donné que je doit finir mon projet cette semaine j'ai décidé de voir avec quelque prof si je pouvais contourner mon problème et j'y suis finalement parvenu. C'est loin d'être une solution très propre mais elle fonctionne. Je n'ai donc plus besoin des commandes que je cherchai ! Je te remercie grandement tout de même :)

    Si jamais tu t'intéresse toujours au système sur lequel je travaillais je pourrai te poster mon rapport ainsi que la bibliothèque que tu voulais si je la trouve ;)

    Cordialement,

    Sylvain
    • Marqué comme réponse Alex Petrescu vendredi 12 mars 2010 11:07
    jeudi 11 mars 2010 12:26

Toutes les réponses

  • Bonjour,

     

    A partir de vos exemples, je comprends que votre premier code envoie un message vers l’usb et le deuxième écoute l’usb en permanence. Donc vous avez déjà les deux fonctionnalités, pourquoi ne pas les utiliser ensemble ?

     

    Pour mieux comprendre la fonctionnalité de cet espace de noms, Crossbow.lib.utils, est-ce que vous avez de la documentation pour ses classes ?

     

    Cordialement,

    Alex


    Alex Petrescu - MSFT
    lundi 8 mars 2010 13:41
  • Bonjour,

    Sur ce lien : http://www.megaupload.com/?d=B2J7SU1A
    Tu trouvera une documentation complète des librairies associées aux modules sur lesquelles je travail !

    Pour mieux centrer le sujet il y a en fait un module branché en usb avec le programme c# suivant flashé dessus :

    /**
     * SINK NODE
     * 
     * @file        Program.cs
     * @folder      Sink
     * @author      Fayçal OUAHOUAH
     * 
     * @version     2009/8/31    fouahoua     Initial version
     * 
     * Copyright (c) 2009 LATTIS Laboratory.   All rights reserved.
     * 
     */
    
    using System;
    using Microsoft.SPOT;
    
    using Crossbow.platform.imote2;
    using Crossbow.radio.cc2420;
    using Crossbow.lib.utils;
    using Crossbow.lib.utils.tos;
    using Crossbow.sensor.its400;
    
    namespace Sink
    {
        public class Program
        {
            public static void Main()
            {
                const ushort _rfChannel = (ushort)RadioChannel.Ch11;
                const ushort _rfPower = (ushort)RadioPower.M10DBM;
    
                const ushort _Adr_Supervisor = 0x06;
    
                ushort _Adr_Broadcast = 0xFFFF;
                ushort _Adr_PAN = 0x0A;
    
                byte[] packet_received = null;
                int timeout = 10000;
                
                //ushort TMP;
    
                Leds _leds = new Leds();
                Radio _radio = new Radio(_rfChannel, _rfPower, _Adr_PAN, _Adr_Supervisor);
    
                _leds.blueOn();
                _leds.greenOff();
                _leds.redOn();
    
                for (; ; )
                {
                    try
                    {
                     
                        packet_received = _radio.ReceiveAny(ref _Adr_PAN, ref _Adr_Broadcast, timeout);                                      
    
                        if (packet_received != null)
                        {  
    
                            _leds.blueOff();
                            _leds.greenOn();
                            _leds.redOff();
                            
                            if (packet_received[01] == 0x00)
                            {
                                SerialDump.print("\n Le chemin est : (M) -> (C) -> (S) ");
                            }
                            if (packet_received[01] == 0x03)
                            {
                                SerialDump.print("\n Le chemin est : (M) -> (C) -> (B1) -> (S) ");
                            }
                            if (packet_received[01] == 0x0F)
                            {
                                SerialDump.print("\n Le chemin est : (M) -> (C) -> (B1) -> (B2) -> (S) ");
                            }
                            if (packet_received[01] == 0x3F)
                            {
                                SerialDump.print("\n Le chemin est : (M) -> (C) -> (B1) -> (B2) -> (B3) -> (S) ");
                            }
                            if (packet_received[01] == 0x0C)
                            {
                                SerialDump.print("\n Le chemin est : (M) -> (C) -> (B2) -> [S] ");
                            }
                            if (packet_received[01] == 0x3C)
                            {
                                SerialDump.print("\n Le chemin est : (M) -> (C) -> (B2) -> (B3) -> (S) ");
                            }
                            if (packet_received[01] == 0x30)
                            {
                                SerialDump.print("\n Le chemin est : (M) -> (C) -> (B3) -> (S)");
                            }
    
                            if (packet_received[02] == 0xFF)
                            {
                                SerialDump.print("\n ALARM : PERSONNE SURVEILLEE EST ALONGEE\n");
                            }
    
                            if (packet_received[02] == 0x00)
                            {
                                SerialDump.print("\n INFO : PERSONNE SURVEILLEE EST DEBOUT\n");
                            }
    
                            if (packet_received[03] == 0xEE)
                            {
                                SerialDump.print(" ALARM : TEMPERATURE EST SUPERIEURE A 40 C \n");
                            }
                            if (packet_received[03] == 0x11)
                            {
                                SerialDump.print(" INFO : TEMPERATURE EST INFERIEURE A 40 C \n");
                            }
    
                            //SerialDump.print(packet_received);
                            //TosSerialDump.printWithTosHeader(packet_received);
    
                            SerialDump.print("  -------------------------------------------------- \n ");
                            
                            System.Threading.Thread.Sleep(20);
                        }
    
                        _leds.blueOn();
                        _leds.greenOff();
                        _leds.redOn();
    
                    }
    
                    catch (System.Exception ex)
                    {
                        SerialDump.print("App [CountSend]: " + ex.Message);
                    }
                }
    
            }
    
        }
    }
    

    De l'autre côté de l'usb nous avons le PC sur lequel le programme suivant tourne :

    using System;
    using System.IO;
    using System.Text;
    using System.Collections;
    using System.Reflection;
    using System.Threading;
    using System.Diagnostics;
    
    using _DBG = Microsoft.SPOT.Debugger;
    using _WP  = Microsoft.SPOT.Debugger.WireProtocol;
    
    namespace Microsoft.SPOT.Tools
    {
        class SerialDump
        {
            _DBG.Engine m_eng;
            FileStream  m_output;
            bool        m_fTimestamp;
            bool        m_fUsb = true;
            bool        m_fNewLine = true;
    
            //--//
    
            SerialDump( string[] args )
            {
                _DBG.PortDefinition pd       = null;
                string              port     = null;
                uint                baudrate = 0;
    
                for(int i=0; i<args.Length; i++)
                {
                    string arg = args[i];
    
                    if(String.Compare( arg, "-dump", true ) == 0)
                    {
                        m_output = new FileStream( args[++i], FileMode.Create, FileAccess.ReadWrite, FileShare.Read );
    
                        continue;
                    }
    
                    if(String.Compare( arg, "-timestamp", true ) == 0)
                    {
                        m_fTimestamp = true;
    
                        continue;
                    }
    
                    if(String.Compare( arg, "-usb", true ) == 0)
                    {
                        m_fUsb = true;
    
                        continue;
                    }
    
                    if (String.Compare(arg, "-serial", true) == 0)
                    {
                        m_fUsb = false;
    
                        continue;
                    }
    
                    if(port     == null) { port     =               arg  ; continue; }
                    if(baudrate == 0   ) { baudrate = UInt32.Parse( arg ); continue; }
                }
    
                if(m_fUsb)
                {
                    _DBG.PortDefinition[] ports = _DBG.AsyncUsbStream.EnumeratePorts();
    
                    if(port == null)
                    {
                        if(ports.Length == 0)
                        {
                            System.Console.WriteLine( "No Usb SPOT device is present" );
    
                            throw new ApplicationException();
                        }
                        else if(ports.Length == 1)
                        {
                            pd = ports[0];
                        }
                        else
                        {
                            System.Console.WriteLine( "More than one USB SPOT device is present" );
                            System.Console.WriteLine( "To dump data from a specific device, choose your device from the list below and execute:" );
                            System.Console.WriteLine( "  serialdump -usb <device> " );
                            System.Console.WriteLine( "" );
    
                            //
                            // More than one usb device attached; dump list so user can choose
                            //
                            for(int i = 0; i < ports.Length; ++i)
                            {
                                System.Console.WriteLine( "Device " + i + ": " + ports[i].DisplayName );
                            }
    
                            throw new ApplicationException();
                        }
                    }
                    else
                    {
                        foreach(_DBG.PortDefinition pd2 in ports)
                        {
                            if(port.Equals( pd2.DisplayName ))
                            {
                                pd = pd2;
                                break;
                            }
                        }
                    }
                }
    
                if(pd == null)
                {
                    if(port     == null) port     = "COM1";
                    if(baudrate == 0   ) baudrate = 115200;
    
                    pd = _DBG.PortDefinition.CreateInstanceForSerial( port, port, baudrate );
                }
    
                m_eng = new _DBG.Engine( pd );
            }
    
            void Run()
            {
                m_eng.Silent = true;
    
                m_eng.Start();
    
                m_eng.OnNoise   += new _DBG.NoiseEventHandler  ( OnNoise   );
                m_eng.OnMessage += new _DBG.MessageEventHandler( OnMessage );
    
                Console.WriteLine( "####### PRESS RETURN TO EXIT #######" );
                Console.ReadLine();
    
                m_eng.Stop();
                m_eng = null;
            }
    
            void OnNoise( byte[] buf, int offset, int count )
            {
                HandleOutput( buf, offset, count );
            }
    
            void OnMessage( _WP.IncomingMessage msg, string text )
            {
                byte[] buf = Encoding.ASCII.GetBytes( text );
    
                HandleOutput( buf, 0, buf.Length );
            }
    
            void HandleOutput( byte[] buf, int offset, int count )
            {
                while(count-- > 0)
                {
                    if(m_fTimestamp)
                    {
                        if(m_fNewLine)
                        {
                            HandleOutput( String.Format( "[{0:HH:mm:ss:fff}]  ", DateTime.Now ) );
                        }
                    }
    
                    char c = (char)buf[offset++];
    
                    HandleOutput( new String( c, 1 ) );
    
                    m_fNewLine = (c == '\n');
                }
            }
    
            void HandleOutput( string text )
            {
                Console.Write( text );
    
                byte[] buf = Encoding.ASCII.GetBytes( text );
    
                if(m_output != null) m_output.Write( buf, 0, buf.Length );
            }
    
            //--//
    
            static void Main( string[] args )
            {
                try
                {
                    SerialDump o = new SerialDump( args );
    
                    o.Run();
                }
                catch(ApplicationException)
                {
                    System.Threading.Thread.Sleep(5000);
                }
                catch(Exception e)
                {
                    Console.WriteLine( "{0}", e.ToString() );
                }
            }
        }
    }
    

    Ces deux programmes communiquent parfaitement l'un avec l'autre ! Mais dans un seul sens : du module vers le PC ! Mon but est d'inverser le sens de communication. Soit émettre des informations depuis le PC à destination du module par le biais de l'usb !

    Encore merci pour l'intérêt que tu porte à ma demande :)
    lundi 8 mars 2010 18:13
  • Bonjour,

    Je ne trouve pas l’espace de noms Microsoft.SPOT.Tools dans votre documentation.

     

    Quand même, si vous avez des classes pour envoyer et pour lire les informations d’usb, pourquoi ne pas faire un programme qui utilise les deux ?

     

    Vous pouvez faire deux threads séparés, chacun d’eux s’occupant d’une fonctionnalité : écoute et envoi.

     

    Cordialement,

    Alex


    Alex Petrescu - MSFT
    mardi 9 mars 2010 12:44
  • Bonjour,

    étant donné que je doit finir mon projet cette semaine j'ai décidé de voir avec quelque prof si je pouvais contourner mon problème et j'y suis finalement parvenu. C'est loin d'être une solution très propre mais elle fonctionne. Je n'ai donc plus besoin des commandes que je cherchai ! Je te remercie grandement tout de même :)

    Si jamais tu t'intéresse toujours au système sur lequel je travaillais je pourrai te poster mon rapport ainsi que la bibliothèque que tu voulais si je la trouve ;)

    Cordialement,

    Sylvain
    • Marqué comme réponse Alex Petrescu vendredi 12 mars 2010 11:07
    jeudi 11 mars 2010 12:26
  • Bonjour,

     

    Je suis content de voir que vous avez trouvé une solution. Si vous avez d’autres questions, on vous attend sur le forum.

     

    Bonne chance avec la continuation de votre projet !

     

    Cordialement,

    Alex


    Alex Petrescu - MSFT
    vendredi 12 mars 2010 11:07