Problème sur type de variables (valeur en byte)

Signaler
Messages postés
8
Date d'inscription
dimanche 17 juin 2001
Statut
Membre
Dernière intervention
6 avril 2014
-
Messages postés
53
Date d'inscription
jeudi 14 février 2013
Statut
Membre
Dernière intervention
16 juillet 2014
-
Bonjour,

Je suis en train de développer un programme de gestion de paramètres d'un appareil dont je ne maitrise pas la programmation (boite noire). Celui ci m'envoie des valeurs via une liaison série RS232. Ces valeurs sont formatées en structures. le programme tournant dans l'appareil a été développé en C et tourne sur un microcontroleur en 16 bits.
Voici les structures en C :

struct const_1{
 int      minimal;	             
 int      stop;	               
 int      demarrage1;	         
 int      demarrage2;   	     
 int      precharge;             
 int      decharge;             
 int      maximal;                
 long     maxilong;              
 };
typedef struct const_c1 CONST_1;

struct const_2{
 int      demarrage;	          
 int      ralentie;  	          
 int      maximale;  	          
 int      seuil_survitesse;      
 int      seuil_demarrage1;   	
 int      seuil_demarrage2;   	 
 int      ecart_defaut_capteur;   
 int      ecart_de_comparaison;   
 int      ecart_hysteresis;      
 long     maxilong;              
 unsigned char option_rampe;     
 unsigned char inhibition_defaut;
 };
typedef struct const_c2 CONST_2;

La structure const_1 fait 18 octets et la structure const_2 fait 24 octets. Jusque là, tout va bien.

Maintenant je veux convertir en VB.NET (VB2010). N'oublions pas qu'on travaille en 16 bits. Je fais donc :
Public Structure const_1
        Public minimal As Short              
        Public sto_p As Short                
        Public demarrage1 As Short            
        Public demarrage2 As Short         
        Public precharge As Short             
        Public decharge As Short              
        Public maximal As Short              
        Public maxilong As Integer                      
    End Structure

    Public Structure const_2
        Public demarrage As Short             
        Public ralentie As Short               
        Public maximale As Short               
        Public seuil_survitesse As Short     
        Public seuil_demarrage1 As Short      
        Public seuil_demarrage2 As Short      
        Public ecart_defaut_capteur As Short  
        Public ecart_de_comparaison As Short  
        Public ecart_hysteresis As Short       
        Public maxilong As Integer    
        Public option_rampe As Byte    
        Public inhibition_defaut As Byte 
    End Structure

Là, quand je fais un marshal.sizeof de mes structures j'obtiens 20 au lieu de 18 et 28 au lieu de 24

J'ai essayé de changer de type pour maxilong : Uinteger, Int16, etc.. rien n'y fait. Pourtant le type integer est codé sur 4 octets.

La solution que j'ai trouvé mais qui maintenant me pose un autre problème, c'est de mettre 2 variables Maxilong1 et Maxilong2, chacune en Short. Ainsi je récupère bien tous les octets de ma trame reçue via RS232 et ça ne perturbe pas les valeurs des variables se trouvant derrière le Maxilong. Mais le problème, je n'arrive pas à convertir les valeurs de Maxilong1(Short) et Maxilong2(Short) en un seul Maxilong(Long). Voici les valeurs que je récupère :
Pour Const_1 Maxilong1 11168 / Maxilong2 162 valeur de Maxilong espérée et calculée dans l'appareil = 10000000
Pour Const_2 Maxilong1 42745 / Maxilong2 181 valeur de Maxilong espérée et calculée dans l'appareil = 10800000

Merci d'avance pour votre aide.

A+
Alain

8 réponses

Messages postés
1263
Date d'inscription
mardi 11 novembre 2003
Statut
Membre
Dernière intervention
24 juillet 2013
6
Salut FT8alain

Une form , 2 Textbox nommées TextBox1 et TextBox2 et ce code

Imports System.Runtime.InteropServices

Public Class Form1

    <StructLayout(LayoutKind.Sequential, Pack:=1)>
    Public Structure const_1
        Public minimal As Short
        Public sto_p As Short
        Public demarrage1 As Short
        Public demarrage2 As Short
        Public precharge As Short
        Public decharge As Short
        Public maximal As Short
        Public maxilong As Integer
    End Structure

    <StructLayout(LayoutKind.Sequential, Pack:=1)>
     Public Structure const_2
        Public demarrage As Short
        Public ralentie As Short
        Public maximale As Short
        Public seuil_survitesse As Short
        Public seuil_demarrage1 As Short
        Public seuil_demarrage2 As Short
        Public ecart_defaut_capteur As Short
        Public ecart_de_comparaison As Short
        Public ecart_hysteresis As Short
        Public maxilong As Integer
        Public option_rampe As Byte
        Public inhibition_defaut As Byte
    End Structure

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        Dim stconst_1 As const_1
        Dim stconst_2 As const_2

        TextBox1.Text = Marshal.SizeOf(stconst_1).ToString
        TextBox2.Text = Marshal.SizeOf(stconst_2).ToString

    End Sub
End Class


<StructLayout(LayoutKind.Sequential, Pack:=1)> ici le paramètre Pack :=1 aligne la structure au niveau de l'octet ce qui te donnent les valeurs correctes pour les Marshal.Sizeof sur ces structures

La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.

GRENIER Alain
Messages postés
14672
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
15 mai 2020
143
Bonjour,

Exemple en C# :
http://msdn.microsoft.com/fr-fr/library/ms172512%28v=VS.90%29.aspx

v----Signature--------v----------------------------------------------

* Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices.
* Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : ).
* En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualBasic (onglet Références dans les propriétés du projet).
* Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés


---
Mon site
Messages postés
1263
Date d'inscription
mardi 11 novembre 2003
Statut
Membre
Dernière intervention
24 juillet 2013
6
re FT8alain

Explication :

Public structure A
public b1 as byte
public b2 as byte
End Structure

Le champb b1 sera toujours à l'offset 0 . Le champ b2 peut être à différents offsets qui dépendent du paramètre Pack .Si Pack est égal à 1 ,l'offset de b2 sera 1 , juste après celui de b1 . Mais si Pack = 4 , b2 sera à l'offset 4 car b1 occupera 4 octets ( de 0 à 3)


La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.

GRENIER Alain
Messages postés
8
Date d'inscription
dimanche 17 juin 2001
Statut
Membre
Dernière intervention
6 avril 2014

Salut,

Merci de vos réponses. J'essaye ça avant les vacances puis je reviens vous dire si ça fonctionne.

A+
Alain
Messages postés
53
Date d'inscription
jeudi 14 février 2013
Statut
Membre
Dernière intervention
16 juillet 2014
9
sa ne fonctionnerais pas si tu faisais :
dim TaVariable(18) as byte


tiens nous au courant

Adrien de Peretti

VB.NET / VBA / JAVA / HTML / PHP / CSS / JavaScript
SQLserveur / MySsql / Oracle
Messages postés
1263
Date d'inscription
mardi 11 novembre 2003
Statut
Membre
Dernière intervention
24 juillet 2013
6
Salut Adrien2p

bien sûr que cela fonctionnerait mais notre ami perdrait les structures


La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.

GRENIER Alain
Messages postés
53
Date d'inscription
jeudi 14 février 2013
Statut
Membre
Dernière intervention
16 juillet 2014
9
Donc pour mon savoir personnel le fais de rajouter au dessus des structures :
<StructLayout(LayoutKind.Sequential, Pack:=1)>

qui permet de prendre à l'octet prêt alors cela arrange le problème ?

bon en :
> VBA / VB.NET / C# / HTML / CSS / PHP / JavaScript
> SQL sur MySQL / Oracle / SQLserveur 2005-8

Entre en Troisième année CSIA :
Apprentissage du :
> C avancé, PERL , UNIX , JAVA
Messages postés
53
Date d'inscription
jeudi 14 février 2013
Statut
Membre
Dernière intervention
16 juillet 2014
9
Mais oui suis-je bête puisque avec ceci alors il donne la taille avec la somme de tous les champs de la structure, et ici 8(16) et 12(24) ais-je bien compris ?




bon en :
> VBA / VB.NET / C# / HTML / CSS / PHP / JavaScript
> SQL sur MySQL / Oracle / SQLserveur 2005-8

Entre en Troisième année CSIA :
Apprentissage du :
> C avancé, PERL , UNIX , JAVA