Coredll pour envoyer du binaire au GPS

xyp Messages postés 15 Date d'inscription mardi 16 mars 2004 Statut Membre Dernière intervention 16 avril 2008 - 20 déc. 2007 à 12:54
xyp Messages postés 15 Date d'inscription mardi 16 mars 2004 Statut Membre Dernière intervention 16 avril 2008 - 21 déc. 2007 à 09:10
Bonjour,

J'ai besoin d'inclure une routine permettant de switcher un GPS du mode Sirf3 au mode NMEA 2.0

Le blem c'est que le MSComm semble bugué et  n'envoie rien en binaire. MS est au courant et propose un correctif. Or lorsque je l'inclu dans mon code, ça me marque alors que le fichier coredll.dll est absent. C'est faux : il est bien présent dans le répertoire system32 de Windows, mais quand j'essai de l'inclure comme référence au programme, ça ne veut pas.

Je vous file le code. Qu'en pensez vous ?

Merci beaucoup pour votre aide.

XYP

Objets nécessaires :
1 Module nommé Moduleee1
1 Form nommée Form1
1 MSComm nommé  Comm1, sur la Form1
1 boutton nommé  Command1, sur la Form1

Code dans Module 1:

Option Explicit
Declare Function WriteFileL Lib "coredll" Alias "WriteFile" _
(ByVal hFile As Long, lpBuffer As Byte, ByVal nNumberOfBytesToWrite As Long, _
lpNumberOfBytesWritten As Long, ByVal lpOverlapped As Long) As Long


Public Sub SendArrayData(ByVal hCommID As Long, baData)
Dim i, lRet, iWrite
For i = LBound(baData) To UBound(baData)
    lRet = WriteFileL(hCommID, baData(i), 1, iWrite, 0)
Next
End Sub


Code dans Form 1 (La série de code hexa est la commande de switch du mode swirf3 au mode NMEA2.0) :

Private Sub Command1_Click()

' Set up the "Switch to NMEA" command
Dim Command(32) As Byte
Command(1) = &HA0
Command(2) = &HA2
Command(3) = &H0
Command(4) = &H18
Command(5) = &H81
Command(6) = &H2
Command(7) = &H1
Command(8) = &H1
Command(9) = &H0
Command(10) = &H1
Command(11) = &H5
Command(12) = &H1
Command(13) = &H5
Command(14) = &H1
Command(15) = &H0
Command(16) = &H1
Command(17) = &H0
Command(18) = &H1
Command(19) = &H0
Command(20) = &H1
Command(21) = &H0
Command(22) = &H1
Command(23) = &H0
Command(24) = &H1
Command(25) = &H0
Command(26) = &H1
Command(27) = &H12
Command(28) = &HC0
Command(29) = &H1
Command(30) = &H6A
Command(31) = &HB0
Command(32) = &HB3

' Configure the comm port
Comm1.InputLen = 0
Comm1.InputMode = comInputModeText
Comm1.RThreshold = 1
Comm1.SThreshold = 1
Comm1.CommPort = 8

'Assume the GPS is connected to COM1:
Comm1.Settings = "38400,N,8,1" 'Assume the GPS is in SiRF mode

'Send the command
Comm1.PortOpen = True
   SendArrayData Comm1.CommID, Command
Comm1.PortOpen = False
End Sub

11 réponses

NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
20 déc. 2007 à 13:51
Bonjour

CodeDll.dll c'est pour les PPC ?
Il me semble, je peux me tromper, que WriteFile est présente dans Kernel32.dll, elle sera peut-être plus à même de répondre à ton besoin.

Ta fonction
Public Sub SendArrayData(ByVal hCommID As Long, baData)
Dim i, lRet, iWrite
For i = LBound(baData) To UBound(baData)
    lRet = WriteFileL(hCommID, baData(i), 1, iWrite, 0)
Next
End Sub

sera fonctionnelle (enfin je pense) comme cela :
Public Sub SendArrayData(ByVal hCommID As Long, baData)
    Dim lRes as integer,iWrite as integer
    lRet = WriteFileL(hCommID, baData(1), UBound(baData), iWrite, 0)
End Sub

Balèse la personne qui a pensé au pansement à penser (ou à panser, pensée).
VB (6, .NET1&2), C++, C#.Net1
Mon site
0
xyp Messages postés 15 Date d'inscription mardi 16 mars 2004 Statut Membre Dernière intervention 16 avril 2008
20 déc. 2007 à 14:03
Salut,

Suivant ton conseil, j'ai remplacé coredll dans  le module par kernel32... comme ceci :

Declare Function WriteFileL Lib "kernel32" Alias "WriteFile" _
(ByVal hFile As Long, lpBuffer As Byte, ByVal nNumberOfBytesToWrite As Long, _
lpNumberOfBytesWritten As Long, ByVal lpOverlapped As Long) As Long

le blem c'est que ça me provoque une erreur qui ferme VB6 : AppName: vb6.exe AppVer: 6.0.81.76 ModName: unknown ModVer: 0.0.0.0 Offset: ff30ff00

J'ai remplacé aussi la fonction par celle que tu me files, mais ça provoque une erreur de compilation "Type d'argument ByRef incompatible" sur iwrite.

Qu'en pensez vous ?
Merci beaucoup pour votre aide.
0
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
20 déc. 2007 à 14:22
Bonjour

Voici la déclaration de la fonction :
Public Declare Function WriteFile Lib "kernel32" Alias "WriteFile" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToWrite As Long, lpNumberOfBytesWritten As Long, lpOverlapped As OVERLAPPED) As Long
Pas de Byval pour lpOverlapped.

Normal, met IWrite en Long au lieu de Integer.

Balèse la personne qui a pensé au pansement à penser (ou à panser, pensée).
VB (6, .NET1&2), C++, C#.Net1
Mon site
0
xyp Messages postés 15 Date d'inscription mardi 16 mars 2004 Statut Membre Dernière intervention 16 avril 2008
20 déc. 2007 à 15:59
Euh le type Overlapped, il ne connait pas dans "(...) lpOverlapped As OVERLAPPED (...)"
As-tu une idée ?

Merci beaucoup pour ton aide.
0

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

Posez votre question
xyp Messages postés 15 Date d'inscription mardi 16 mars 2004 Statut Membre Dernière intervention 16 avril 2008
20 déc. 2007 à 16:15
Remarque c'est ptet moi qui ait mal compris.
En fait au lancement ça me marque "type défini par l'utilisateur non défini" sur cette même ligne.

Merci, et désolé de t'embeter pour cela.
0
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
20 déc. 2007 à 16:15
Bonjour

Public Type OVERLAPPED
        Internal As Long
        InternalHigh As Long
        offset As Long
        OffsetHigh As Long
        hEvent As Long
End Type

Je pense qu'en mettant 0 dans toutes les valeurs, ça devrait être bon, mais je n'utilise plus cette fonction depuis un moment.

Balèse la personne qui a pensé au pansement à penser (ou à panser, pensée).
VB (6, .NET1&2), C++, C#.Net1
Mon site
0
xyp Messages postés 15 Date d'inscription mardi 16 mars 2004 Statut Membre Dernière intervention 16 avril 2008
20 déc. 2007 à 16:22
Dans ce cas, est-ce qu'il faut modifier la ligne :
WriteFile(hCommID, baData(i), 1, iWrite, 0) ?

Parce que le 0 à la fin ne lui convient plus.

Merci beaucoup pour ta patience.
0
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
20 déc. 2007 à 16:41
Bonjour

Non je pensais plutot à :
dim lVar as Overlapped
lVar.Internal=0
lVar.---=0

Puis WriteFile(..., lVar)

Balèse la personne qui a pensé au pansement à penser (ou à panser, pensée).
VB (6, .NET1&2), C++, C#.Net1
Mon site
0
xyp Messages postés 15 Date d'inscription mardi 16 mars 2004 Statut Membre Dernière intervention 16 avril 2008
20 déc. 2007 à 16:57
Ok le compilateur n'indique plus d'erreur, donc apparement ça envoit des donénes en binaire au GPS, ce que je cherchais à faire.
Mais bon ça switch pas pour autan entre le mode sirf3 et le mode nmea2.0, ce qui démontre que y'a un bug ailleurs, et je m'y penche ;)


Dès que j'ai trouvé, je ferai une ptite source pour indiquer comment switcher entre les deux moe à loisir.


Encore merci NHenry et fait de ma part une caresse au gros chat qui pose avec toi sur la photo ;)


a++
0
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
21 déc. 2007 à 08:31
Bonjour

1 elle est pas grosse et de 2 c'est une vielle mémère.

Si ton GPS est sur port série direct (non virtuel), tu peux tenter de relier le Tx et le Rx pour voir ce qu'il t'envoie. Et si tu as 2 ports COM, c'est mieux, un cable NullModem et tu verra ce qui est envoyé.

Balèse la personne qui a pensé au pansement à penser (ou à panser, pensée).
VB (6, .NET1&2), C++, C#.Net1
Mon site
0
xyp Messages postés 15 Date d'inscription mardi 16 mars 2004 Statut Membre Dernière intervention 16 avril 2008
21 déc. 2007 à 09:10
Je passe par le port USB qui est simulé comme un port série... ;(

Super jolie mémère  ;)

a++
0
Rejoignez-nous