Instrument Control (GPIB, Serial, VISA, IVI)

cancel
Showing results for 
Search instead for 
Did you mean: 

communication avec un peripherique

Solved!
Go to solution

Bonjour,

 

j'ai un probleme de communication avec mon periphérique. Pour communiquer, j'ai utiliser une structure (initialisation visa, ecrire, lire) visa mais lorsque j'envoie une commande spécifique à mon capteur (notamment la commande qui active la liaison entre le periphérique et le pc), la sortie d'erreur m'affiche délai d'attente a expiré. Ma structure marche trés bien avec l'hyperterminal. Les parametres de mon periphérique et de mon programme sont identiques.

 

Merci d'avance. 

0 Kudos
Message 1 of 24
(4,915 Views)

Votre code m'étant inconnu, j'en suis réduit à supposer que le problème vient du fait que, contrairement à LabVIEW, Hyperterminal ajoute les caractères de terminaison \r\n à la trame envoyée. Vous devez donc les ajouter explicitement dans votre code LabVIEW.

 

Veuillez consulter cette KB pour plus de détails.

0 Kudos
Message 2 of 24
(4,912 Views)

mon code est "ctrl b;" (l'instrument est le scout55) et j'ai déjà essayé en rajoutant \r\n via la fonction concatener deux chaines mais toujours le meme probleme.

0 Kudos
Message 3 of 24
(4,909 Views)

En fait le probleme est ,qu'avec l'hyperterminal, je peux faire "ctrl b" mais avec labview je ne sais pas comment traduire la fonction "ctrl b" en chaine de caractère.

0 Kudos
Message 4 of 24
(4,903 Views)

Je trouve certes le mode d'emploi de cet appareil HBM sur internet. Par contre le manuel SCOUT 55, Part2: Operation by computer or terminal mentionné au chapitre 2.8 du mode d'emploi et décrivant le protocole de communication reste introuvable. Je ne dispose pas d'un compte chez ce fournisseur (ce qui me permettrait probablement d'accéder à ce document) et ne désire pas en créer un juste pour cette occasion.

 

Pourriez-vous donc me fournir ce protocole de communication ou du moins déterminer la fonction du ctrl b --> code hexadécimal de cette fonction ?

Le protocole mentionne-t-il des caractères de début et de fin de trame --> <STX> et <ETX> ?

0 Kudos
Message 5 of 24
(4,897 Views)
Solution
Accepted by topic author yassineb

Selon mes rapides investigations, avec Hyperterminal ctrl b correspond au code ASCII 02, autrement dit au caractère de début de trame généralement désigné par <STX>. Une manière de l'implémenter dans LabVIEW :

 

  1. Placer une String Constant sur le diagramme
  2. Clic droit sur la constante >> sélectionner '\' Codes Display
  3. Taper \02 dans la constante.


Alternativement, vous pouvez également sélectionner Hex Display au point 2. et puis entrer 02 au point 3.

 

Une nouveauté fort utile de LV2010 est la possibilité de montrer le type d'affichage sélectionné. Pour rendre cette information visible : clic droit sur la constante >> Visible Items >> Display Style. Comme dans la capture de code LV2010 ci-dessous, le type d'affichage sélectionné est alors visible sur la gauche de la constante. En alternative à la méthode utilisant le menu contextuel (décrite ci-dessus au point 2.), un simple clic sur cette zone permet alors de modifier le type d'affichage.

 

STX.png

 

Pour votre culture générale, je vous invite à modifier le type d'affichage de la constante pour voir comment son contenu est présenté pour chacun des types. Veuillez noter que le contenu ne change pas mais simplement la manière de le présenter à l'écran !

 
0 Kudos
Message 6 of 24
(4,893 Views)

Bonjour JB j'ai le meme probléme quand j'envoie la trame au microcontroleur par l'hyperterminal sa marche bien mais quand j'envoie la meme trame avec labview sa marche pas malgré que j'ai ajouté expré les /r/n à la trame envoyé par labview et encore ca marche pas

.

0 Kudos
Message 7 of 24
(4,694 Views)

Comment avez-vous défini les deux caractères de terminaison ? Vous écrivez "/r/n" ce qui est faux.

 

Il est bien évident que les deux programmes ne peuvent pas accéder au port en même temps. Il faut donc quitter Hyperterminal pour réaliser les essais avec LabVIEW.

Y a-t-il un message d'erreur ? Ou que se passe-t-il ?

 

Pour nous éviter de deviner le problème, je vous suggère de poster votre bout de code.

 

 

0 Kudos
Message 8 of 24
(4,682 Views)

En fait l'hyperterminal est déconnecté quand j'ai envoyé la trame. Pardon mais j'ai pas compris la fausse au niveau /r/n est ce que je dois l'ajouté ou pas.

voici une partie de mon code sur STM32F4

 

 


/* Includes */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "stm32f4_discovery.h"
#include "usbd_cdc_vcp.h"
#include "stm32f4xx.h"

#define OUTPUT_LOG

/* Private macro */
/* Private variables */
uint32_t button_sts;
__ALIGN_BEGIN USB_OTG_CORE_HANDLE USB_OTG_dev __ALIGN_END;
uint32_t i = 0;
/* Private function prototypes */
/* Private functions */

/**
 **===========================================================================
 **  Main
 **===========================================================================
 */
 long systick_counter =0;
 int Start_Counting =0;
 uint16_t relay  = 0, indication = 0;

 void WaitAndSetLevel (uint16_t GpioPin, uint16_t LedPin, long WaitTime);
 void SelectOutput (int Digital_Output_Index, int Output_Start_Level);
 void DigitalOutpoutInit();


#define BUFFER_SIZE 2000


int main(void)
{

    SystemInit();

    /* Set SysTick Preemption Priority to 1 */
    NVIC_SetPriority(SysTick_IRQn, 0x04);

    /* Inicio dos I/Os pelas funções da biblioteca da ST*/
    STM32F4_Discovery_LEDInit(LED3); //Orange
    STM32F4_Discovery_LEDInit(LED4); //Green
    STM32F4_Discovery_LEDInit(LED5); //Red
    STM32F4_Discovery_LEDInit(LED6); //Blue

    DigitalOutpoutInit();

    USBD_Init(&USB_OTG_dev, USB_OTG_FS_CORE_ID, &USR_desc, &USBD_CDC_cb,
            &USR_cb);

    if (SysTick_Config(SystemCoreClock/1000))
    {
         while (1){} ;// error
    }


    int Reception_Counter = 0;
    char c, buffer_In[BUFFER_SIZE];
    int EndTransmission = 0;

    while (1)
    {
        memset(buffer_In, 0, BUFFER_SIZE);
        EndTransmission = 0;
        Reception_Counter = 0;
#ifdef OUTPUT_LOG
        usb_cdc_printf("New Frame Reception Start.\r\n");
#endif

        /* boucle de réception */
        while (!EndTransmission)
        {
            if (usb_cdc_kbhit())
            {
                c = usb_cdc_getc();
                buffer_In[Reception_Counter] = c;
                Reception_Counter++;

                if (c == 13 || Reception_Counter > BUFFER_SIZE)
                    EndTransmission = 1;
            }
        }

#ifdef OUTPUT_LOG
        usb_cdc_printf("New Frame Reception End.\r\n");
#endif

        int Cycle_Found = 0;
        int Principal_Loop_Number_Found = 0;
        int Sub_Loop_Number_Found = 0;
        int Digital_Output_Index_Found = 0;
        int Level_Number_Found = 0;
        int Output_Start_Level_Found = 0;
        int Level_Time_Tab_Found = 0;
        int Level_Per_Sub_Loop_Tab_Found = 0;
        int Sub_Loop_Per_Loop_Tab_Found = 0;
        int Principal_Loop_Counter_Tab_Found = 0;
        int Sub_Loop_Counter_Tab_Found = 0;

        int Cycle = 0;                            // cyc=
        int Digital_Output_Index = 0;            // doi=
        int Output_Start_Level = 0;                // osl=
        int Principal_Loop_Number = 0;            // pln=
        int Sub_Loop_Number = 0;                // sln=
        int Level_Number = 0;                    // nbl=
        int Principal_Loop_Counter_Tab[6]={0};    // plc=
        int Sub_Loop_Counter_Tab[10]={0};        // slc=
        long Level_Time_Tab[20]={0};            // lti=
        int Level_Per_Sub_Loop_Tab[10]={0};        // lsl=
        int Sub_Loop_Per_Loop_Tab[6]={0};        // sll=

        int Parsing_Index = 0;

#ifdef OUTPUT_LOG
        usb_cdc_printf("New Frame Parsing Start.\r\n");
#endif

        while (Parsing_Index < Reception_Counter)
        {
            int Command_size = 0;
            while (Parsing_Index + Command_size < Reception_Counter)
            {
                if (buffer_In[Parsing_Index + Command_size] == '*')
                    break;
                Command_size++;
            }

            if (Command_size > 1)
            {
                char Command_Tag[5] = { 0, 0, 0, 0, 0 };

                memcpy(Command_Tag, buffer_In + Parsing_Index, 4);

                if (strcmp(Command_Tag, "doi=") == 0)
                {
                    if (Command_size - 4 > 1)
                    {
                        usb_cdc_printf("Digital Output Index format received.\r\n");
                    }
                    else
                    {
                        Digital_Output_Index_Found = 1;
                        usb_cdc_printf("Digital Output Index found.\r\n");
                        char Digital_Output_Index_str[2] = { 0, 0};
                        memcpy(Digital_Output_Index_str, buffer_In + Parsing_Index + 4,Command_size - 4);
                        Digital_Output_Index = atoi(Digital_Output_Index_str);
                    }
                }

0 Kudos
Message 9 of 24
(4,676 Views)

J'ignore s'il s'agit d'une faute de frappe mais les caractères de terminaison ne sont pas /r/n mais \r\n (--> 0D et 0A en hex).

0 Kudos
Message 10 of 24
(4,667 Views)