Hallo allerseits,
schon lange war ich nicht mehr hier
Ich habe ein Problem mit einer RS232 Schnittstelle. Ich lese Daten von einem µC. Dieser sendet die Daten ununterbrochen. Ich habe mir irgendwo aus dem Internet (vbArchiv oder wo auch immer) Code geholt, der auch prima "lesen kann".
Mein Problem ist jetzt: Wenn ich versuche den Port zu schleißen, friert das ganze Programm ein.
Ich weiß nicht genau woran es liegt aber ich denke dass es wegen den immer weiter kommenden Daten ist, die wiederum den Event DataReceived aufrufen und so den Prozess nicht gescheit sterben lassen. Ich habe es schon versucht in Threads aufzuteilen. Wenn ich dann den Thread geschlossen habe - fror das Programm wieder ein. Wenn ich den Thread ohne den Port zu schließen tötete - ging alles einwandfrei - ich konnte allerdings den Port nicht nocheinmal öffnen da er noch quasi geöffnet ist.
Ich hoffe ihr könnt mich unterweisen was meinen Fehler angeht. Vielen Dank!
schon lange war ich nicht mehr hier
Ich habe ein Problem mit einer RS232 Schnittstelle. Ich lese Daten von einem µC. Dieser sendet die Daten ununterbrochen. Ich habe mir irgendwo aus dem Internet (vbArchiv oder wo auch immer) Code geholt, der auch prima "lesen kann".
VB.NET-Quellcode
- Imports System.Text
- Public Class Form1
- #Region "Variablen und API's"
- ' Variable die das decodierte Byte aufnimmt
- Dim Programm As String
- 'Damit der eingehende Wert an die txtprogramm Textbox übergenben werden
- ' kann! Führt die Sub Wertübergabe aus!
- Private Delegate Sub DelegateSub()
- Private TextboxAktualisieren As New DelegateSub(AddressOf Wertübergabe)
- #End Region
- #Region "Form"
- Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
- closePort()
- End Sub
- Private Sub closePort()
- Try
- If SerialPort1.IsOpen Then
- SerialPort1.Close()
- End If
- Catch ex As Exception
- End Try
- End Sub
- Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
- Me.txtprogramm.Visible = False
- Me.cmd_portclose.Enabled = False
- Me.Text = "CAN-Gateway"
- Me.Top = Screen.PrimaryScreen.WorkingArea.Height / 2 - Me.Height / 2
- Me.Left = Screen.PrimaryScreen.WorkingArea.Width / 2 - Me.Width / 2
- ' Show all available COM ports.
- For Each sp As String In My.Computer.Ports.SerialPortNames
- ListBox1.Items.Add(sp)
- Next
- If Me.ListBox1.Items.Count > 0 Then
- Me.ListBox1.SelectedIndex = 0
- End If
- ' Serialport Daten (Für Feeler Fanuc Series 0-T: Baudrate 4800 ;
- ' StopBits One ; DataBits 7 ; Parity None ; Handshake None)
- 'SerialPort1.BaudRate = 115200
- 'SerialPort1.StopBits = IO.Ports.StopBits.One
- 'SerialPort1.DataBits = 8
- 'SerialPort1.Parity = IO.Ports.Parity.None
- 'SerialPort1.Handshake = IO.Ports.Handshake.None
- End Sub
- #End Region
- #Region "Datentransfer"
- Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As _
- System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
- For i As Int32 = 0 To SerialPort1.BytesToRead ' Alle Bytes einzel
- ' lesen und anzeigen
- Try
- Dim buf As Byte() = {SerialPort1.BaseStream.ReadByte}
- Dim enc As New System.Text.ASCIIEncoding()
- Programm = enc.GetString(buf)
- Programm = Programm.Replace(Chr(13), Nothing)
- Me.Invoke(TextboxAktualisieren)
- Catch ex As Exception
- MessageBox.Show("Ein Übertragungsfehler ist aufgetreten.", _
- "Fehler", MessageBoxButtons.OK)
- End Try
- Next i
- End Sub
- Private Sub Wertübergabe()
- ' ## Daten in Textbox übertragen
- txtprogramm.AppendText(Programm)
- End Sub
- #End Region
- Private Sub cmd_end_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmd_end.Click
- closePort()
- End
- End Sub
- Private Sub cmd_portclose_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmd_portclose.Click
- closePort()
- Me.txtprogramm.Visible = False
- Me.cmd_portclose.Enabled = False
- Me.ListBox1.Visible = True
- Me.cmd_portopen.Enabled = True
- End Sub
- Private Sub cmd_portopen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmd_portopen.Click
- With SerialPort1
- .BaudRate = 115200
- .Parity = IO.Ports.Parity.None
- .Handshake = IO.Ports.Handshake.None
- .DataBits = 8
- .StopBits = IO.Ports.StopBits.One
- .PortName = Me.ListBox1.SelectedItem
- End With
- If Not SerialPort1.IsOpen Then
- Try
- SerialPort1.Open()
- Me.cmd_portopen.Enabled = False
- Me.ListBox1.Visible = False
- Me.txtprogramm.Visible = True
- Me.Label1.Visible = False
- Me.cmd_portclose.Enabled = True
- Catch
- MsgBox("Fehler beim öffnen des Ports. Eventuell kein Gerät angeschlossen!")
- End Try
- Else
- MsgBox("Dieser Port wird bereits verwendet")
- End If
- End Sub
- End Class
Mein Problem ist jetzt: Wenn ich versuche den Port zu schleißen, friert das ganze Programm ein.
Ich weiß nicht genau woran es liegt aber ich denke dass es wegen den immer weiter kommenden Daten ist, die wiederum den Event DataReceived aufrufen und so den Prozess nicht gescheit sterben lassen. Ich habe es schon versucht in Threads aufzuteilen. Wenn ich dann den Thread geschlossen habe - fror das Programm wieder ein. Wenn ich den Thread ohne den Port zu schließen tötete - ging alles einwandfrei - ich konnte allerdings den Port nicht nocheinmal öffnen da er noch quasi geöffnet ist.
Ich hoffe ihr könnt mich unterweisen was meinen Fehler angeht. Vielen Dank!