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 Sub
Vaikka 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 Loop
Mitenkä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.