Com-poort in Excel uitlezen zonder timer (mscomm)

Status
Niet open voor verdere reacties.

obes

Gebruiker
Lid geworden
24 aug 2015
Berichten
11
Beste

Ik gebruik onderstaande vba codes in Excel om een com-poort uit te lezen (mscomm). Deze module werkt uitstekend, maar helaas werkt de module met een Timer en geeft dit conflicten met een andere timer in mijn Userform. Nu zou ik graag die timer van de com-poort eruit willen gooien. Maar ik krijg dat niet voor elkaar. Weet iemand hoe ik die timer er kan uitgooien?

Dit is de macro die ik gebruik voor het uitlezen van de com-poort: (RS232 = een MSCOMM toepassing in VBA)

Code:
Public intEndsignal As Integer

Sub CommTest()
'macro voor lezen van compoort

Dim commInput
If frmcomm.RS232.InBufferCount > 0 Or intEndsignal = 0 Then
frmcomm.RS232.InputLen = 0
commInput = frmcomm.RS232.Input
Else
Exit Sub
End If

frmcomm.RS232.Output = Chr(5) & Chr(10)

Dim stTime As Long

stTime = Timer

Do While frmcomm.RS232.InBufferCount = 0
DoEvents
If intEndsignal > 0 Then Exit Sub
If Timer > stTime + 10 Then Exit Do
Loop

If frmcomm.RS232.InBufferCount = 0 Then
MsgBox "Time out communicating with device." _
& Chr(13) & "Ensure the device power is on and cable is connected."
Exit Sub
End If

frmcomm.RS232.InputLen = 0

commInput = frmcomm.RS232.Input
AppendText (commInput)

End Sub

Sub AppendText(strText As String)
    With frmcomm.txtRead
        .SetFocus '//required
        .Value = .Value & strText & vbNewLine
        .SelStart = Len(.Value)
    End With
If frmcomm.txtRead.Value = 101 Then

Run ("startknop") 'de startknop start de timer in mijn userform
End If
End Sub
 
Zover ik kan zien is het enige wat die timer doet zorgen dat de routine niet langer dan 10 seconden loopt.

Er zit een doevents in de routine dus in principe zou er geen conflict moeten zijn met OnTime event, tenzij er veel data ook de poort komt.

Hoe merk je dat er een conflict is?
 
Beste

Allereerst al bedankt voor het snelle antwoord!

Ik heb een voorbeeld-Excel gemaakt. Zie bijlage:

Com10 ontvangt berichten
Com11 verstuurt berichten (Range "A1") in dit voorbeeld.

Het is de bedoeling dat steeds als er "101" via Com10 binnenkomt dat de timer (stopwatch) (rechts in het userform) opnieuw start vanaf 0. Ik kan de timer nu enkel herstarten als de alarmwaarde van 5.30sec is bereikt. Wat dus betekent dat er alleen berichten kunnen ontvangen worden als de timer (stopwatch) gestopt is. Je kan dit testen door de timer handmatig te stoppen (met stop-knop) en dan een bericht te versturen via com-poort. De stopwatch zal opnieuw beginnen te tellen.

In het Userform heb ik ook een knop "start-herstart" geplaatst. Deze knop zou dus uiteindelijk vervangen moeten worden door het bericht "101" op de com-poort.

VBA kan (dacht ik) geen twee timers tegelijk laten lopen, dus ik zou graag die timer van de com-poort verwijderen. Weet u hoe ik dit voor elkaar kan krijgen?
 
Laatst bewerkt:
Ik begrijp nog steeds niet helemaal waarom je 2 timers wil hebben. de "timer" functie in VBA geeft je alleen de tijd op een bepaald moment. In principe is er zelfs dus geen enkele timer.

Ik heb even door je code gelopen, maar ik kan het probleem nog steeds niet vinden. welke routine zou de code moeten bevatten die alles reset na ontvangst van 101?

Het gebruik van doevents zou je toe moeten laten om vanuit je userform code te plaatsen in je routine. ze moeten dan wel een gedeelde flag gebruiken. Mogelijk is het probleem dat een deel van je code in de userform zit en een ander deel in aparte module. dat betekend namelijk dat ze elkaar in principe wel kunnen zien, maar geen definities delen.
 
Hallo Wampier

Nogmaals bedankt voor mee te denken.

Ik ging er vanuit dat de stopwatch in Excel een "timer" functie in VBA was. Als dat niet zo is, dan ligt het probleem zeker niet aan de dubbele timer. De timer van de com-poort (die volgens u ook geen timer is) heb ik overigens daarnet kunnen verwijderen.


Ik zal even uitleggen wat de opzet is:
De stopwatch begint te lopen met de start/herstart knop. Deze knop zou niet alleen met de muis bediend moeten worden maar ook met de waarde '101' die via een com-poort binnenkomt. Dus constant zal de com-poort gecontroleerd moeten worden of de waarde 101 binnenkomt. Er wordt overigens niets anders verstuurt over die com-poort.


Als men op de start-knop drukt tijdens dat de stopwatch loopt begint deze per direct opnieuw bij 0 te tellen en wordt de laatste waarden opgeslagen in een rij in Excel. Dit zou ook met de com-poort zo moeten zijn. Het probleem lijkt te zijn dat er geen berichten kunnen ontvangen worden terwijl dat de stopwatch loopt.
De berichten van de com-poort worden normaal in een textbox (genaamd: txtRead) geplaatst. Dit lukt mij alleen als de stopwatch stilstaat. Heeft u enig idee hoe ik dat samen kan laten werken?

Dit is het overzichtje van de macro's die elkaar opvolgen:
- Private Sub cmdOpen_Click() deze opent alleen de poort voor berichten te kunnen ontvangen
- Public Sub cmdRead_Click() deze loop start steeds de macro (commtest) voor het lezen van berichten
- Sub CommTest() deze macro leest constant de com-poort uit en d.m.v. de macro Appendtext worden de berichten in de textbox genaamd txtRead geplaatst
- Sub AppendText(strText As String) plaatst het berichtje in een textbox en checkt of de waarde 101 is. Als deze waarden 101 is dan wordt de macro "startknop" gestart"
- Sub Startknop () dit is de macro met de stopwatch. Deze macro zal tegelijk moeten kunnen werken met het ontvangen van berichten.

Nogmaals en alvast bedankt!
 
Ik begrijp dat, maar waar probeer je in de rest van je programma "R1" te manipuleren?

ook gebruik je dus twee cellen om je stopwatch te creëren, maar je geeft ook niet aan waarom. In principe is er geen enkele noodzaak om de cellen te manipuleren. Als laatste heb je kans op lag. je stopt de stopwatch nu op precies 5,30. Maar je moet je bedenken dat er geen enkele noodzaak is dat je cel ook ooit in alle gevallen die waarde precies heeft. Bij zware belasting kan de waarde zomaar van 5,29 naar 5,31 gaan.

in je huidige opzet hoef je alleen maar je input te checken op 101 en r1 op false zetten, maar je lijkt dat te proberen via "startknop".

Dus, komt je routine uberhaubt ooit aan op de run marco? Checken met breakpoint: in de grijze balk voor "run startknop" klikken
zo ja, probeer ens r1 op false te zetten in plaats van via run startknop
 
Mscomm heeft het OnComm event. Een timer of een eigen event loop is dus niet nodig.
 
Ik ben nog even aan het testen geweest. Het probleem zit inderdaad in mijn stopwatch. Ik heb die een tijd geleden uit diverse forums samengesteld en het werkt. Ik heb afgelopen avond nog onzin er tussenuit gehaald. Ook de alarmfunctie heb ik er even uitgegooid. De "R1" wordt eigenlijk nergens in het programma gemanipuleerd. Door deze macro te activeren herstart de timer per direct. Het is nu deze geworden: Deze


Code:
Sub startknop()
frmcomm.txtRead = Empty 'com-bericht verwijderen uit textbox

Range("R1").Value = True 'timer actief
  Range("Q65536").End(xlUp).Offset(1, 0) = Range("S1")
  Range("S1").ClearContents
  timing = Timer
  Range("R1").Value = True
   Do While Range("R1")
      Range("S1") = Format(Timer - timing, "0.00")
        frmcomm.Timer_userform.Value = Range("S1")
        DoEvents
  Loop

End Sub

Helaas worden er tijdens dat deze stopwatch loopt geen com-berichten ontvangen. Zodra ik de stopwatch handmatig stop, dmv "R1=False" dan kan ik wel direct weer de stopwatch starten met een berichtje over de com-poort te sturen.

Iemand enig idee hoe ik dit samen kan combineren? De loopfunctie in de stopwatch zorgt volgens mij voor het conflict dat er geen berichten meer ontvangen kunnen worden.
 
die stopwatch verhindert inderdaad dat er andere dingen plaatsvinden; wat gaat er mis zonder stopwatch ?
 
Dan worden er wel constant berichten ontvangen.
Ik heb de stopwatch eens vervangen door onderstaande test-macro en dan werkt het ook gewoon. Iedere keer als er het berichtje 101 binnenkomt wordt cel A1 onder de laatste cel van kolom B geplaatst. Natuurlijk zit in deze test macro geen loop. Dus het gaat daar ergens fout. Wie weet wat?

Code:
Sub test()
Range("B65536").End(xlUp).Offset(1, 0) = Range("A1")
frmcomm.txtRead = Empty
End Sub
 
Dus:
Deze combinatie werkt wel:
Code:
Public intEndsignal As Integer

Sub CommTest()
'macro voor lezen van compoort

Dim commInput
If frmcomm.RS232.InBufferCount > 0 Or intEndsignal = 0 Then
frmcomm.RS232.InputLen = 0
commInput = frmcomm.RS232.Input
Else
Exit Sub
End If
Do While frmcomm.RS232.InBufferCount = 0
DoEvents
If intEndsignal > 0 Then Exit Sub
Loop
frmcomm.RS232.InputLen = 0

commInput = frmcomm.RS232.Input
AppendText (commInput)

End Sub

Sub AppendText(strText As String)
    With frmcomm.txtRead
        .SetFocus '//required
        .Value = .Value & strText & vbNewLine
        .SelStart = Len(.Value)
    End With
If frmcomm.txtRead.Value = 101 Then
Run ("test")
End If
End Sub

Sub test()
Range("B65536").End(xlUp).Offset(1, 0) = Range("A1")
frmcomm.txtRead = Empty
End Sub

Maar zodra ik de Run "test" vervang door Run "startknop" dan worden er geen berichten meer ontvangen tijdens dat de stopwatch loopt.
Code:
Sub startknop()
frmcomm.txtRead = Empty

Range("R1").Value = True 'timer actief
Range("Q1") = "Tijden"
  Range("Q65536").End(xlUp).Offset(1, 0) = Range("S1")
  Range("S1").ClearContents
  timing = Timer
  Range("R1").Value = True
  Do While Range("R1")
    Range("S1") = Format(Timer - timing, "0.00")
        frmcomm.Timer_userform.Value = Range("S1")
        DoEvents
  Loop

End Sub
 
Laatst bewerkt:
Ik ben al een stukje verder geholpen en kan mijn vraag nu veel gerichter schrijven.

Ik heb een vervolg op deze vraag verder gezet in onderstaande link.

Nieuwe vraag
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan