Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6: COM-portista tekstitiedostoon

Konna [20.09.2006 09:56:17]

#

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

BadSource [20.09.2006 10:53:14]

#

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

Konna [21.09.2006 13:37:58]

#

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?

BadSource [21.09.2006 14:26:20]

#

[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...

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta