none
Port parallèle et VB .NET RRS feed

  • Discussion générale

  • Bonjour !

    J'arrive bientôt à la fin de mon logiciel de contrôle de webcam à distance... (projet pour les Sciences de l'Ingénieur au BAC).

    Seulement, après avoir cherché des heures je n'ai pas réussi à envoyer un signal au port parallèle. J'ai l'impression que c'était très facile à l'époque VB ≤ 6 et Win ≤ 98 mais je ne parviens pas à trouver de source récente qui fonctionne chez moi.

    Ce que cherche à faire n'est pas sorcier, simplement envoyer un signal en continu. Mais toute les sources que je test sont trop vieilles et ne semble pas fonctionner.

    Auriez-vous une piste ?

    Je suis sous Win7 64bits, VB 2010.

    Je vous remercie pour votre aide !

    Félix.

    • Type modifié Ciprian Duduiala lundi 2 mai 2011 06:58 pas de réponse de l'utilisateur qui a lancé la question
    samedi 23 avril 2011 09:52

Toutes les réponses

  • Bonjour,

    Voir peut-être http://support.microsoft.com/kb/823179 2ème partie pour déclarer les fonctions nécessaires (pour ce que j'en sais, le port parallèle lui-même est plutôt veillot et sans doute absent de la plupart sinon de la totalité des machines récentes d'où sans doute le manque de support).

    Sinon je pense qu'il sera plus facile de partir d'une des sources que vous utilisez et de voir quel est le premier problème que vous avez (par exemple long devient int en VB.NET ce qui pourrait en partie expliquer le problème que vous avez avec des sources VB6), plutôt que quelqu'un fournisse encore un exemple de code qui n'a aucune raison de ne pas ressembler à ceux que vous avez déjà trouvés.

    Qq détails pourraient aider (ce n'est pas pour piloter la webcam? vous n'auriez pas dans ce cas, ce problème en fin de projet ?) . Normalement il y a souvent moyen de communiquer à un niveau un peu plus haut que de discuter directement avec les ports.

     


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    samedi 23 avril 2011 12:05
    Modérateur
  •  

     

     

    Bonjour,

    En fait si c'est bien pour contrôler la webcam, sauf que la plus grande partie de mon projet consistait à envoyer les images en lignes, la contrôler depuis internet, définir les modes (chemin prédéfini ou aléatoire, manuel...).

    La il ne me reste plus qu'à rajouter les instruction dans mes fonction avancer() et reculer() [Je dois envoyer 01000001 dans un cas et 00000011 dans l'autre].

    J'étais tombé sur la page que tu m'as donné mais ça m'avait paru bien compliqué face aux sources en VB6 qui utilise des dll et qui font ça en 3 lignes. Mais du coup je vais creuser de ce côté et essayer de tester ce qui est donné sur cette page.

    Sinon, question bête mais sur le lien il parle de l'API WIN32, ça marchera bien si je suis en 64 bits ? merci.

    Je teste avec le lien aujourd'hui, je vous dirai ce que ça donne.

    Merci beaucoup.

     

    EDIT : Bon alors désolé... Mais je n'y arrive pas. J'ai testé le programme tel qu'il est donné en remplacent LP1 par 0x378 ou 378 et COM1 par 0x3F8 ou 3F8 mais rien ne fait ça ne fonctionne pas...

    Pour chaque port il m'indique "Unbale to obtain a handle from..." puis "Unable to obtain a release handle from..."

    Je te remercie pour ton aide ! Je suis un peu désespéré!


    EDIT2 : Bon apparemment il ne fallait pas remplacer LP1 par l'adresse des ports.

    Du coup je reçois désormais comme message d'erreur "Unable to retrieve the current control settings"

    Merci!

    dimanche 24 avril 2011 09:11
  • Quelle est la valeur retournée par Err.LastDllError ? Cela pourrait donner une indication sur la nature de l'erreur.

    Ce que je ne comprends est que l'on a pu contrôler la webcam jusqu'à présent (donc sans utiliser LPT1 ?). Et maintenant on doit utiliser LPT1 juste pour ces deux fonctions ?

    Sinon donner peut-être un lien sur le code VB6 que je vois si on peut l'adapter en VB.NET. Je vais avoir qq problème de toutre façon pour aider efficacement car je n'ai pas de port LPT pour pouvoir tester de mon côté.

     


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    dimanche 24 avril 2011 18:53
    Modérateur
  • Bonjour et encore merci pour ton aide précieuse !

    Alors Err.LastDllError me renvoie 0 si je laisse "LP1" ou "LP3" (le cas où je reçois "Unable to retrieve the current settings"). (LP2 n'existe pas et me renvoie 6).

    Sinon je me suis mal exprimé par rapport à l'avancement. En fait en  terme de ligne de code/charge de travail, je voulais dire qu'envoyer un petit signal ne devrait pas être énorme par rapport à tout ce que j'ai déjà codé et fait en électronique. Mais il est vrai que sans ce "petit bout de code" mon projet n'a plus aucun sens. Mais non je n'ai toujours pas pu contrôler la webcam ;)


    Bon après encore des dizaines de code testés j'en ai trouvé un qui me semble pas mal adapté. Il fonctionne avec la dll Inpout32 et son adaptation InpOutx64.

    Il faut télécharger ici "Binaries only" puis dézipper, puis lancer InstallDriver.exe dans le dossier Win32.

    Ensuite j'ai pris le programme qui est donné sur cette même page (cf un peu plus bas, converti en VB2010).

    Bref... avec ce prog quand j'écris quelque chose il est bien écrit puisque si je fais "lire" 2minutes plus tard après avoir fermé le prog la valeur renvoyée est bien celle que j'ai écrite plus tôt.

    Sauf que dans la réalité il n'écrit rien du tout !

    Encore plus bizarre : J'ai monté aujourd'hui une petite plaquette avec des LED pour voir l'état de chaque fil... Et là surprise, dès le démarrage de Windows, avant même l'ouverture de la session il y a déjà un signal sur les 8 fils de DATA :  000000100

    J'ai aussi une tension de -4.90V plusieurs autres fils (Tous les fils non DATA/GROUND sauf le fil n°17).

    Bref je n'y comprends plus rien ;) !

    Merci beaucoup !

     

    Voilà le prog :

     

    (Le "beeper" marche très bien)

     

    Imports System.Runtime.InteropServices
    Imports System.Threading
    
    Public Class Form1
    
      <DllImport("InpOut32.dll", CharSet:=CharSet.Auto, EntryPoint:="Inp32")> _
      Shared Function Inp32(ByVal PortAddress As Short) As Short
      End Function
    
      <DllImport("InpOut32.dll", CharSet:=CharSet.Auto, EntryPoint:="Out32")> _
      Shared Sub Out32(ByVal PortAddress As Short, ByVal Data As Short)
      End Sub
    
      <DllImport("InpOut32.dll", CharSet:=CharSet.Auto, EntryPoint:="IsInpOutDriverOpen")> _
      Shared Function IsInpOutDriverOpen() As UInt32
      End Function
    
      <DllImport("InpOutx64.dll", CharSet:=CharSet.Auto, EntryPoint:="Inp32")> _
      Shared Function Inp32_x64(ByVal PortAddress As Short) As Short
      End Function
    
      <DllImport("InpOutx64.dll", CharSet:=CharSet.Auto, EntryPoint:="Out32")> _
      Shared Sub Out32_x64(ByVal PortAddress As Short, ByVal Data As Short)
      End Sub
    
      <DllImport("InpOutx64.dll", CharSet:=CharSet.Auto, EntryPoint:="IsInpOutDriverOpen")> _
      Shared Function IsInpOutDriverOpen_x64() As UInt32
      End Function
    
    
      Dim m_bX64 As Boolean = False
    
      Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Try
          Dim iPort As Short
          iPort = Convert.ToInt16(TextBox1.Text)
    
          If (m_bX64) Then
            TextBox2.Text = Inp32_x64(iPort).ToString()
          Else
            TextBox2.Text = Inp32(iPort).ToString()
          End If
    
        Catch ex As Exception
          MessageBox.Show("An error occured:\n" + ex.Message)
        End Try
      End Sub
    
      Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Try
          Dim iPort As Short
          Dim iData As Short
    
          iPort = Convert.ToInt16(TextBox1.Text)
          iData = Convert.ToInt16(TextBox2.Text)
    
          If (m_bX64) Then
            Out32_x64(iPort, iData)
          Else
            Out32(iPort, iData)
          End If
    
        Catch ex As Exception
          MessageBox.Show("An error occured:\n" + ex.Message)
        End Try
      End Sub
    
      Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim nResult As UInt32
    
    
        Try
          nResult = IsInpOutDriverOpen()
        Catch ex As Exception
          nResult = IsInpOutDriverOpen_x64()
          If (nResult <> 0) Then
            m_bX64 = True
          End If
        End Try
    
        If (nResult = 0) Then
          Label1.Text = "Unable to open InpOut driver"
        End If
      End Sub
    
      Private Sub Beep(ByVal freq As UInt32)
        If (m_bX64) Then
          Out32_x64(&H43, &HB6)
          Out32_x64(&H42, (freq And &HFF))
          Out32_x64(&H42, (freq >> 9))
          System.Threading.Thread.Sleep(10)
          Out32_x64(&H61, (Convert.ToByte(Inp32_x64(&H61)) Or &H3))
        Else
          Out32(&H43, &HB6)
          Out32(&H42, (freq And &HFF))
          Out32(&H42, (freq >> 9))
          System.Threading.Thread.Sleep(10)
          Out32(&H61, (Convert.ToByte(Inp32(&H61)) Or &H3))
        End If
      End Sub
    
      Private Sub StopBeep()
        If (m_bX64) Then
          Out32_x64(&H61, (Convert.ToByte(Inp32_x64(&H61)) And &HFC))
        Else
          Out32(&H61, (Convert.ToByte(Inp32(&H61)) And &HFC))
        End If
      End Sub
    
      Private Sub ThreadBeeper()
        Dim i As UInteger
        For i = 440000 To 500000 Step 1000
          Dim freq As UInteger = 1193180000 / i '440Hz
          Beep(freq)
        Next i
        StopBeep()
      End Sub
    
    
      Private Sub button7_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles button7.Click
        Dim t As New System.Threading.Thread(New System.Threading.ThreadStart(AddressOf ThreadBeeper))
        t.Start()
      End Sub
    End Class
    

     

    lundi 25 avril 2011 15:19
  • J'ai fini par remarquer que tu parles toujours de LP1. Le port s'appelle *LPT1*. C'est une erreur dans le message ? Sinon réessayer le code d'origine en utilisant bien LPT1 au lieu de LP1.


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    lundi 25 avril 2011 15:35
    Modérateur
  • Malheureusement ce n'est pas aussi simple... C'est une erreur "d'innattention" quand j'écrivais les messages mais je n'ai pas fait l'erreur dans le programme.

    Merci.

    lundi 25 avril 2011 16:19
  • Il semblerait que le PC sur lequel je suis ait bien un port LPT1. J'essaierai de faire un essai tout à l'heure pour voir...


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    mardi 26 avril 2011 08:12
    Modérateur
  • Merci beacoup, c'est sympa !
    mardi 26 avril 2011 09:34
  • Errror 87 ici y compris après arrêt du spouleur mais la partie configuration me parait curieuse car c'est la première fois que je vois qu'il y aurait qq chose de configurable sur un port parallèle.

    Je commencerais par voir (ok ici mais je n'ai rien sur le port parallèle) :

       Try
    
        ' Parallel port.
    
        Console.WriteLine("Accessing the LPT1 parallel port")
    
        hParallelPort = CreateFile("LPT1", GENERIC_READ Or GENERIC_WRITE, 0, IntPtr.Zero, _
    
        OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, IntPtr.Zero)
    
        ' Verify that the obtained handle is valid.
    
        If hParallelPort.ToInt32 = -1 Then
    
         Throw New Exception("Unable to obtain a handle to the LPT1 port")
    
        End If
    
    
    
        Console.WriteLine("Writing the following data to LPT1: Test")
    
    	   ReDim Buffer(3)<br/>                Buffer(0) = 0<br/>                Buffer(1) = 0<br/>                Buffer(2) = 0<br/>                Buffer(3) = &H11    Success = WriteFile(hParallelPort, Buffer, Buffer.Length, BytesWritten, IntPtr.Zero)
    
        If Success = False Then
    
         Throw New Exception("Unable to write to LPT1")
    
        End If
    
       Catch ex As Exception
    
        Console.WriteLine(ex.Message)
    
       Finally
    
        ' Release the handle to LPT1.
    
        Success = CloseHandle(hParallelPort)
    
        If Success = False Then
    
         Console.WriteLine("Unable to release handle to LPT1")
    
        End If
    
       End Try
    
    
    
    

     Si cela ne marche pas je commence à être court. Le site du fabricant de la webcam n'aurait pas un SDK et des exemples de code ?

    Bon mise en forme pas top pour buffer. J'ai commencé par envoyer un octet &H11 mais il faudrait envoyer &H00000011 à la webcam ?


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    mardi 26 avril 2011 11:04
    Modérateur
  • Bonjour,

    Je n'ai pas tout compris à ton code mais déjà un bon point : il ne renvoie aucun message d'erreur juste "Writing the following data to LPT1: Test". Peut-être que c'est une bonne piste :) ?

    Mais dans la réalité je ne vois toujours aucun signal sortir...

    Sinon ça marche avec LPT1 et aussi avec LPT3 pourtant je n'ai qu'un port parallèle. Dans "gestionnaire de périphériques" LPT3 correspond à "PCI Parallel Port" et LPT1 à "Port imprimante".

    La plage de LPT1 est bien celle associée au port dans le BIOS (378-37F) et celle du LPT3 est "E800-E807". J'imagine que c'est donc bien le LPT1 qu'il faut toujours utiliser... Enfin bon de toutes façons ça ne marche sur aucun.

    Sinon le programme n'a rien à voir avec le site du fabricant de la webcam, j'ai encore une fois du mal m'exprimer désolé... Les sorties du port sont reliés à un petit montage avec des transistors qui fait tourner un moteur.

    Les signaux à envoyer sont 01000001 dans un cas et 00000011 donc en hexa 41 et 3.

    Bon en tous cas, c'est gentil de prendre du temps pour m'aider !

    (et sinon j'ai bien arrêté le spouleur)

    Merci.

    • Modifié -Felix mardi 26 avril 2011 12:34 Faute
    mardi 26 avril 2011 12:33
  • Y compris en mettant les bonnes valeurs dans le code ? J'ai mis &h11 (hexa) car je n'ai pas réalisé que les valeurs étaient en binaire malgré la profusion de 0 et de 1. Donc on aurait qq chose comme :

    Redim Buffer(1)
    Buffer(0)=0
    Buffer(1)=3

    Après je n'y connais rien en électronique. Est-ce que le moteur va se mettre à avancer/reculer indéfiniment ou est-ce qu'il avance/recule d'un pas lorsqu'une donnée est reçue (dans ce dernier cas, il faudrait peut-être faire une boucle pour envoyer 100 ou 200 fois la valeur pour produire qq chose de visible ?).

    Je commence à comprendre. La partie de programme qui pose problème n'a pour l'instant rien à voir avec la webcam ? (ou pilote juste l'orientation de son support ou qq chose comme cela ? Au départ j'avais l'impression que cela concernait la capture des images de la webcam)

    Sinon je tombe par exemple sur http://www.codeproject.com/KB/cs/csppleds.aspx qui correspond à ce que tu avais vu (sortie directe de la valeur sur le port donc &h378 pour LPT1).

     

     


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    mardi 26 avril 2011 15:14
    Modérateur
  • Bonjour, Felix,

    Avez-vous réussi à résoudre votre problème ? Merci pour partager avec nous les résultats, afin que d'autres personnes avec le même problème puissent profiter de cette solution.

     

    Cordialement,

    Cipri


    Suivez MSDN sur Twitter   Suivez MSDN sur Facebook


    Ciprian DUDUIALA, MSFT  
    •Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.

    jeudi 28 avril 2011 07:09
  • Bonjour,

    Excusez-moi de répondre si tardivement... J'étais parti en vancances.

    Non je n'ai pas résolu mon problème... Sous Win7 64bits la gestien du port // est un cauchemard...

    Du coup j'ai "solutionné" le problème en achetant un ordi sous XP à 30€. Je suis un peu déçu de ne pas avoir réussi sous Seven mais là c'est le jour et la nuit, tous les scripts fonctionnent parfaitement

    Merci pour votre aide !

    Félix.

    mercredi 4 mai 2011 17:26
  • Bonjour, Felix,

    Merci pour tenir la communauté informée sur la suite de vos démarches.

    Bonne journée,

    Cipri


    Suivez MSDN sur Twitter   Suivez MSDN sur Facebook


    Ciprian DUDUIALA, MSFT  
    •Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.

    jeudi 5 mai 2011 06:53
  • Bonjour!

    Je suis nouveau ici et je suis tombé sur ce post en cherchant une solution à mon problème. Même si très en retard pour ce post, j'ai constaté un peu partout que la solution n'était pas encore publié alors pour ceux qui font encore face à ce même problème je propose une solution qui a fonctionné avec moi.

    Suite à un problème similaire et des heures de casse-tête avec Windows 7 64, j'ai trouvé la solution pour faire communiquer les LPTx sous VB.net. En fait, tous les modèles que j'ai expérimenté utilisaient la dll "inpout32.dll" et rien ne fonctionnait. Je l'ai tout simplement remplacé par "inpoutx64.dll dans Windows\system32. Ensuite, j'ai modifié mon module... en conservant les alias (par paresse, afin de ne pas être obligé de remplacer le reste de mes variables dans tout mon code c.à-d. (Inp32 et Out32 par Inp64 et Out64)) 

    Module Module1
        Public Declare Function Lecture Lib "inpoutx64.dll" Alias "Inp32" (ByVal Adresse As Integer) As Integer
        Public Declare Sub Ecriture Lib "inpoutx64.dll" Alias "Out32" (ByVal Adresse As Integer, ByVal Valeur As Integer)

    End Module

    En espérant avoir aidé qualqu'un avec ma première contribution. ;-)


    dimanche 22 mars 2015 10:51