vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
NEU! sevCoolbar 3.0 - Professionelle Toolbars im modernen Design!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Fortgeschrittene
Schreiben in Textdatei wird abgebrochen 
Autor: kurol
Datum: 21.07.17 10:39

Hallo zusammen,

ich bitte euch, mich bei folgendem Problem zu unterstützen:

Ich habe unter VB.NET 2012 ein Programm geschrieben, mit dem von auf einem embedded Rechner (ARM, Linux) Daten wie z. B. eine Log-Datei mit ca. 50 kB, reine Textdatei) über die serielle Schnittstelle abrufen und auf einem Bedienrechner (Windows 7 / 64Bit) darstellen kann.

Die abgerufene Log-Datei wird komplett in der Windows-PC geladen und in einer Richt-Text-Box auch einwandfrei dargestellt, wenn ich sie aber in eine Textdatei abspeichern will, bricht der Schreibvorgang nach einigen Hundert Bytes ab.
Hier ist es egal, ob ich den eingelesenen Text direkt oder den aus der Richt-text-Box ausgelesenen Text abspeicheren will. Der Schreibvorgang wird immer nach unterschiedlicher Länge abgebrochen.

Ich habe bereits sämtliche im Web gefundenen Code-Varianten (write, writeall, writealltext usw.) ausprobiert, alles erfolglos.
Es werden während des Schreibens auch keine anderen Befehle ausgeführt und die Datei ist komplett vom embedded-Rechner heruntergeladen.

Hier mal die Code-Variante, die ich zuletzt verwndet habe:

  Dim docname As String = "d:\Log.txt"
 
  Dim logWriter As New System.IO.StreamWriter(docname, True)
 
  logWriter.Write(receivedtext)				' von UART oder
  logWriter.Write(rtbreceived.text)			' aus Rich text box
  logWriter.Flush()
  logWriter.Close()
Ich weiß nicht, was man hier noch falsch machen kann oder ob ich etwas nicht beachte (ich bin kein VB.NET - Spezialist).

Wenn also jemand das Problem kennt oder über eine Lösung verfügt, wäre ich ihm sehr dankbar.

Ich bedanke mich für eure Antworten schon mal im Voraus.


Roland
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Schreiben in Textdatei wird abgebrochen 
Autor: Manfred X
Datum: 21.07.17 12:24

Hallo!

Stehen eventuell Null-Bytes im empfangenen Bytestream?
Gibt es eine Ausnahme-Meldung?
Wird der Text vollständig in der RT-Box angezeigt?
Funktionieren Überladungen der "SaveFile"-Methode der Richtextbox?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Schreiben in Textdatei wird abgebrochen 
Autor: kurol
Datum: 21.07.17 14:09

Hallo Manfred,

vielen Dank für die schnelle Antwort. Da ich, wie gesagt, kein VB.NET-Spezialist bin, habe ich mal nach diversen Änderungen die komplette Routine beigefügt.

Mittlerweile ist der Stand so:
in die RTB werden zur Laufzeit nur ein paar Bytes eingetragen, ebenfalls in die abgespeichete Datei.
Vor dem Öffnen des Savefile-Dialogs kommt die Meldung 'Kameratarget.exe [mein Programm] hat einen Haltepunkt ausgelöst'. Gemeint ist ein VB-interner Haltepunkt, keine Ahnung wie ich den abschalten kann...
Die Save-Dialog wird richtig aufgerufen, der Dateiname richtig eingetragen. Wenn ich dann auf 'Speichern' klicke, steht plötzlich der gesamte abgerufene Text fehlerlos in der RTB, allerdings nicht in der abgespeicherten Datei.

Wenn ich den Teil zum speichern (ab if text_sent = "SE" )auskommentiere, wird der gesamte abgerufene Text sofort in der RTB angezeigt.

   ..
    Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As _
      System.IO.Ports.SerialDataReceivedEventArgs) Handles _
      SerialPort1.DataReceived
        ReceivedText(SerialPort1.ReadExisting())
    End Sub
 
 
 
    Private Sub ReceivedText(ByVal [text] As String)
        Dim DateTime As String = Now.ToString("dd-MM-yyyy HH_mm_ss")
        Dim docname As String = "Log.txt"
        Dim dt = DateTime                                 ' Datum und Zeit 
        ' ermitteln
 
        Dim answer As String
 
        If rtbreceived.InvokeRequired Then
            Dim x As New SetTextCallback(AddressOf ReceivedText)
            Invoke(x, New Object() {(text)})
        Else
            answer = [text]
            If text_sent <> "RST" Then                                      _
              ' gesendete Abfrage war <> RST
                Try
                    stopflag = True                                             _
                      ' weiteren Datenverkehr stoppen
 
                    rtbreceived.Text &= [text]                                  _
                       ' in Rich text box eintragen
 
                    rtbreceived.SelectionStart = rtbreceived.Text.Length        _
                      ' Autoscroll
                    rtbreceived.ScrollToCaret()
                    rtbreceived.Refresh()
 
                    If text_sent = "SE" Then                                    _
                      ' SE > Datei soll abgerufen und gespeichert werden
                        docname = docname & dt & ".txt"
                        SaveFileDialog1.FileName = docname
                        SaveFileDialog1.InitialDirectory = "d:\"
                        SaveFileDialog1.RestoreDirectory = True
                        SaveFileDialog1.Filter = "Text Files (*.txt*)|*.txt"
                        If SaveFileDialog1.ShowDialog = _
                          Windows.Forms.DialogResult.OK Then
                            My.Computer.FileSystem.WriteAllText( _
                            SaveFileDialog1.FileName, [text], True)    'oder
                            '       My.Computer.FileSystem.WriteAllText( 
                            ' SaveFileDialog1.FileName, rtbreceived.Text, True)
                        End If
                        text_sent = ""
                    End If
                Catch ex As Exception
                    '   MsgBox("Error")
                End Try
 
            End If
 
            text_sent = ""
            stopflag = False                            'Datenverkehr wieder 
            ' zulassen
        End If
 
        '        parse_answer(answer)                       'Auswertung _
          weiterer Befehle
 
 
    End Sub
Mir kommt es so vor, als wenn die Routine zum Speichern schon aufgerufen wird, bevor der gesamte Text übertragen wurde. Ich weiß aber nicht, wie ich das handeln muss. Vielleicht übersehe ich auch nur eine Kleinigkeit, ich programmiere halt zu 99,9% in C und nur selten in Visual Basic.

Falls Du einen Fehler oder eine Diskrepanz findest oder weitere Fragen hast, lasse es mich bitte wissen.

Freundlicher Gruß


Roland
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Schreiben in Textdatei wird abgebrochen 
Autor: sv00010
Datum: 21.07.17 18:49

kurol schrieb:



Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As _
      System.IO.Ports.SerialDataReceivedEventArgs) Handles _
      SerialPort1.DataReceived
        ReceivedText(SerialPort1.ReadExisting())
    End Sub
Dieser Code liest die Daten vom SerialPort ein, welche bis jetzt verfügbar sind.
Das bedeutet nicht, dass bereits alles gesendet wurde.
Du solltest eine Möglichkeit einbauen, um herauszufinden ob noch weitere Daten gesendet werden oder ob dies alle Daten waren.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel