Pilotage d'un appareil via un GPIB en VB.NET

Signaler
Messages postés
3
Date d'inscription
lundi 2 octobre 2006
Statut
Membre
Dernière intervention
3 octobre 2006
-
Messages postés
12
Date d'inscription
dimanche 4 avril 2010
Statut
Membre
Dernière intervention
24 mai 2012
-
Bonjour

Je suis en train d'écrire un logiciel pour piloter un appareil via une connection GPIB-IEEE.
Pour cela j'utilise la dll GPIB-32.dll.
Lors de l'envoi de commandes à l'appareil, tout se passe bien mais pour relire une valeur retournée de l'appareil, impossible, une erreur fait planter tout mon programme.

Voici l'erreur :
Une exception non gérée du type 'System.NullReferenceException' s'est produite dans XSCom.exe

Informations supplémentaires : La référence d'objet n'est pas définie à une instance d'un objet.

Voici la déclaration de ma fonction :








Declare



Function
ibrd

Lib
"Gpib-32.dll" (

ByVal
ud

As



Integer
,

ByRef
sstr

As



String
,

ByVal
cnt

As



Integer
)

As



Integer

Et voici l'appel de ma fonction :

Dim BufferReceive
As
String
State = ibrd(5, BufferReceive$, 2000)

Quelqu'un a-t-il déjà rencontré ce problème ?

Merci d'avance pour vos réponses

8 réponses

Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
Premier point hors sujet, les déclarations des fonctions sont-elles au format .net concernant les types de données ?
Je pense, vu la déclaration que tu nous met ici (normalement si mes souvenirs sont bons, c'est du long qui est utiliser par la dll, convertie ici en integer pour .NET).

Pour ton problème, bien que ma dernière utilisation de gpib32 remonte assez loin, ici le problème viens je pense de la décalration de la chaine de caractère.

Ici ta chaine est déclarée, mais elle n'est pas créée. Donc quand tu la passe en argument, en fait tu passe quelque chose d'inexistant.

Pour que ta chaine existe, il faut soit la déclarer en taille fixe (je sais, .net n'aime pas normalement), soit après la déclaration et avant l'appel, la remplir avec des caractères.

Donc soit tu la décalre en longueur fixe, mais ça t'oblige à la déclarer en variable globale :
 <VBFixedString(255)> Dim BufferReceive
AsString

Soit tu la remplie avec des espaces avant l'appel :
Dim BufferReceive As String
BufferReceive = Space(255)
State = ibrd(5, BufferReceive$, 2000)

Bonne prog sous en IEEE488

---- Sevyc64  (alias Casy) ---- # LE PARTAGE EST NOTRE FORCE #
Messages postés
3
Date d'inscription
lundi 2 octobre 2006
Statut
Membre
Dernière intervention
3 octobre 2006

Merci de ta réponse.


J'ai essayé de rajouter la ligne pour remplir la String de caractères. Mais j'ai toujours exactement la même erreur.

As-tu une autre solution ? Merci de m'aider car c'est la première fois que je développe en VB.
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
Ok, après un petit peu de recherche, j'ai récupéré un exemple pour VB.net2003 sur le site de NI

Il semblerait qu'il y ait quelques particularités dans la déclaration des fonctions de la dll.

Il faudrait que tu la déclare ainsi :
Declare
Function ibrd
Lib "Gpib-32.dll" (
ByVal ud
As
Integer, <MarshalAsAttribute(UnmanagedType.VBByRefStr)> 
ByRef sstr
As
String,
ByVal cnt
As
Integer)
As
Integer

C'est toutes les strings qui sont déclarées ainsi.

Tu peux trouver l'exemple ici , tu charge et tu dézippe le zip, tu ouvre le projet (si tu es avec net2005, il va te demander de le convertir, accepte) (si tu as un message d'erreur sur un fichier UpdateReport, c'est pas grave, il suffit de le supprimerdu projet, il sert à rien).
Les déclarations sont au début du fichier vbib32.vb, tu trouveras les constantes NI dans NIglobal.vb

---- Sevyc64  (alias Casy) ---- # LE PARTAGE EST NOTRE FORCE #
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
avec le lien sur l'exemple c'est mieux dsl --> ICI

---- Sevyc64  (alias Casy) ---- # LE PARTAGE EST NOTRE FORCE #
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
Je viens de remarquer une chose aussi, 2000 correspond  à la taille de ton buffer.

Alors soit tu fait space(2000), soit dans l'appel, tu remplace 2000 par CInt(Len(BufferReceive))

Regarde la sub ibrd dans vbib-32.vb dans l'exemple de NI

---- Sevyc64  (alias Casy) ---- # LE PARTAGE EST NOTRE FORCE #
Messages postés
3
Date d'inscription
lundi 2 octobre 2006
Statut
Membre
Dernière intervention
3 octobre 2006

Un grand merci pour toutes les réponses.

En redéclarant comme il faut la fonction, ça a l'air de marcher.

Pour la taille de 2000, j'ai bien mis Space(2000) après ta première réponse.
Messages postés
1
Date d'inscription
mardi 27 février 2007
Statut
Membre
Dernière intervention
7 mars 2008

salut j'ai un probleme,je veux connecter un pc avec une appareil de mesure dont il trouve une interface GPIB/USB
est ce que vous pouvez m'aider pour faire cette interface virtielle
Messages postés
12
Date d'inscription
dimanche 4 avril 2010
Statut
Membre
Dernière intervention
24 mai 2012

salut, sous Windows on utilise GPIB 32 pour configurer la carte GPIB, mais sous Linux on utilise???, j'ai programmer ma carte sous Windows pour faire une interface sous delphi7, ça marche très bien, mais je veux maintenant programmer cette carte avec C ou éclipse j'ai pas décider, je pense que l'environnement java plus récent, mais mon problème j'ai aucune idée sur la programmation en base niveau sous Linux, esq des explications sur la programmation avancée sous Linux, j'ai utilisé la distribution ubuntu12.04 LTS, merci d'avance