FT8alain
Messages postés8Date d'inscriptiondimanche 17 juin 2001StatutMembreDernière intervention 6 avril 2014
-
22 juil. 2013 à 18:41
Adrien2p
Messages postés53Date d'inscriptionjeudi 14 février 2013StatutMembreDernière intervention16 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
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.
* 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
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.
Adrien2p
Messages postés53Date d'inscriptionjeudi 14 février 2013StatutMembreDernière intervention16 juillet 20149 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