Basic : getstr et putstr
Répondre à la discussion
Affichage des résultats 1 à 23 sur 23

Basic : getstr et putstr



  1. #1
    invite59dd9621

    Basic : getstr et putstr


    ------

    Bonjour,

    Je travaille avec un cb220B, je veux récupérer la distance séparant l'obstacle détecté par un ultrason et le capteur.
    J'ai trouvé un programme qui le fait et qui utilise getstr. Lorsque j'affiche le résultat avec la commande debug tout marche bien mais lorsque j'envoi le résultat sur le port RS232 avec la commande putstr, je ne peux plus la récupérer. Après plusieurs tests j'ai remarqué que je peux envoyer n'importe quelle variable à condition qu'elle n'a aucune relation avec la valeur récupérer par getstr.
    Je suis vraiment bloqué à ce niveau, je ne sais plus quoi faire pour que je puisse envoyer et récupérer le résultat sans aucun problème.
    NB. Le programme avec le quel je récupère le résultat est Matlab.

    Merci pour toute réponse.
    SVP aidez moi

    -----

  2. #2
    Dlzlogic

    Re : Basic : getstr et putstr

    Bonjour,
    Vous pouvez par exemple renommer la variables récupérée pas getstr avant de l'envoyer par putstr, mais je pense que la raison est plus compliquée. Par exemple, ce pourrait être la présence ou l'absence d'un séparateur de fin de valeur.
    Essayez de comparer dans le détail, c'est à dire le format de l'information, entre ce que renvoie getstr et ce qu'accepte putstr.

  3. #3
    invite59dd9621

    Re : Basic : getstr et putstr

    Merci pour la réponse,
    variable = getstr (canal,NB data)
    variable : variable (de type string) servant à mémoriser le résultat.

    Putstr canal,data
    pour envoyer une chaine de caractère sur le canal RS232.

    je pense donc qu'on a le même type de variable. Mais le problème lorsque je remplace getstr par une chaine (par exemple "R059" même résultat retourné par getstr)le programme tourne sans aucun problème.
    je vous donne le programme que j'ai fait:

    Const Device = CB220
    'Set Display 0, 1, 9600, 60
    Opencom 0,9600,3,50,50 ' Initialisation pour série
    Input 3
    Dim cm1 As Byte
    Dim inch As String*5
    Dim inch2 As String
    Dim i As Integer

    For i=0 To 500
    Bclr 0,0
    High 3
    Low 3
    Delay 100
    inch= Getstr(0,4)
    inch2 = Right(inch,3)
    cm1 = Val(inch2)
    Delay 1000
    Putstr 0,inch2,2
    Put 0,cm1,2
    'Put 0,i,2
    Next

    NB: lorsque je récupère i, tout va bien mais le problème lorsque je récupère cm1 ou inch2.

  4. #4
    Dlzlogic

    Re : Basic : getstr et putstr

    Il y a très longtemps que je n'ai pas fait de Basic et très longtemps que je n'ai pas fait de communication série.
    Cependant, il y a des choses qui me choquent un peu.
    Vous ouvrez le port série. Je ne suis pas sûr que vous puissiez faire successivement un get et un put.
    Moi, j'essayerais de faire les deux opérations successivement. D'abord une série de get, avec stockage et vérification des résultats, puis une série de put des valeurs que vous avez stockées.
    J'ai fait ce genre de chose (il y a longtemps) avec un écran minitel qui me servait d'écran alphanumérique de contrôle pendant que je faisais du graphique. Je ne crois pas avoir réussi à mélanger les deux types d'opération en même temps.
    En d'autres termes, la commande OpenCom ouvre-t-elle en lecture ET en écriture? je n'en suis pas sûr.

  5. A voir en vidéo sur Futura
  6. #5
    invite59dd9621

    Re : Basic : getstr et putstr

    a mon avis la commande opencom permet d'ouvrir le port en lecture ou en écriture, c'est ce que j'ai remarqué à partir des testes que j'ai traité. Maintenant, je ne sais pas quoi faire pour que je puisse récupérer la valeur de la distance et de l'envoyer sur le port rs232. Mon objectif final non pas d'envoyer la valeur de la distance mais de l'enregistrer dans un fichier. J'ai pas trouvé de moyen pour l'enregistrer directement à partir du code basic compatible avec le logiciel "cubloc studio".
    SVP, si vous avez une idée, n'hésitez pas de m'expliquer. En fait je suis débutante dans le domaine, mais j'essaye de ce familiariser.

  7. #6
    invite59dd9621

    Re : Basic : getstr et putstr

    Bonjour,
    voila j'ai encore un problème au niveau de mon code, maintenant j'ai réussi à envoyer le contenu de la variable cm2, mais le problème dans sa récupération par matlab. En fait, il m'affiche des valeurs incorrects.

    voila le code Basic :

    Const Device = CB220

    Dim cm1 As Byte
    Dim cm2 As Single
    Dim inch As String*5

    Opencom 0,9600,3,50,20 ' Initialisation pour série

    Low 3 ' Configure port en sortie et stop mesure distance
    Delay 500

    'Delay 1000
    Do
    High 3 ' Lance la mesure de distance
    Low 3 ' Stop la mesure
    Delay 100
    inch = Getstr(0,4)
    cm1 = Val(Right(inch,3))
    cm2 = cm1 *2.54
    Putstr 0,Float cm2,1
    Delay 1000
    Loop

    et je vous donne aussi mon code Matlab qui permet de récupérer la valeur de cm2:
    clc
    clear all ;
    close all;

    % Create a serial port object.
    obj1 = instrfind('Type', 'serial', 'Port', 'COM4', 'Tag', '');

    % Create the serial port object if it does not exist
    % otherwise use the object that was found.
    if isempty(obj1)
    obj1 = serial('COM4','BaudRate',9600) ;
    else
    fclose(obj1);
    obj1 = obj1(1);
    end
    obj1.InputBufferSize = 9600*8;

    %Connect to instrument object, obj1.
    fopen(obj1);

    % récupération à partir du port rs232
    data=fscanf(obj1)

    fclose(obj1);

    SVP, avez vous une idée ou même une proposition qui peut m'aider.

  8. #7
    Dlzlogic

    Re : Basic : getstr et putstr

    Bonjour,
    Je suis assez mal placé pour essayer de vous aider, puisque je ne connais pas Matlab, donc ne m'en voulez pas si je dis des bêtises.
    clc
    clear all ;
    close all;

    % Create a serial port object.
    obj1 = instrfind('Type', 'serial', 'Port', 'COM4', 'Tag', '');

    % Create the serial port object if it does not exist
    % otherwise use the object that was found.
    if isempty(obj1)
    obj1 = serial('COM4','BaudRate',9600) ;
    else
    fclose(obj1);
    obj1 = obj1(1);
    end
    obj1.InputBufferSize = 9600*8;

    %Connect to instrument object, obj1.
    fopen(obj1);

    % récupération à partir du port rs232
    data=fscanf(obj1)

    fclose(obj1);
    Je suppose que obj1 est un objet, puisqu'il possède des propriétés (InputBufferSize).
    Vous le créez (instrfind) ou l'initialisez, je ne sais pas
    puis, s'il est vide, vous faites une seconde création ou initialisation, sinon, vous le fermez.
    "end" est la fin de quel bloc ? ne serait-ce pas "end if" ?
    La syntaxe obj1 = obj1(1) me parait étonnante.
    Pour tout dire, je ne comprend pas une seule ligne de ce code.
    Je crois que le mieux est partir d'un exemple qui marche et de s'assurer, à chaque étape que ça marche toujours.

    Quand vous récupérez une valeur, vous récupérez un certain nombre de bits organisés d'une certaine façon (7 bits, 8 bits, bit de parité etc) ces mots, suivant le format prévu représentent un nombre, qui lui-même représente une distance en pouces.
    La fonction Val(...) transforme habituellement une chaine de caractères en valeur numérique, mais, qui vous dit que vous récupérez une chaine de caractères ? C'est peut-être vrai.
    Le mieux est d'afficher ce que vous recevez et si vous avez une idée de ce que devrait être le résultat, ce sera peut-être plus clair.
    Vous pouvez aussi copier dans un fichier ce que vous recevez, puis le regarder avec des outils d'édition dont vous disposez, hexadécimal, ou me l'envoyer.

  9. #8
    invite59dd9621

    Re : Basic : getstr et putstr

    Merci pour la réponse,

    à propos le code Matlab jusqu'à l'instruction fopen(obj1), tous marche bien je l'ai déjà testé, il y'a aucun problème.
    pour le code basic, getstr retourne une chaine de caractère qui sera convertie en integer. j'ai dejà vérifier en affichant tous les valeurs des variables. ils sont tous correctes. Je pense que le problème vient lors du transfert des résultats via le port rs232. J'indique que j'ai déja envoyé des des valeurs et ils sont bien récupérer avec avec autre instruction de basic "var=adin()". Le problème apparait lorsque j'utilise getstr .

  10. #9
    Dlzlogic

    Re : Basic : getstr et putstr

    Je suppose que dans GetStr 4 est un nombre d'octets, donc de caractères.
    Juste après GestStr, imprimez inch et len(inch).
    Je suppose que Right supprime les blancs, à mon avis, ce n'est pas utile pour utiliser Val()

  11. #10
    invite59dd9621

    Re : Basic : getstr et putstr

    getstr retourne une chaine de 4 caractères dans notre cas. une des valeurs retournées "R059". J'utilise Right pour récupérer uniquement 059 et aprés je convertie cette chaine à une valeur numérique en utilisant Val(). ceci pour que je puisse la multiplier par 2.54 pour avoir la distance en cm.
    Les valeurs récupérés dans matlab sont bien de la forme float mais ils sont tous null => 0.0000 0.0000 ........

  12. #11
    Dlzlogic

    Re : Basic : getstr et putstr

    Code:
    inch = Getstr(0,4)
    cm1 = Val(Right(inch,3))
    cm2 = cm1 *2.54
    Putstr 0,Float cm2,1
    Etes-vous sûr de la syntaxe de Putstr 0,Float cm2,1
    Moi, je verrais beaucoup plus une syntaxe comme
    Putstr(0, cm2, 4)
    Pour essais, laissez tomber le Getstr et faites par exemple
    cm2 = 2.65 * 59
    PutStr(0, cm2, 4)
    Je fais l'hypothèse que le nombre 4 est un nombre d'octets.

  13. #12
    invite59dd9621

    Re : Basic : getstr et putstr

    je vous donne la syntaxe de putstr : putstr canal, data, ....
    si je met putstr 0,cm2, 1 : le prog ne m'affiche aucune valeur de cm2
    putstr 0,float cm2,1 : le programme renvoi des valeurs null
    si je met putstr 0, float cm2, 4 : le programme envoi la valeur de cm2 avec trois valeur quelconque (le plus part 0 ou 1).

  14. #13
    Dlzlogic

    Re : Basic : getstr et putstr

    C'est assez étonnant que getstr soit une fonction et putstr une commande.
    Dans votre syntaxe Putstr canal, data, ...
    que représentent les "..." ? d'autres données ? le nombre de valeurs ou d'octets n'est pas indiqué ?
    Ecrire comme donnée Float cm2 me parait assez étonnant, par contre, pourquoi pas Float(cm2) ?
    Par ailleurs, si cous arrivez à envoyer cm2 correctement, même s'il y a n'importe quoi après, ça peut vous permettre de mieux cerner le problème. Par exemple, on pourrait imaginer que l'envoi d'un paquet doit contenir au moins, ou exactement tant d'octets, ou des tas d'autres choses.

  15. #14
    invite59dd9621

    Re : Basic : getstr et putstr

    Vous pouvez voir les descriptions de getstr et putstr dans le document de cubloc dans le lien suivant : http://www.lextronic.fr/~lextronic_doc/CUBLOC.pdf

  16. #15
    Dlzlogic

    Re : Basic : getstr et putstr

    Bon, je l'ai chargé, y'a de la lecture !
    J'ai vu qu'il y avait un mode Debug, je pense qu'il faut l'exploiter à fond.
    Je suppose que vous avez tout lu, FAQ etc.
    J'ai vu qu'il y avait pas mal d'info concernant la mémoire, l'optimisation a certainement été poussée au maximum, il est normal que la souplesse à laquelle on est habitués s'en ressente.
    Mais là il faudra me laisser un peu de temps, il faut que je lise.
    Je vous tiens au courant dès que j'ai une idée.

  17. #16
    invite59dd9621

    Re : Basic : getstr et putstr

    Merci infiniment !!

    Oui j'ai tout lu car c'est la première fois que j'utilise le langage Basic et que je travaille avec ce type de matériel. J'ai réussi à récupérer les signaux analogiques, PWM, TX et RX du capteur ultrason en utilisant la fonction Adin().il me reste seulement la distance.

  18. #17
    invite59dd9621

    Re : Basic : getstr et putstr

    Merci infiniment.
    Oui, j'ai tout lu par ce que c'est la première fois que je programme avec Basic et que j'utilise ce type de matériel. J'ai déjà réussi à récupérer les signaux analogique, PWM, TX et RX du capteur ultrason. Il me reste donc de récupérer la distance.

  19. #18
    Dlzlogic

    Re : Basic : getstr et putstr

    Bonjour,
    Moi, je n'ai pas vraiment de nouveau, je continue à lire. C'est un gros morceau. Le document n'a probablement pas été écrit par un français, mais traduit. J'ai remarqué des petites imperfections, il faut donc faire attention.
    Et vous avez-vous avancé ?

  20. #19
    invite59dd9621

    Re : Basic : getstr et putstr

    Bonjour,
    Merci pour votre effort. J'ai pas de nouveau. J'ai vraiment testé un grand nombre de modifications, de suppositions mais malheureusement pas de solution pour le problème. Si je trouve la solution je vous met au courant.

  21. #20
    Dlzlogic

    Re : Basic : getstr et putstr

    Je n'ai pas terminé, mais il y a deux 3 choses qui me paraissent importantes
    Const Device = CB220

    Dim cm1 As Byte
    Dim cm2 As Single
    Dim inch As String*5

    Opencom 0,9600,3,50,20 ' Initialisation pour série

    Low 3 ' Configure port en sortie et stop mesure distance
    Delay 500

    'Delay 1000
    Do
    High 3 ' Lance la mesure de distance
    Low 3 ' Stop la mesure
    Delay 100
    inch = Getstr(0,4)
    cm1 = Val(Right(inch,3))
    cm2 = cm1 *2.54
    Putstr 0,Float cm2,1
    Delay 1000
    Loop
    La variable cm1 est déclarée en BYTE, c'est à dire 1 octet (8 bits) Cette variable ne peut contenir qu'un seul caractère ASCII.
    inch est une chaine de 5 caractères, l'instruction Val(...) attend une chaine, en fait, on ne sait pas très bien de qu'il y aura dans cm1, peut-être le premier caractère de la chaine, mais comme il faut tenir compte du zéro terminal, le nombre de caractères mis dans cm1 est peut-être 1-1 = 0
    Il semble que l'interruption Delay doit être précédée de Set Onglobal off et suivi de Set Onglobal on. L'instruction Delay est une interruption comme les autres, il faut donc neutraliser les autres durant son exécution.
    D'après ce que j'ai vu pour l'instant, le mot-clé Float n'est à utiliser que pour des effets de présentation, formatage etc. Mais je n'ai pas encore vu l'utilisation de Putstr.
    Dernière modification par Dlzlogic ; 11/10/2011 à 16h46.

  22. #21
    invite59dd9621

    Re : Basic : getstr et putstr

    la variable inch contient une chaine de caractère par exemple la chaine "55R" dans ce cas la fonction val() va prendre les trois derniers caractères. Elle les convertis en entier. a la fin nous aurons cm1 = un nombre entier par cet exemple cm1=5 inch.

  23. #22
    Dlzlogic

    Re : Basic : getstr et putstr

    Dans le code Matlab, est-il normal qu'il n'y ait pas de ';' à la fin de la commande scanf().
    D'ailleurs, est-il indispensable d'utiliser Matlab? Si c'est pour des commande du type ouverture de port RS232, lecture, écriture, le C me parait préférable.

    Elle les convertis en entier. a la fin nous aurons cm1 = un nombre entier par cet exemple cm1=5 inch.
    Avez-vous pu vérifier cela? Pour cm1, INTEGER (entier positif dur 16 bits) ou LONG (entier sur 32 bits) serait peut-être préférable.
    J'en suis à peu près à la moitié du manuel.

  24. #23
    invite59dd9621

    Re : Basic : getstr et putstr

    pour le code matlab, j'en ai aucun problème. pour le ';' je l'enlève pour afficher le contenu de la variable data récupérée par scanf().
    J'utilise matlab pour récupérer le résultat à partir du port RS232 car je ne sais pas comment le faire avec C.
    Oui j'ai modifié le type de cm1 en integer et long et rien n'a été changé.

Discussions similaires

  1. getstr et putstr
    Par invite59dd9621 dans le forum Matériel - Hardware
    Réponses: 2
    Dernier message: 03/10/2011, 07h19
  2. getstr et putstr
    Par invite59dd9621 dans le forum Électronique
    Réponses: 0
    Dernier message: 02/10/2011, 18h32
  3. transfert GW basic vers basic ou visuel basic
    Par jean593 dans le forum Logiciel - Software - Open Source
    Réponses: 1
    Dernier message: 21/05/2010, 11h08
  4. Basic ? Visual Basic ?
    Par invite1e5c24bd dans le forum Logiciel - Software - Open Source
    Réponses: 4
    Dernier message: 16/10/2006, 13h15
  5. C ou basic
    Par invite58238e9a dans le forum Logiciel - Software - Open Source
    Réponses: 13
    Dernier message: 25/01/2005, 11h08