SerialPort

missceline33 Messages postés 42 Date d'inscription mercredi 27 avril 2005 Statut Membre Dernière intervention 8 février 2007 - 15 nov. 2006 à 10:33
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 - 15 nov. 2006 à 12:43
Bonjour,

je cherche à faire communiquer mon application avec un laser.

Par hyperterminal tout fonctionne correctement mais par mon progrmme un problème apparait.

Lorsque j'envoie mes commandes l'appreil comprend et execute et il me
retourne une réponse et c'est cette réponse qui ne fonctionne pas
toujours.

Pendant x tentatives cela va fonctionner correctement et la x+1ème ca
ne marchera pas, la chaine de retour contient soit des caractères
étranges ?# soit des doublement de lettres fire devient firre ou ffire.

Mais le coup suivant tout remarche correctement.

Est-ce quelequ'un aurait une idée, des suggestions...

Merci d'avance


Céline

4 réponses

MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
15 nov. 2006 à 10:45
Salut,

Bon, a premiere vue ca ne va pas forcément etre facile a résoudre, sachant que pour nous ce comportement sera dur a reproduire ^^

Par contre, si tu pouvais nous donner :
- La marque du matériel (douchette ?) utilisé.
- Le type de connexion (bluetooth ?)
- Les bouts de code incriminés

Afin qu'on puisse avoir quelques pistes.

Mx
MVP C# 
0
missceline33 Messages postés 42 Date d'inscription mercredi 27 avril 2005 Statut Membre Dernière intervention 8 février 2007
15 nov. 2006 à 11:03
En fait, il s'agit d'une connexion RS232 entre un PC et un laser.

Dans la documentation du laser ils disent:

RS232 communication parameters are

9600 BAUD, 8 bits, 1 stop bit, no parity

The commands via RS232 can be sent with maximum rate of 20 Hz. The
connection is working in half duplex without Xon, Xoff and RTS CTS.

The answer from the laser consists in "CRLF" followed by 15 caracters.

Ca c'est ce qu'on m'a fourni.


Dans mon code, j'ai fait plusierus tentatives pour la méthode de lecture:(car j'utilise la classe serialPort de C# 2005)

readLine je ne peux pas car je 'ai pas de caractère de fin de ligne particulier

read, readExisting, readChar, readByte.....certaine méthode font même
planter l'application dans le sens ou la fonction appelée lors de la
reception de données n'est pas déclenchée.


extrait de mon code

Voici un exemple de commande envoyée


string commande = "IF\r\n";

               

 Communication.Instance().Envoyer(commande);             

               
while (Communication.Instance().Attendre)

               
{                  


                   
Console.WriteLine("j'attends");

                   
Thread.Sleep(2000);                   


               
}                           


                Console.WriteLine("reveille");


               
if (Communication.Instance().Reponse.Length == 17 && 
Communication.Instance().Reponse.ToUpper().CompareTo("\r\nIF. 00 00 00
00") != 0)

                {

                   
MessageBox.Show("Problème lors de
l'opération","Attention",MessageBoxButtons.OK,MessageBoxIcon.Error,MessageBoxDefaultButton.Button1);

                   
Communication.Instance().Reponse = "Erreur c'est fini";

                    return;

                }


Traitement au niveau de la communication


constructeur de communication

_reponse = String.Empty;

            _reponseTMP = String.Empty;

            _attendre = false;


            _serialPort = new SerialPort();

            _serialPort.PortName = Parametres.Instance().PortLaser;

            _serialPort.BaudRate = Parametres.Instance().BaudRateLaser;

            _serialPort.Parity = Parity.None;

            _serialPort.StopBits = StopBits.One;

            _serialPort.DataBits = 8;

           
_serialPort.DataReceived += new
SerialDataReceivedEventHandler(ReceptionInformation);


            Console.WriteLine("port ouvert?" + _serialPort.IsOpen);

            try

            {

                _serialPort.Open();

            }

            catch (Exception e)

            {

               
Console.WriteLine("pb à l'ouverture du port " + e.Message);

            }


Envoi et reception

public void Envoyer(string commande)

        {

            try

            {

                _attendre = true;

                _reponse = String.Empty;

                _reponseTMP = String.Empty;

               
Console.WriteLine(DateTime.Now.ToLongTimeString());

                _serialPort.WriteLine(commande);

               
Console.WriteLine("Envoi " + DateTime.Now.ToLongTimeString());

               
_thread = new System.Threading.Thread(new
System.Threading.ThreadStart(LancerThread));

                _thread.Start();


            }

            catch (Exception e)

            {

                _attendre = false;

               
Console.WriteLine("Problème d'envoi de données" + e.Message);

            }

        }


        private void ReceptionInformation(object o, SerialDataReceivedEventArgs arg)

        {

            try

            {

                if (_attendre)

                {

                   
_reponseTMP = _reponseTMP + _serialPort.ReadExisting();

                    //ou j'ai aussi essaye

               
     //byte[] tmp =  new
byte[_serialPort.BytesToRead];

               
      //_serialPort.Read(tmp,0,tmp.length);

           
           //for(int
i=0;i<tmp.length;i++)

                        //{

               
             // 
_reponseTMP = _reponseTMP + (char)tmp[i];

           
              
//}

                   
Console.WriteLine("--" + _reponseTMP + "--");

                   
if (_reponseTMP.Length == 17)

                    {

                       
_reponse = _reponseTMP;

                       
_attendre = false;

                       
try

                       
{

                           
_thread.Abort();

                       
}

                       
catch (Exception ee)

                       
{

                           
;

                       
}

                    }

                }

            }

            catch (Exception e)

            {

                _attendre = false;

               
Console.WriteLine("Problème de reception d'information " + e.Message);

            }

        }


Voilà, si vous avez une piste.....


Céline
0
TMONOD Messages postés 256 Date d'inscription mardi 25 novembre 2003 Statut Membre Dernière intervention 6 novembre 2009 1
15 nov. 2006 à 12:42
Bonjour,
A tout hazard, tu as essayé d'adapter l'exemple MSDN ?
http://msdn2.microsoft.com/en-us/library/system.io.ports.serialport.aspx

Jcbé[^]
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
15 nov. 2006 à 12:43
les méthodes soi disant non appelées font elles une opérations telles que :
1 - interactions avec un IHM
2 - lancer un timer system.windows.forms
3 - euh jai un trou...enfin yen a dautres

si c'est le cas, il se peut que cela soit bien lancé, mais seffectue dans le thread pool et plante de manière totalement transparente pour toi. dans ce cas il faut que tu utilise le cross threading pour etre sur de ce qui se passe.


ensuite :
The connection is working in half duplex without Xon, Xoff and RTS CTS.
je ne te voie pas régler ces paramètres dans la gestion de ton instance de serialport


ensuite, es tu sur a 200% que par hyperterminal tout va bien? cest peut etre tout simplement le périph distant qui a des problemes demission, le cable qui est endommagé, le port qui merde, ou que sais je encore....
dans ta doc est tu sure que le caractères #? (ou autres trucs bizzarres) ne sont jamais censés etre envoyés?
sinon il me semble que les caractères peuvent etre transformés a la reception par un simple mauvais paramétrage du port com (pas impossible).
0
Rejoignez-nous