04-26-2011 05:49 AM
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.
Solved! Go to Solution.
04-26-2011 06:29 AM
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.
04-26-2011 07:14 AM
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.
04-26-2011 07:47 AM
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.
04-27-2011 12:46 AM - edited 04-27-2011 12:54 AM
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> ?
04-27-2011 01:25 AM
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 :
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.
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 !
07-08-2014 03:23 AM
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
.
07-08-2014 10:36 AM - edited 07-08-2014 10:49 AM
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.
07-08-2014 11:29 AM
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);
}
}
07-09-2014 01:05 AM
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).