Tarkoitus olisi saada COM-portista tuleva data tekstitiedostoon, siten että loppumerkin tullessa data kirjoitetaan aina omalle rivilleen. Olen yrittänyt saada datan koko sisältöä tekstitiedostoon mutta vain osa tallentuu siihen. Textboxiin saan kyllä koko datasisällön.
Tässä vähän koodia vastaan ottavasta ohjelmasta....mikähän tässä kusee?
Dim Teksti As String
Private Sub Command1_Click()
End
End Sub
Private Sub Form_Load()
Form1.Caption = "Vastaanotto"
With MSComm1
.CommPort = 1
.Handshaking = 2 - comRTS
.RThreshold = 1
.RTSEnable = True
.Settings = "9600,n,8,1"
.SThreshold = 1
.PortOpen = True
.EOFEnable = True
.InputLen = 0
End With
End Sub
Private Sub Form_Unload(Cancel As Integer)
MSComm1.PortOpen = False
End Sub
Private Sub MSComm1_OnComm()
Dim InBuff As String
Select Case MSComm1.CommEvent
' Errors
Case comEventBreak ' A Break was received.
Case comEventCDTO ' CD (RLSD) Timeout.
Case comEventCTSTO ' CTS Timeout.
Case comEventDSRTO ' DSR Timeout.
Case comEventFrame ' Framing Error
Case comEventOverrun ' Data Lost.
Case comEventRxOver ' Receive buffer overflow.
Case comEventRxParity ' Parity Error.
Case comEventTxFull ' Transmit buffer full.
Case comEventDCB ' Unexpected error retrieving DCB]
' Events
Case comEvCD ' Change in the CD line.
Case comEvCTS ' Change in the CTS line.
Case comEvDSR ' Change in the DSR line.
Case comEvRing ' Change in the Ring Indicator.
Case comEvReceive ' Received RThreshold # of chars.
InBuff = MSComm1.Input
Call HandleInput(InBuff)
Case comEvSend ' There are SThreshold number of
' characters in the transmit
' buffer.
Case comEvEOF ' An EOF character was found in the input stream.
'MsgBox "Loppumerkki löytyi"
Call Create_File
End Select
End Sub
Sub HandleInput(InBuff As String)
Text1.SelStart = Len(Text1.Text)
Text1.SelText = InBuff
Teksti = InBuff
End Sub
Sub Create_File()
Dim fso, txtfile
Set fso = CreateObject("Scripting.FileSystemObject")
Set txtfile = fso.CreateTextFile("c:\testfile.txt", True)
txtfile.WriteLine (" " & Teksti & " ")
txtfile.Close
End SubVaikka InputLen olisikin asetettu nollalle (luetaan koko InputBufferin sisältö kerralla), niin bufferista luetaan vain data, joka sinne on lukuhetkeen mennessä ehtinyt saapua. Lue saapuva data loopissa...
InBuff = ""
Do While MSComm1.InBufferCount > 0 'puskurissa dataa...
InBuff = InBuff & MSComm1.Input
LoopMitenkähän ton bufferin koko sisällön saisi tekstitiedostoon aina omalle riville, aina kun loppumerkki havaitaan. Tuntuu että Case comEvEOF liipaisee jo ennen kuin InBuff = InBuff & MSComm1.Input luuppi ehtii loppuun?
[mutu]Tämä nyt riippuu aivan siitä, mitä dataa comm-portistasi tulee, mutta "normaalisti" sarjaliikenteellä saapuva data sisältää jo automaattisesti rivinvahdon aina yhden "kokonaisuuden" lopussa. Eli kokeile vaihtaa
txtfile.WriteLine (" " & Teksti & " ")muotoon
txtfile.Write (" " & Teksti & " ")WriteLine lisää "ylimääräisen" rivinvaihdon lisäämänsä datan loppuun, kun taas Write lisää datan sellaisenaan.
Toinen, mihin kiinnittäisin huomiota, on tuo, että kannattaako välttämättä käyttää molempia eventtejä (comEvReceive ja comEvEOF) datan käsittelyyn? Itse kirjoittaisin datan tiedostoon samalla, kun se lisätään TextBoxiin, eli silloin kun yksi "kokonaisuus" on InputBufferista luettu muuttujaan. Tällöin jäittäisin pois tuon comEvEOF. Asia on toinen jos dataa pukkaa jatkuvalla syötöllä, jolloin laittaisin molemmat datan esittämiset (TextBox ja tiedosto) comEvEOF:n alle.[/mutu]
Edellä mainittu on siis pelkkää mutua, koska tilanteestasi (mitä dataa, miten tiuhaan jne.) ei ole mitään tietoa...
Aihe on jo aika vanha, joten et voi enää vastata siihen.