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

C# Discussion :

envoi des données via le port série


Sujet :

C#

  1. #1
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 131
    Points : 46
    Points
    46
    Par défaut envoi des données via le port série
    Bonjour,
    j'ai réaliser une interface qui va établir une communication entre mon pc et une commande d'axe via le port série.
    pour pouvoir communiquer, la commande d'axe attend un code (qui va déclencher la tache recevfile -recevoir des données) et qui serra confirmet en eppyant sur le F6 de son IHM.

    je me explique: j'ai fait une boucle while d'ou j'ai crée une variable bool (ison), donc avec le bouton envoyer, j'envoie la ligne de code (recvfile) sur le port :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     serialPort1.Write("\u000A");
    puis je déclenche la boucle while qui va attendre un retour d'un accord de la commande d'axe, une fois confirmer sur la commande d'axe avec le F6 elle envoie un signe sur le port( que je récupére avec l’événement datareceived) et la l'envoie des données commence (visualisation de la led tx, mais la led rx ne clignote pas), à la fin du transfert la commande d'axe ne reçois rien je retrouve pas les données.

    voila le code de la commande d'axe :
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
     
    PROG
     
    Init:
     
    'Ouverture des ports de communication
    Open "Serial1:9600,8,E,1" AS #2
     
    'Vidage des tampons
    clearin #1
    clearout #1
    clearin #2
    clearout #2
     
    'Arret des taches de communication
    halt envfile
    halt recfile
    halt recprog
    halt envprog
     
    dbtcom=off
    carac$=""
    char$=""
    chaine$=""
     
    traitement:
     
    'Attente utilisateur appuie sur F6
    wait dbtcom=on
     
    'Lecture des octets
    repeat
      if len(carac$)<=8 then
      char$=input$ #2,1
      end if
      carac$=carac$+char$
    until carin(#2)=0
     
    'Acquisition du "code opération"
    car$=left$(carac$,1)
     
    'Si code 10 alors lancer la tache recfile
    if car$=chr$(10) then 
    halt envfile
    halt recprog
    halt envprog
    RF=right$(left$(carac$,3),2)
    run recfile
    end if
     
    'Si code 11 alors lancer la tache envprog
    if car$=chr$(11) then
    halt envfile
    halt recprog
    halt recfile
    EPROG=right$(carac$,3)
    run envprog
    end if
     
    'Si code 12 alors lancer la tache recprog
    if car$=chr$(12) then
    halt envfile
    halt envprog
    halt recfile
    RP=right$(carac$,3)
    run recprog
    end if
     
    'Si code 13 alors lancer la tache envfile
    if car$=chr$(13) then
    halt envprog
    halt recprog
    halt recfile
    EF=left$(carac$,1)
    run envfile'
    end if
     
    clearin #2
    clearout #2
    close #2
     
    jump init
     
    END PROG
    et voila mon code :
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
     public bool ison = false;
     
     private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
     
      if (!ison)
               {
                   serialPort1.Write("\u000A"); pour recevfile
                   ison = true;
     
               }
    }
     
      private void button_envoyer_Click(object sender, EventArgs e)
            {
                StatusLabel1.Text = "Appuyez sur 'F6' de la commande numérique puis patientez...";
                serialPort1.Write("\u000A"); // lance la tache receveFil chr13
     
                while (!ison) { }
     
     
                    StreamReader sr = new StreamReader(openFileDialog1.OpenFile(), Encoding.Default);
     
                    try
                    {
                        string data = sr.ReadLine();
     
                        while (data != null)
                        {
                            bBufferBytes = System.Text.Encoding.ASCII.GetBytes(data); //Place le contenu dans un buffer d'octets (ASCII: 1 char = 1 octet) (UNICODE: 1 Char = 2 octets)
                            serialPort1.Write(bBufferBytes, 0, bBufferBytes.Length); // Ecrit le buffer complet sur le SerialPort                   
                            data = sr.ReadLine();
                            StatusLabel1.Text = "Transfert en cours...";
     
                        }
                    }
     
                    finally
                    {
                        if (sr != null)
                            sr.Close();
                        StatusLabel1.Text = "Transfert Fini ";
                    }
     
     
            }
    pouvez_ vous m'aider

  2. #2
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2011
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2011
    Messages : 72
    Points : 107
    Points
    107
    Par défaut
    à la fin du transfert la commande d'axe ne reçois rien je retrouve pas les données.
    Bonjour,
    Un seul conseil, assure toi que les datas envoyés soient au bon format et correspondent aux datas attendus par ton axe.
    Décortique ta chaine, caractère par caractère, en vérifiant sa valeur ordinale avec une table ASCII.

    Ce bout de code m'a toujours aidé pour la mise au point des communications et éviter les pièges des caractères étendus (la valeur ordinale est en décimal).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
                string line = "0123456789";
                for (int i = 0; i < line.Length; i++)
                {
                    int ordinal = (int)(line[i]);
                    char car = (char)(ordinal);
                    textbox.AppendText("Caractère n°" + (i + 1).ToString() + " >" + car + "< Ord -> #" + ordinal.ToString() + "\n");
                }

  3. #3
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 131
    Points : 46
    Points
    46
    Par défaut
    merci pour ta réponse Dudule70,

    j'ai aussi réaliser la réception des données à partir de la commande d'axe vers mon pc, cette tache j'ai réussi à la faire (je récupéré les données de la commande d'axe et je les afficher dans une textBox)
    voila le type de données que j'envoie ou que je récupère:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    987654321
    010691103
    321037403
    000000000
    000000000
    000000000
    000000000
    et la j'envoie les même données mais ça fonctionne pas, le transfert ce fait mais elle ne réceptionne rien.

    pour la réception :

    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
    31
    32
     
     private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                serialPort1.Write("\u000D");// lance la tach envoiFil
     
               // pour la boucle while dans le bouton envoyer
                if (!ison)
               {
                   serialPort1.Write("\u000A");// lancer la tach recevfil
                   ison = true;
     
               }
     
               // string value = "";//string vide
                  //tant qu'il y a des données entrée on continue
                while (serialPort1.BytesToRead > 0)
                {
                    char[] buffer = new char[255]; // on crée un char de 255 caractere
                    int longueur_bytes_read = serialPort1.Read(buffer, 0, buffer.Length); //lecture du buffer jusqu'a sa longeur buffer.Length
                    //tes characteres sont contenus dans buffer.
                    //on remplit notre string value byte par byte par notre tableau de charactere buffer, le += fait que l'on écrase pas les données qui sont inserées, mais on les ajoutes.
                    for (int i = 0; i < longueur_bytes_read; i++)
                    {
     
                        value += buffer[i];
     
     
                    }
                }
     
     
            }

  4. #4
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2011
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2011
    Messages : 72
    Points : 107
    Points
    107
    Par défaut
    Bonjour,
    C'est dangereux de faire une boucle sans timeout de sortie!
    regarde si ton pb n'est pas dans cette boucle.

  5. #5
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 131
    Points : 46
    Points
    46
    Par défaut
    Bonjour;
    j'ai vérifier au coté de la boucle mais si pas le problème, car j'arrive à sortir de la boucle vu que, quand je reçois un signal venant de la commande d'axe je commence à envoyer les données.

    je suis entrain de vérifier au niveaux du port série (contrôle du flux)
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
     
            public bool RtsEnable ;//{ get; set; };
            public bool DtrEnable ;//{ get; set; }
            public bool CtsHolding ; //{ get; }
            public bool DsrHolding ;//{ get; }
     
     private void button_connecter_Click(object sender, EventArgs e)
            {
                serialPort1.PortName = portBox.SelectedItem.ToString();
                serialPort1.BaudRate = 9600;
                serialPort1.DataBits = 8;
                serialPort1.Parity = Parity.Even;
                serialPort1.StopBits = StopBits.One;
     
                serialPort1.Handshake = Handshake.None;
                serialPort1.PortName = portBox.Text;
                serialPort1.RtsEnable = false;
                serialPort1.DtrEnable = false;
     
     
     
                // serialPort1.Open();
                serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived);
                serialPort1.PinChanged += new SerialPinChangedEventHandler(serialPort1_PinChanged);
                try
                {
                    serialPort1.Open();  //Ouvrez le SerialPort
                    bool blnCTS = serialPort1.CtsHolding;// lire CTS
                    bool blnDSR = serialPort1.DsrHolding;// lire DSR
                    bool blnCD = serialPort1.CDHolding;// lire CD
                    StatusLabel1.Text = "serialPort1 : " + portBox.Text + " Opened";//Mettre à jour le StatusStrip
                    MessageBox.Show("Opened");
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Failed: " + ex.Message);
                }
    }
     
     private void serialPort1_PinChanged(object sender, SerialPinChangedEventArgs e)
            {
                // Si les trois signaux d'entrée changent au-dessus dudit cet événement PinChanged sera trriggered
     
                bool b;
     
                switch (e.EventType)
                {
     
                    case System.IO.Ports.SerialPinChange.CDChanged:
     
                        b = serialPort1.CDHolding;
     
                        break;
     
                    case System.IO.Ports.SerialPinChange.CtsChanged:
     
                        b = serialPort1.CtsHolding;
     
                        break;
     
                    case System.IO.Ports.SerialPinChange.DsrChanged:
     
                        b = serialPort1.DsrHolding;
     
                        break;
     
                    default:
     
                        break;
     
                }
            }
    mais je ne trouve pas

Discussions similaires

  1. Réponses: 11
    Dernier message: 06/04/2015, 12h04
  2. envoi et réception des données via serial port
    Par azert2010 dans le forum C#
    Réponses: 2
    Dernier message: 09/05/2011, 23h53
  3. Récupérer des données via le port usb
    Par matmuth dans le forum C++Builder
    Réponses: 12
    Dernier message: 11/05/2005, 16h34

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