PC Software in VB.NET voor Data Acquisitiekaart

Postby pjongen » Wed Nov 28, 2007 12:00 am

Hoi,

Ik heb de VB6 versie door VS2005 laten omzetten. Dat ging wonderwel goed voor wat de Form betreft. Hier en daar werd ik wel op de vingers getikt, maar dat was snel verholpen.

Waar VS2005 niet uit kwam was de call naar de DLL.
VB.NET kent geen Varptr meer (Pointer naar variable, ipv de variabele zelf). De omzetten gaf daar geen suggesties. De microsoft site komt niet verder dan mij te vertellen dat ik geen Varptr meer nodig heb. Grrrrr, dat maak ik zelf wel uit!

Na wat googelen en toen wat goochelen ben ik eruit gekomen. Het werkt hier met VS2005 VB. Of het ook met de Expess versie werkt weet ik niet, maar dat hoor ik dan wel.

Heel uitvoerig heb ik niet getest want de grote wijzer staat nu al een tijdje rechts van de 12.

Veel plezier ermee.
Attachments
DataAcq-VB.NET.zip
(334.99 KiB) Downloaded 58 times
pjongen
 
Posts: 64
Joined: Thu Jan 02, 2014 3:37 pm

Postby pjongen » Wed Nov 28, 2007 12:00 am

In de versie die ik vanacht op dit forum gepost heb kreeg ik nog wat warnings. Ik moet bekennen dat: "het werkte maar ik wist niet waarom".

Vandaag ben ik er nog even ingedoken en nog wat gegoogled en daarna minder gegoocheld.
Het werkt nog streeds en ik weet nu ook waarom!
Hierbij een nieuwe versie. De vorige kan in de bittenbak.

Peter
Attachments
USB_5fInterface_20rev2.NET.zip
(336.97 KiB) Downloaded 76 times
pjongen
 
Posts: 64
Joined: Thu Jan 02, 2014 3:37 pm

Postby nack » Wed Nov 28, 2007 12:00 am

Prachtig zeg, ik ga het eens doornemen!! Hartelijk dank alvast voor uw hulp!
nack
 
Posts: 3
Joined: Thu Jan 02, 2014 3:42 pm

Postby stynus_ » Thu Nov 29, 2007 12:00 am

Bedankt
stynus_
 
Posts: 9
Joined: Thu Jan 02, 2014 3:37 pm

Postby pjongen » Thu Jan 24, 2008 12:00 am

Hoi,

De mensen die gebruik maken van mijn testprogramma in VS2005 VisualBasic.NET, zullen bij een duurtest merken dat het programma steeds meer geheugen gaat gebruiken. Dat ligt uiteraard aan de programmeur. (mea culpa)
Als je mijn commentaar in de code hebt gelezen, dan zie je dat ik nogal heb zitten vechten rond het doorgeven van de send- en receivebuffers aan de API.
In VB.NET ontbreekt Varptr, en pointers zijn nu eenmaal belangrijk bij het doorgeven van grote buffers.
De twee oplossingen die ik daarvoor bedacht had, werken maar zijn nogal gekunsteld.
1 - InteropServices.Marchal.UnsafeAddrOfPinnedArraElements (PFfffff hoe verzin je het)
2- Pointer van het adres van een PinnendObject()

Het zijn mogelijkheden uit de hogere DotNet kunde en behoren tot de groep ‘unsafe code' dus Microzacht vind dat je dat alleen maar mag toepassen (als je weet wat je doet en) om te interfacen met “niet Dot Net” DLL’s. Goed het mocht dus.

De methode die ik koos was Nr2. maar nu iemand rapporteerde dat het programma geheugen vreet ben ik daar nog eens naar gaan kijken. Het lijkt erop dat ik de buffers niet meer vrij kan geven. Tja, wie ruimt ze dan op? De garbage collector van .Net in ieder geval niet.

Hierbij een nieuwe versie met een véél elegantere oplossing! 64 bytes buffers zijn niet zo groot, dus ik stuur de hele buffer naar de API ( ByValue) en bingo, waarom heb ik dat niet eerder zo bedacht.

Als je al, met mijn programma als basis, begonnen bent de zaak te verbouwen en uit te bouwen hoef je alleen de VBMPSUBAPI.vb te vervangen in je eigen programma! In de rest is niets veranderd.

Testen maar weer. Succes.
Peter.


PS:
Regel 1: In ieder goedlopend programma zit minstens één niet ontdekte bug.
Regel 2: Als de in regel 1 genoemde bug is gevonden en opgelost, dan blijft regel 1 onverminderd van kracht.
Attachments
USB_5fInterface.VB.NET.zip
(434.03 KiB) Downloaded 77 times
pjongen
 
Posts: 64
Joined: Thu Jan 02, 2014 3:37 pm

Postby drejansen » Sun Mar 09, 2008 12:00 am

hallo,
ik gebruik VB6.0

wat is dit? melding: error opening pipes

wanneer ik een tellertje opstart, dan krijg ik de melding error opening pipes.
ik gebruik onderstaand programma onder een commandbutton.
wanneer ik een textblok uitlees, werkt het wel.

wat doe ik fout?
welke fout in welke pijp?
====

Private Sub Command1_Click()
Dim tel As Integer

Dim Send_Buf(0 To 64) As Byte
Dim Rec_Buf(0 To 64) As Byte

Dim b As Byte

For tel = 1 To 10

If (myOutPipe INVALID_HANDLE_VALUE) Then
Send_Buf(0) = 16
Send_Buf(1) = tel
If (Send_Receive(Send_Buf, 2, Rec_Buf, 1, 1000, 1000) <> 1) Then
MsgBox "Fout bij Output byte"
End If
End If



Next tel


End Sub
========

vlak voor de 'next tel' wil ik 500 miliseconden wachten
volgens mij is daarvoor de opdracht: waitms(500)
dat werkt niet, waarom niet?
wat doe ik hier weer fout?

groeten, Dré
Het leven is een groot feest, maar je moet zelf de slinges ophangen
User avatar
drejansen
 
Posts: 11
Joined: Thu Jan 02, 2014 3:27 pm
Location: Hoeksche Waard

Postby pjongen » Sun Mar 09, 2008 12:00 am

Dré

Ik heb het even geprobeerd, maar kan geen fout vinden. Voor alle zekerheid hier een cut-and-past van de code in mijn programma.

Private Sub Command1_Click() 
Dim tel As Integer

Dim Send_Buf(0 To 64) As Byte
Dim Rec_Buf(0 To 64) As Byte

Dim b As Byte

For tel = 1 To 10

If (myOutPipe *** INVALID_HANDLE_VALUE) And (myInPipe *** INVALID_HANDLE_VALUE) Then
Send_Buf(0) = 16
Send_Buf(1) = tel
If (Send_Receive(Send_Buf, 2, Rec_Buf, 1, 1000, 1000) <> 1) Then
MsgBox "Fout bij Output byte"
End If
End If
Debug.Print "Tel=" + Str(tel)
Next

End Sub


*** Helaas komen op deze site in de code de (kleiner dan/groter dan) tekens niet door. Maar op de plaats van de *** moet dus
kleiner/groter dan staan (Not Equal)

Ik heb er even debug.print in gezet om het te controleren want ik heb geen leds aan de PIC nu.

Let op "error opening pipes -1,-1 " krijg je bij VB als je het programma in de VB omgeving gebruikt vervolgens stopt en dan weer herstart. Daar heb ik eens wat over geschreven op het forum. Doe eerst even een Reset van de PIC en start dan het programma.

Ik zet er zo nog een tweede antwoord op want waitms(500) is geen standaard VB commando.
pjongen
 
Posts: 64
Joined: Thu Jan 02, 2014 3:37 pm

Postby pjongen » Sun Mar 09, 2008 12:00 am

In VB6 is geen pause of wait of een dergelijke opdracht.
Ik gebruik daarvoor een standaard commando uit de windows kernal library.

Zet boven in je programma, dus buiten alle Subs e.d. de volgende lijn:

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)


In de code waar je moet wachten doe je dan:
 Sleep (500) ' Wacht 500 mSec


Deze methode heeft de voorkeur boven een met for-next gemaakte wachtloop. Windows gebruikt een event timer om te wachten en verstookt geen processortijd, iets dan een for-next natuurlijk wel doet.

Maar, Let op. Dit commando legt het hele programma plat!. Dat valt vooral op als je lange tijden moet wachten.
B.v. Sleep(5000) Dan lijkt je programma compleet vast te hangen (programma reageert niet) Je hebt windows immers gevraagd je programma gedurende een lange tijd te laten slapen.

Als je lange tijd wil wachten, doe dan toch een for/next loop met daarin korte sleeptijden.

Dat zou er zo uit kunnen zien:

    
For i = 1 To 100
Sleep (100)
DoEvents
Next


De bovenstaande routine wacht 10 seconden in stapjes van 0,1Sec. Dus elke 0,1 seconde krijgt je programma weer even lucht.

Success ermee
Peter
pjongen
 
Posts: 64
Joined: Thu Jan 02, 2014 3:37 pm

Postby drejansen » Sun Mar 09, 2008 12:00 am

bedankt!

jouw programma werkt bij mij ook, nu nog het verschil met mijn verzie uitzoeken

ondertussen weet ik dat waitms een bascom commando is. (tja, je haalt wel eens wat door elkaar)

bedankt voor de tip om in VB een wachtlus te maken.

groeten, Dré
Het leven is een groot feest, maar je moet zelf de slinges ophangen
User avatar
drejansen
 
Posts: 11
Joined: Thu Jan 02, 2014 3:27 pm
Location: Hoeksche Waard


Return to 2007-11 USB data-acquisitiekaart

Who is online

Users browsing this forum: No registered users and 1 guest