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

FT8alain Messages postés 8 Date d'inscription dimanche 17 juin 2001 Statut Membre Dernière intervention 6 avril 2014 - 22 juil. 2013 à 18:41
Adrien2p Messages postés 53 Date d'inscription jeudi 14 février 2013 Statut Membre Dernière intervention 16 juillet 2014 - 25 juil. 2013 à 16:54
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

Profil bloqué
24 juil. 2013 à 17:16
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
1
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
22 juil. 2013 à 19:13
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
0
Profil bloqué
24 juil. 2013 à 18:06
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
0
FT8alain Messages postés 8 Date d'inscription dimanche 17 juin 2001 Statut Membre Dernière intervention 6 avril 2014
24 juil. 2013 à 19:37
Salut,

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

A+
Alain
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Adrien2p Messages postés 53 Date d'inscription jeudi 14 février 2013 Statut Membre Dernière intervention 16 juillet 2014 9
25 juil. 2013 à 15:45
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
0
Profil bloqué
25 juil. 2013 à 16:40
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
0
Adrien2p Messages postés 53 Date d'inscription jeudi 14 février 2013 Statut Membre Dernière intervention 16 juillet 2014 9
25 juil. 2013 à 16:49
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
0
Adrien2p Messages postés 53 Date d'inscription jeudi 14 février 2013 Statut Membre Dernière intervention 16 juillet 2014 9
25 juil. 2013 à 16:54
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
0
Rejoignez-nous