Situatie
Ik werk binnen Visual Studio.NET met visual basic als taal aan een project waarbij via seriele communicatie een zogenaamde weger word aangesproken. De applicatie is een system tray applicatie welke een menu toont waarbij een aantal formulieren getoond kunnen worden. Het enige wat deze applicatie doet is ophalen van bepaalde strings uit het apparaat en weergeven in de applicatie. Dit werkt niet geheel honderd procent.
Om te communiceren met het apparaat maak ik gebruik van system.io.ports in combinatie met een module die gebruikt word in dit artikel: http://www.codeworks.it/net/VBNetRs232.htm.
Vervolgens maak ik gebruik van een seriele pc card met 2 poorten van sweex waarbij ik de beide volgens de handleiding van de weger geconfigureerd heb. Dit heb ik ook in de applicatie gedaan. Hieronder volgt een stukje code waarbij ik de poorten open:
Dit is alleen de relevante code.
Vervolgens word in een ander deel van de code de waarde opgehaald:
Dit is alleen de relevante code.
Deze code is werkt voor elke string hetzelfde. De applicatie voert deze string in: "@01199999999949” waarbij wij vervolgens een string terugkrijgen. Deze string bevat de waarde uit de weger en deze word dan in de database opgeslagen.
Probleem
Nu is het zo dat deze code hierboven niet altijd juist uitgevoerd word. De ene keer tijdens het debuggen word de waarde wel opgehaald en een andere keer niet. De variabele dblTotal2 word Ik kan tijdens het debuggen niet echt achterhalen wat er mis gaat. Zo gauw je een breakpoint zet en er doorheen stept word 8 van de tien keer de waarde gevuld. Zo gauw je zonder draait niet of 2 van de tien keer. Erg vaag en vrij allemaal. Het lijkt alsof het programma in runtime te snel draait wat de code niet de tijd geeft om alles op te halen. Threads gebruikt helpt ook niet een thread.sleep(5000) of thread.sleep(10000) tussen diverse regels van bovenstaande code plaatsten haalt niets uit.
Wat ik geprobeerd heb
- Debuggen en watches gedraaid en gezet. Zoals ik zei wordt de waarde soms gevuld. De weger zelf functioneerd prima. De applicatie van de fabrikant waarmee zij de weger testen werkt prima en leest altijd waarden uit.
- Veel gegoogled maar niets gevonden wat mij kan vertellen waarom de communicatie of het ophalen van de data zo sporadisch verloopt. Dit natuurlijk vanwege het feit dat ik een erg specifieke apparaat gebruik.
- Gezocht op GOT natuurlijk, ook niets nuttigs gevonden met betrekking tot sporadisch werkende communicatie.
Nu ligt mijn hoop hier. Ik ben bereid veel meer informatie te verstrekken en wilde in mijn TS vrij kort en bondig mijn probleem tonen en zo een niet al te lange mogelijk verwarrende post maken.
Hopelijk zijn jullie in staat mij te helpen.
Ik werk binnen Visual Studio.NET met visual basic als taal aan een project waarbij via seriele communicatie een zogenaamde weger word aangesproken. De applicatie is een system tray applicatie welke een menu toont waarbij een aantal formulieren getoond kunnen worden. Het enige wat deze applicatie doet is ophalen van bepaalde strings uit het apparaat en weergeven in de applicatie. Dit werkt niet geheel honderd procent.
Om te communiceren met het apparaat maak ik gebruik van system.io.ports in combinatie met een module die gebruikt word in dit artikel: http://www.codeworks.it/net/VBNetRs232.htm.
Vervolgens maak ik gebruik van een seriele pc card met 2 poorten van sweex waarbij ik de beide volgens de handleiding van de weger geconfigureerd heb. Dit heb ik ook in de applicatie gedaan. Hieronder volgt een stukje code waarbij ik de poorten open:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
| 'Port 5 properties With mRS232Port5 .Port = 5 .BaudRate = 9600 .DataBit = 7 .StopBit = Rs232.DataStopBit.StopBit_2 .Parity = Rs232.DataParity.Parity_Even .Timeout = 1500 .Open() End With 'Port 6 properties With mRS232Port6 .Port = 6 .BaudRate = 9600 .DataBit = 7 .StopBit = Rs232.DataStopBit.StopBit_2 .Parity = Rs232.DataParity.Parity_Even .Timeout = 1500 .Open() End With 'Check if ports are realy open If mRS232Port5.IsOpen And mRS232Port6.IsOpen Then sysTray.ShowBalloonTip(250, gFunction.ApplicationTitle(""), "Port " & mRS232Port5.Port & " and " & mRS232Port6.Port & " are opened and initialized." + _ CType(ChrW(13), [Char]) + "Calculations are started.", ToolTipIcon.Info) mRS232Port5.Dtr = True mRS232Port6.Dtr = True mRS232Port5.Rts = True mRS232Port6.Rts = True mRS232Port5.EnableEvents() mRS232Port6.EnableEvents() |
Dit is alleen de relevante code.
Vervolgens word in een ander deel van de code de waarde opgehaald:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| Sub Calculate(ByVal mRS232Port As Rs232, ByVal Weighingid As Int32, ByVal intWeigherid As Int16) 'Create variables for storing TOTALS Dim strTotal2 As String Dim dblTotal2 As Double 'Retrieve Total2 from the weigher Dim strRequestTotal2 As String strRequestTotal2 = "@01199999999949*" + ControlChars.Cr mRS232Port.Write(strRequestTotal2) mRS232Port.Read(17) strTotal2 = mRS232Port.InputStreamString strTotal2 = Mid(strTotal2, 6, 8) If IsNumeric(strTotal2) Then dblTotal2 = CType(strTotal2, Double) Else dblTotal2 = 0 End If mRS232Port.PurgeBuffer(Rs232.PurgeBuffers.TxClear Or Rs232.PurgeBuffers.RXClear) |
Dit is alleen de relevante code.
Deze code is werkt voor elke string hetzelfde. De applicatie voert deze string in: "@01199999999949” waarbij wij vervolgens een string terugkrijgen. Deze string bevat de waarde uit de weger en deze word dan in de database opgeslagen.
Probleem
Nu is het zo dat deze code hierboven niet altijd juist uitgevoerd word. De ene keer tijdens het debuggen word de waarde wel opgehaald en een andere keer niet. De variabele dblTotal2 word Ik kan tijdens het debuggen niet echt achterhalen wat er mis gaat. Zo gauw je een breakpoint zet en er doorheen stept word 8 van de tien keer de waarde gevuld. Zo gauw je zonder draait niet of 2 van de tien keer. Erg vaag en vrij allemaal. Het lijkt alsof het programma in runtime te snel draait wat de code niet de tijd geeft om alles op te halen. Threads gebruikt helpt ook niet een thread.sleep(5000) of thread.sleep(10000) tussen diverse regels van bovenstaande code plaatsten haalt niets uit.
Wat ik geprobeerd heb
- Debuggen en watches gedraaid en gezet. Zoals ik zei wordt de waarde soms gevuld. De weger zelf functioneerd prima. De applicatie van de fabrikant waarmee zij de weger testen werkt prima en leest altijd waarden uit.
- Veel gegoogled maar niets gevonden wat mij kan vertellen waarom de communicatie of het ophalen van de data zo sporadisch verloopt. Dit natuurlijk vanwege het feit dat ik een erg specifieke apparaat gebruik.
- Gezocht op GOT natuurlijk, ook niets nuttigs gevonden met betrekking tot sporadisch werkende communicatie.
Nu ligt mijn hoop hier. Ik ben bereid veel meer informatie te verstrekken en wilde in mijn TS vrij kort en bondig mijn probleem tonen en zo een niet al te lange mogelijk verwarrende post maken.
Hopelijk zijn jullie in staat mij te helpen.
[ Voor 2% gewijzigd door RobIII op 06-12-2006 15:26 ]
I've been mad for fucking years, absolutely years, been over the edge for yonks.
Vinyl: Discogs