Hoe te spoelen InBuffer in MSComm?

V

vdaniel

Guest
Is er een mogelijkheid om te spoelen van de InBuffer van de MSComm in Visual Basic 6.0?

Varuzhan

 
Bedankt, hielp het.Please, waar kan ik meer over lezen?
Bedankt,

Varuzhan

 
Er zijn zoveel middelen over MSComm ...andere de korte docs door Microsoft

Eenvoudig zoeken op google en vindt u vele artikelen en samples op onderwerp.

Ik wil alleen opmerken dat je MSComm moet gebruiken alleen in een event-driven mode, bijvoorbeeld wacht niet voor chars aankomst door repeately lezen InBufferCount.

Sante
PicMan

 
Heel vreemd

Deze code werkt goed, ondanks uw aanbeveling:

Terwijl bEndFlag = False
DoEvents

Als UserForm1.MSComm1.InBufferCount> 0 Then

Buffer = UserForm1.MSComm1.Input

Ch = CByte (buffer (0))
If (ch> = 4

<img src="http://www.edaboard.com/images/smiles/icon_cool.gif" alt="Koel" border="0" />

En (Ch <5

<img src="http://www.edaboard.com/images/smiles/icon_cool.gif" alt="Koel" border="0" />

Dan
ADCCode = (10 * ADCCode) Ch - 48
ElseIf Ch = 13 Dan
ADCCode = ADCCode 2
Evenementen Evenementen = 1
Cells (1, 1) = Evenementen
Cells (ADCCode, 1) = Cells (ADCCode, 1) 1
ADCCode = 0
End

End
Wend

Maar de event-driven werkt veel trager, en hangt op
minder karakters tarief

Private Sub MSComm1_OnComm ()

Statische ADCCode As Integer
Statische Ch As Byte
Statische Buffer As Variant

Select Case MSComm1.CommEvent
Zaak comEvReceive

Buffer = MSComm1.Input

Ch = CByte (buffer (0))
If (ch> = 4

<img src="http://www.edaboard.com/images/smiles/icon_cool.gif" alt="Koel" border="0" />

En (Ch <5

<img src="http://www.edaboard.com/images/smiles/icon_cool.gif" alt="Koel" border="0" />

Dan
ADCCode = (10 * ADCCode) Ch - 48
ElseIf Ch = 10 Dan
Cells (1, 1) = ADCCode
Cells (ADCCode 2, 1) = Cells (ADCCode 2, 1) 1
ADCCode = 0
End

Case Else
End Select

End Sub

Please, kunt u dit verklaren?

Bedankt,

Varuzhan

 
Uw code moet bugs zijn, denk ik.
Mijn eigen code wordt uitgevoerd veel sneller als ik herschreef het event driven, en het is de enige manier om te gaan wanneer er een vertraging tussen onderzoek en antwoord van de seriële apparaat.
Anders uw code afval miljard van CPU cycli.

Hebt u ZOWEL InputLen eigendom en RTreshold tot 1?

Input kunnen terugkeren meer dan een char!

PicMan

 
Hieronder is al mijn code met de haven initialisatie, is het zeer kort.Please, check it.
De instelling UserForm1.MSComm1.RThreshold = 0
Ik gebruik nu het uitschakelen van de event-driven procedure.Openbare ADCCode As Integer
Openbare Evens As Integer
Openbare Ch As Byte
Openbare Buffer As VariantSub DataAcquisition ()

Sheets ( "Sheet1"). Selecteer

Dim i As Integer
'UserForm1.InBufferSize = 8192
UserForm1.MSComm1.CommPort = 4
UserForm1.MSComm1.PortOpen = True
UserForm1.MSComm1.Handshaking = comNone
UserForm1.MSComm1.Settings = "115200, N, 8,1"
'set voor 115.200 Baud, geen pariteit, 8 bits, 1 stop bit
UserForm1.MSComm1.InputMode = comInputModeBinary
'binaire data terug in variant array
UserForm1.MSComm1.InputLen = 1
'ingesteld op een teken bij het lezen door Input
UserForm1.MSComm1.RThreshold = 0
"aantal tekens te ontvangen voordat
'genereren op comm evenement
UserForm1.MSComm1.DTREnable = True
UserForm1.MSComm1.RTSEnable = False

UserForm1.MSComm1.InputLen = 1
"overdracht alle ontvangen bytes gelezen
UserForm1.MSComm1.RThreshold = 0
'onderbreken na 1 byte

ADCCode = 0

Terwijl bEndFlag = False
DoEvents

Als UserForm1.MSComm1.InBufferCount> 0 Then

Buffer = UserForm1.MSComm1.Input

Ch = CByte (buffer (0))
If (ch> = 4

<img src="http://www.edaboard.com/images/smiles/icon_cool.gif" alt="Koel" border="0" />

En (Ch <5

<img src="http://www.edaboard.com/images/smiles/icon_cool.gif" alt="Koel" border="0" />

Dan
ADCCode = (10 * ADCCode) Ch - 48
ElseIf Ch = 13 Dan
ADCCode = ADCCode 2
Evenementen Evenementen = 1
Cells (1, 1) = Evenementen
Cells (ADCCode, 1) = Cells (ADCCode, 1) 1
ADCCode = 0
End

End
Wend
End Sub

Waar is het fout?
Bedankt

Varuzhan

 
Ik had het over het evenement aangedreven versie.Je moet zorgen dat je personage verwerking routine krijgt slechts een char snaren.
U verbruikt alleen de eerste, en negeren als buffer meer is binnen.

Anyway

1) U moet gebruiken Option Explicit
U verklaart "Evens", maar in je code te gebruiken "Evenementen"

2) Het gebruik van

Met Userform1.MSComm1
.....
End With

zou uw code beter leesbaar.

3) Deze opmerkingen zijn verkeerd

UserForm1.MSComm1.InputLen = 1 'overdracht van alle ontvangen bytes gelezen
UserForm1.MSComm1.RThreshold = 0 'onderbreken na 1 byte

PicMan

 
Ik gecorrigeerde de definitie Evenementen in plaats van Evens, maar niets veranderd, toen
Ik schrijf

UserForm1.MSComm1.InputLen = 0 of 1 dezelfde
UserForm1.MSComm1.RThreshold = 1

opnieuw het programma hangt

dan moet ik commentaar uit de uitlezing lus in de while lus,
en krulandijvie alleen de event driven code, maar het geeft een overflow fout in de lijn
ADCCode = (10 * ADCCode) Ch - 48

Zoals mijn input lijn kan worden 1 tot 3 cijfers "\ n 'karakter kan ik niet bepalen de
input string lengte.Daarom lees ik de input karakter van karakter.
Wat kan ik doen?

Bedankt
Varuzhan

 

Welcome to EDABoard.com

Sponsor

Back
Top