Hallo Liebe Forumsgemeinde oder Forengemeinde?!
ich hab folgendes Problem:
Ich möchte über die Schnittstelle eines Mitutoyo Messschiebers dessen aktuellen Messwert auslesen. Der Messschieber sendet ein Byte (wenn ich mich nicht Irre) bei Tastendruck an die serielle Schnittstelle.
Dafür nutze ich folgenden Codeansatz:
Das Funktioniert soweit auch hervorragend. Bei jedem Tastendruck wird eine neue Zeile in die Richtextbox geschrieben. Ich möchte allerdings am Ende die Daten in einem Datagridview haben. Das habe ich mit versucht umzusetzen, allerdings verteilt sich dann der String manchmal nur auf eine neue Zelle, manchmal aber auch auf mehrere (siehe Beigefügtes Bild). Deweiteren möchte ich gerne dieses unnötige 01A an Anfang entfernt haben. Wenn ich das mit [text].remove(0,3) versuche, schneidet er aber auch relativ willkürlich.
Für Hilfreiche Tipps wäre ich sehr Dankbar.
Beste Grüße,
Florian Rave
ich hab folgendes Problem:
Ich möchte über die Schnittstelle eines Mitutoyo Messschiebers dessen aktuellen Messwert auslesen. Der Messschieber sendet ein Byte (wenn ich mich nicht Irre) bei Tastendruck an die serielle Schnittstelle.
Dafür nutze ich folgenden Codeansatz:
VB.NET-Quellcode
- 'Serial Port Interfacing with VB.net 2010 Express Edition
- 'Copyright (C) 2010 Richard Myrick T. Arellaga
- '
- 'This program is free software: you can redistribute it and/or modify
- 'it under the terms of the GNU General Public License as published by
- 'the Free Software Foundation, either version 3 of the License, or
- '(at your option) any later version.
- '
- 'This program is distributed in the hope that it will be useful,
- 'but WITHOUT ANY WARRANTY; without even the implied warranty of
- 'MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- 'GNU General Public License for more details.
- '
- ' You should have received a copy of the GNU General Public License
- ' along with this program. If not, see <http://www.gnu.org/licenses/>.
- Option Strict Off
- Imports System
- Imports System.ComponentModel
- Imports System.Threading
- Imports System.IO.Ports
- Public Class frmMain
- Dim myPort As Array 'COM Ports detected on the system will be stored here
- Delegate Sub SetTextCallback(ByVal [text] As String) 'Added to prevent threading errors during receiveing of data
- Dim PufferString As String
- Private Delegate Sub DelegateSub() 'Private Datenanzeigen As New DelegateSub(AddressOf Anzeigen)
- Dim input As String
- Private Sub frmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
- 'When our form loads, auto detect all serial ports in the system and populate the cmbPort Combo box.
- myPort = IO.Ports.SerialPort.GetPortNames() 'Get all com ports available
- cmbBaud.Items.Add(9600) 'Populate the cmbBaud Combo box to common baud rates used
- cmbBaud.Items.Add(19200)
- cmbBaud.Items.Add(38400)
- cmbBaud.Items.Add(57600)
- cmbBaud.Items.Add(115200)
- For i = 0 To UBound(myPort)
- cmbPort.Items.Add(myPort(i))
- Next
- cmbPort.Text = CStr(cmbPort.Items.Item(0)) 'Set cmbPort text to the first COM port detected
- cmbBaud.Text = CStr(cmbBaud.Items.Item(0)) 'Set cmbBaud text to the first Baud rate on the list
- btnDisconnect.Enabled = False 'Initially Disconnect Button is Disabled
- End Sub
- Private Sub btnConnect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnConnect.Click
- SerialPort1.PortName = cmbPort.Text 'Set SerialPort1 to the selected COM port at startup
- SerialPort1.BaudRate = CInt(cmbBaud.Text) 'Set Baud rate to the selected value on
- 'Other Serial Port Property
- SerialPort1.Parity = IO.Ports.Parity.None
- SerialPort1.StopBits = IO.Ports.StopBits.One
- SerialPort1.DataBits = 8 'Open our serial port
- SerialPort1.Open()
- btnConnect.Enabled = False 'Disable Connect button
- btnDisconnect.Enabled = True 'and Enable Disconnect button
- End Sub
- Private Sub btnDisconnect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDisconnect.Click
- SerialPort1.Close() 'Close our Serial Port
- btnConnect.Enabled = True
- btnDisconnect.Enabled = False
- End Sub
- Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
- 'MsgBox(SerialPort1.ReadExisting())
- ReceivedText(SerialPort1.ReadExisting()) 'Automatically called every time a data is received at the serialPort
- End Sub
- Private Sub ReceivedText(ByVal [text] As String)
- 'compares the ID of the creating Thread to the ID of the calling Thread
- If Me.rtbReceived.InvokeRequired Then
- Dim x As New SetTextCallback(AddressOf ReceivedText)
- Me.Invoke(x, New Object() {(text)})
- Else
- Me.rtbReceived.Text &= [text]
- DataGridView1.Rows.Add([text])
- End If
- End Sub
- Private Sub cmbPort_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbPort.SelectedIndexChanged
- If SerialPort1.IsOpen = False Then
- SerialPort1.PortName = cmbPort.Text 'pop a message box to user if he is changing ports
- Else 'without disconnecting first.
- MsgBox("Valid only if port is Closed", vbCritical)
- End If
- End Sub
- Private Sub cmbBaud_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbBaud.SelectedIndexChanged
- If SerialPort1.IsOpen = False Then
- SerialPort1.BaudRate = CInt(cmbBaud.Text) 'pop a message box to user if he is changing baud rate
- Else 'without disconnecting first.
- MsgBox("Valid only if port is Closed", vbCritical)
- End If
- End Sub
- Private Sub DataGridView1_CellContentClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick
- End Sub
- End Class
Das Funktioniert soweit auch hervorragend. Bei jedem Tastendruck wird eine neue Zeile in die Richtextbox geschrieben. Ich möchte allerdings am Ende die Daten in einem Datagridview haben. Das habe ich mit versucht umzusetzen, allerdings verteilt sich dann der String manchmal nur auf eine neue Zelle, manchmal aber auch auf mehrere (siehe Beigefügtes Bild). Deweiteren möchte ich gerne dieses unnötige 01A an Anfang entfernt haben. Wenn ich das mit [text].remove(0,3) versuche, schneidet er aber auch relativ willkürlich.
Für Hilfreiche Tipps wäre ich sehr Dankbar.
Beste Grüße,
Florian Rave