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 :

l'envoi des données [Débutant]


Sujet :

C#

Vue hybride

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 131
    Par défaut l'envoi des données
    bonjour,
    J'aimerai obtenir une petite aide sur l'envoi des données via le porte série entre mon pc et une commande d'axe.
    pour pouvoir communique avec:
    -il faut que j'envoie un "char(10)".
    -après j’attends la réponse via le port série.
    -ensuit j'envoie les données que j'ai télécharger sur mon pc que je stock dans un buffer.
    - pour que la commande d'axe communique elle attend un paquet de 100 caractères et seulement de 100 pour répondre au PC.
    Après réception de l'accusé de réception d'un paquet je peux passer au suivant.elle attend 100 caractères et de ne plus en recevoir pour pouvoir me répondre.

    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
     
    public bool ison = false;
    public string str;
     
    private void button_charger_Click(object sender, EventArgs e)
    {
    textBox1.Text= string.Empty;
    openFilDialog1.Title="chargement";
    openFilDialog1.FilterIndex =1;
     
    if(openFilDialog1.ShowDialog(this)==DialogResult.OK)
    {
    StreamReader sr =new StreamReader(openFilDialog1.OpenFile(), Encoding.Default);
    char [] tab =new char [100];
    str = string.Empty;
     
    str = sr.ReadToEnd();
    textBox1.AppendText(str+"\r\n");
     
    }
     
    private void button_envoyerClick(object sender, EventArgs e)
    {char [] A = {(char)10};// char (10)
    serialPort1.Write(A,0,1);
    while(!ison) {} // attente de la rection de la réponse de la commande d'axe
     
    if (str.Length>0)
    {
    int max =100;
    int i;
    string don;
     
    for(i=0; i< str.Lenght - (str.Lenght%100); i=i+100)
    {
    don string.Empty;
    don =str.Substring(i,100);
    serialPort1.Write(don);
    }
     
    max = str.Lenght%100;
    don=str.Substring(i,max);
    serialPort1.Write(don);
    }
    } 
     
     private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
     
     
               // pour la boucle while dans le bouton envoyer
                if (!ison)
               {
                   ison = true;
     
               }
    }
    }
    j'ai essayé ce code mais la commande d'axe ne reçois les données.

    je pense que j'ai mal interpréter le "char (10)" dans le code???????

    Si quelqu'un peut m'aider ! Merci d'avance.

  2. #2
    Membre Expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Par défaut
    Salut,

    plusieurs petites questions pour essayer de comprendre un peu mieux :
    - il faut que tu "amorces" la communication avec ton device avec un tableau de 10 char ? puis tu lui causes à coup de 100 char avec accusé de réception en retour qui te permet de savoir que tu peux renvoyer un paquet de 100 char ?
    - es-tu sûr qu'il s'agit de char et non de byte (le char en C# semble faire 2 bytes contrairement au C) ?
    - ta boucle infinie ne pause pas de problème sans utilisation de threads ?
    - enfin, as-tu fait du pas-à-pas pour voir où ça déconnait, histoire d'avoir un peu plus de précision ?

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 131
    Par défaut
    oui il faut que j'envoie "un char (10)" mais ce n'est pas un tableau, c'est une commande car dans le programme de la commande d'axe il y'a un programme qui serra d’éclanche pour recevoir les données.
    voila un bout de 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
     
    '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
    je viens de faire le pas à pas ' et j'ai trouver que la valeur de A = char {[1]} ;
    mais moi je déclarer le "char (10)" comme si motionner dans le code de la commande d'axe.

  4. #4
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Je suis pas expert en notation raccourcie, mais pour moi, A n'est pas du tout un char[10] :

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char [] A = {(char)10};

    Pour moi c'est un char[1] dont la ligne 0 vaut 10 (c'est à dire '\n')

    Si c'est vraiment ça que tu veux envoyer,je vois pas trop pourquoi tu passes par un char[1], autant passer par un char tout court.

    PS : Ça fait plusieurs topics où je vois des gens jouer avec char et autres string sur le port série sans faire d'encodage... Par défaut, C# travaille en unicode. Pour moi, il manque peut-être un ASCIIEncoding quelque part pour que ça fonctionne.

  5. #5
    Membre confirmé
    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
    Par défaut
    Bonjour,
    une précision : 10 est la valeur ordinale de la table ASCII qui correspond à la lettre 'A' en hexadécimal et au caractère "\n" ou "\u000A" (caractère de contrôle fin de ligne LF)

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 131
    Par défaut
    Merci beaucoup pour les retour,

    j'ai déjà essayer " serialPort1.Write("\u000A")" avant de passer à "char [] A = {(char)10};".
    mais c'est toujours la même chose, je reçois un retour de la commande d'axe, puis les données sont envoyer via le port, à la Fin la commande d'axe ne récupère rien.
    j'ai réussi a faire l’inverse (récupère les données de la commande d'axe), mais la j'arrive pas a lui envoyer .
    je comprend pas ou se trouve le problème.

    voila le code de la tache qui permet a la commande d'axe de réoccuper les données de mon pc:

    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
     
    PROG
     
    'Initialisation
    Init:
    halt initial
    LED(@F6)=OFF
    pointeur&=1
    paquet$=""
    clearin #2 //vide le buffer rxd
    clearout #2 // vide le buffer tx
    print #2,chr$(10);
    wait outempty (#2) // outempty indique que le buffert est vide et que le dernier caractére a éte envoyé
     
    repete:
     
    repeat 
    A&=carin(#2)
    until A&>=100
    paquet$=input$ #2,100
    wait carin(#2)=0 // retourne le nbr de caractére présent dans le buffer
     
    seek #3,pointeur&
    print #3,paquet$;
    pointeur&=pointeur&+100
    clearin #2
    clearout #2
    print #2,chr$(10);
    wait outempty (#2)
     
    if pointeur&<=127801 then
    jump repete
    else 
    jump fin
    end if
     
    fin:
    dbtcom=off
    clearin #2
    clearout #2
    close #2
    run initial
     
    delay 2000
    END PROG

  7. #7
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Pour le ASCII Encoding, je parle de là :

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    don =str.Substring(i,100);
    serialPort1.Write(don);

    Tu envoies un string et non un char au port série.

    Deux choses :
    1/ don peut faire moins de 100 caractères de long. Il faut le compléter par des char 0.
    2/ comme dit plus haut, C# travaille en unicode. Donc une string de 100 caractères fait 200 bytes en réalité. Il faut passer par un ASCIIEncoding suivi d'un ToCharArray()

    Je te conseille donc :

    De faire un ASCIIEncoding et ToCharArray de ta string avant de faire des substr.
    Puis de la transmettre par blocs de 100 à ton port série, en passant par un char[100] temporaire pour veiller à toujours avoir 100 caractères. (pense à bien le vider à chaque fois !)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 18
    Dernier message: 26/06/2008, 10h10
  2. [SQL] Pb Sql lors de l envoie des données via un formulaire
    Par xtiand4 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 12/06/2006, 14h18
  3. Envoi des données via mail
    Par zorba49 dans le forum ASP
    Réponses: 4
    Dernier message: 10/04/2006, 14h35
  4. Réponses: 1
    Dernier message: 05/04/2006, 09h49
  5. socket : envois des données impossible
    Par thechief dans le forum Réseau
    Réponses: 16
    Dernier message: 18/03/2006, 19h28

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