rs232 acquisition et conversion

Bonjour

je dispose d'un codeur heidenhain dont je souhaite récupérer la valeur afficher via le port série.

je "part" d'un programme labview qui fait ce travail mais j'ai besoin de le faire sur un Arduino afin d'effectuer une conversion valeur numérique vers un tension analogique.

après plusieurs essais j'arrive a envoyer correctement le commande mais ses sur le stockage de la chaîne de retour ou je n'arrive pas a comprendre la façon de faire.

voici le programme que j'ai fait en dernier

char recu[17];
String reponse;
int i;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600, SERIAL_7E2);

}

void loop() {
  // put your main code here, to run repeatedly:
  Serial.print("\02\r\n");
  delay(100);        // delay in between reads for stability
  i=0;
  while(Serial.available()>0) {
    recu[i]=Serial.read();
    reponse +=recu[i];
    i++;
    delay(200);
  }
  if (i>0){
    Serial.println(reponse + ".");
  }
  
  delay(1000);

}

je vous joint le programme labview face avant et diagramme et en 3.png la face avant mais avec l'affichage avec les code héxa

ensuite la chaine de sortie et convertie en "nombre" via
http://zone.ni.com/reference/fr-XX/help/371361L-0114/glang/fract_exp_string_to_number/

en vous remerciant de votre aide.

3.png

Bonsoir

Sur ce forum un lien vers la notice du codeur serait beaucoup plus 'productif' que des infos indirectes via Labview , logiciel qui pour plusieurs raisons ne dit rien a une bonne partie des habitués du forum.

Ceux ci se procurent eux mêmes les logiciels et privilégient l'open source, le multiplateforme et le gratuit, ... pas du tout le profil de Labview :wink:

voici le lien vers la notice

Bonjour,

Je ne comprends pas trop ton programme.
Tu initialises ton port série pour la liaison avec ton appareil heidenhain et à la fin du programme, tu essaies d'envoyer ce que tu espères avoir reçu vers le moniteur série ?

Ai je bien compris ?

Pierre

Bonjour yvees,

Pourriez vous décrire précisément (taille, format, structure, codage...) les trames :
_ que vous envoyez à l'Arduino
_ que vous voulez que l'Arduino renvoie

Egalement décrire ce qui vous gêne dans votre programme actuel.
On peut voir déjà qu'il y a un souci avec l'utilisation [modifié] de la String "reponse" qui n'est jamais réinitialisée.
Pourquoi une String et pas une chaine de caractères (un tableau)?

Cordialement,
bidouilleelec

@petrusfr

oui ses ca le temps du développement pour voir ce que reçoit/comprend l'arduino.

@bidouilleelec

voici la commande qui demande a l’appareil de renvoyer la valeur afficher:

Serial.print("\02\r\n");

cette commande marche car avec un adaptateur rs232/usb et un terminal série, lorsque l'arduino envoi cette commande l'appareil renvoyer bien la valeur afficher

la chaîne renvoyer par l’appareil est "décrite" dans les image 1et 3 du 1er post la différence et le mode d'affichage en 1 se l'affichage normal et en 3 ses avec les "code héxa".

pour

Egalement décrire ce qui vous gêne dans votre programme actuel.
On peut voir déjà qu'il y a un souci avec l'utilisation [modifié] de la String "reponse" qui n'est jamais réinitialisée.
Pourquoi une String et pas une chaine de caractères (un tableau)?

j'avoue que je ne sais pas ce qui serai le mieux la je suis ouvert au proposition, sachant que j'aimerai pouvoir "traiter" la valeur reçut en numérique afin d'effectuer un calcul (mise a l'échelle) pour faire correspondre la valeur a 1 tension.

Bonjour,

Alors c'est bien ce que je pensais, cela ne peut absolument pas fonctionner.
Tu essaies de communiquer avec 2 appareils sur le même port série : le nb280 et ton pc. Tu peux contourner le problème de 2 manières différentes : soit utiliser softwareserial , soit utiliser une carte possédant plusieurs ports série en natif : la méga par exemple.

Dans ton programme, ta demande paraît correctement effectuée . Vérifier tout de meme le parametrage de ton nd280 car 9600 baud n'est pas, me semble t'il, la valeur d'origine du paramétrage.

Pour la réception, tu as juste besoin de convertir les caractères significatifs en nombre. Je te donne une piste : le caractère de code ascii 48 est 0,le code 49 est 1 ....
Donc pour convertir un code ascii en nombre, il faut vérifier que le code est compris entre 48 et 57, ensuite, lui ôter 48, et tu te retrouves avec la valeur du nombre ascii reçu.

En espérant avoir été clair pour te mettre sur la bonne voie.

Pierre

Re,
En relisant plus attentivement ton attente finale, il faut se rappeler que les cartes uno ne peuvent pas faire,sans ajout de cna externe,une véritable sortie analogique mais une sortie en PWM sur 256 niveaux (de 0 à 5 volts, soit une résolution de 0,0195 volts).
En fonction de l'utilisation finale, cela peut être rédhibitoire.

Pierre

@petrusfr

Alors c'est bien ce que je pensais, cela ne peut absolument pas fonctionner.
Tu essaies de communiquer avec 2 appareils sur le même  port série : le nb280 et ton pc. Tu peux contourner le problème de 2 manières différentes : soit utiliser softwareserial , soit utiliser une carte possédant plusieurs ports série en natif : la méga par exemple.

non c'était un bricolage pour vérifier que l’appareil émettait bien la valeur après avoir reçut la commande, un bricolage pas safe du tout.

le nd280 ne communique qu’avec l'arduino.

je préfère utiliser le port série matériel a cause du buffer, jme sens pas trop a l'aise sur l’utilisation du softwareserial.

j'ai prit la vitesse la + basse le temps du développement, j'augmenterai cette vitesse et réduirai les delay a la fin.

pour le réception je vois un peu ce qu'il faut faire avec tes indication: réception des 17byte dans un tableau puis "écrémage" des parties non utile et enfin conversion.

pour la sortie analogique j'ai acheter un dac mpc4725 afin d’éviter ce problème car on va visualiser ce signal sur un ocsillo.

en te remerciant pour ton aide

yvees:
@petrusfr

Alors c'est bien ce que je pensais, cela ne peut absolument pas fonctionner.

Bon :
Si vous tenez absolument à utiliser une String (avec un S majuscule):
Il manque quelque part dans votre bricolage une instruction comme :

reponse =""; // nettoyer la chaine

à vous de voir où la placer.

Connaissez-vous l'existence du moniteur série?

Cordialement,
bidouilleelec