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

cerisiera Messages postés 3 Date d'inscription lundi 2 octobre 2006 Statut Membre Dernière intervention 3 octobre 2006 - 2 oct. 2006 à 15:16
cs_djalilosse Messages postés 12 Date d'inscription dimanche 4 avril 2010 Statut Membre Dernière intervention 24 mai 2012 - 16 juin 2012 à 14:33
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

cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
2 oct. 2006 à 15:43
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 #
0
cerisiera Messages postés 3 Date d'inscription lundi 2 octobre 2006 Statut Membre Dernière intervention 3 octobre 2006
3 oct. 2006 à 09:45
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.
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
3 oct. 2006 à 10:08
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 #
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
3 oct. 2006 à 10:09
avec le lien sur l'exemple c'est mieux dsl --> ICI

---- Sevyc64  (alias Casy) ---- # LE PARTAGE EST NOTRE FORCE #
0

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

Posez votre question
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
3 oct. 2006 à 10:15
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 #
0
cerisiera Messages postés 3 Date d'inscription lundi 2 octobre 2006 Statut Membre Dernière intervention 3 octobre 2006
3 oct. 2006 à 10:36
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.
0
aymandac Messages postés 1 Date d'inscription mardi 27 février 2007 Statut Membre Dernière intervention 7 mars 2008
7 mars 2008 à 11:42
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
0
cs_djalilosse Messages postés 12 Date d'inscription dimanche 4 avril 2010 Statut Membre Dernière intervention 24 mai 2012
16 juin 2012 à 14:33
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
0
Rejoignez-nous