Hallo Leute!
Ich bin neu im Forum und in VB. Ich arbeite derzeit an einem kleinen Projekt, bei dem ein Mikrocontroller (AVR) Messwerte an den PC senden soll. Es sind insgesamt 5 Byte die der Kontroller ununterbrochen an den Pc sendet. Das abfragen für ein Byte habe ich bereits in einem Testprogramm erfolgreich gelöst. Das war kein Problem. Doch jetzt möchte ich ein Programm schreiben, dass alle Bytes auswerten kann und das auch noch in einem Intervall von 0,1 Sekunden. Ich weis einfach nicht wie ich erkennen soll, wann die 5 Byte anfangen und wann sie enden. Ich habe bereits daran gedacht, einfach 6 Byte zu senden und am Anfang immer den binären Wert 83 (ASCII für S) zu verwenden. Ist das eine gute Methode? Hat jemand sowas schonmal gemacht und eventuell ein Beispielprogramm?
Ich habe bereits sehr viel zu dem Thema gelesen allerdings komme ich einfach nicht weiter...
Hier ist der Code den ich bereits fertig habe:
EDIT: Irgendwie geht die Formatierung immer verloren...
Ich bin neu im Forum und in VB. Ich arbeite derzeit an einem kleinen Projekt, bei dem ein Mikrocontroller (AVR) Messwerte an den PC senden soll. Es sind insgesamt 5 Byte die der Kontroller ununterbrochen an den Pc sendet. Das abfragen für ein Byte habe ich bereits in einem Testprogramm erfolgreich gelöst. Das war kein Problem. Doch jetzt möchte ich ein Programm schreiben, dass alle Bytes auswerten kann und das auch noch in einem Intervall von 0,1 Sekunden. Ich weis einfach nicht wie ich erkennen soll, wann die 5 Byte anfangen und wann sie enden. Ich habe bereits daran gedacht, einfach 6 Byte zu senden und am Anfang immer den binären Wert 83 (ASCII für S) zu verwenden. Ist das eine gute Methode? Hat jemand sowas schonmal gemacht und eventuell ein Beispielprogramm?
Ich habe bereits sehr viel zu dem Thema gelesen allerdings komme ich einfach nicht weiter...
Hier ist der Code den ich bereits fertig habe:
VB.NET-Quellcode
- 'Importierte Systemdateien und HelferklassenImports SystemImports System.IO.Ports
- 'LeistungsprüfstandklassePublic Class Leistungspruefstand
- 'Variablen deklarationen Dim takt As Integer = 0 'takt (Takt) als Integer Dim t As Double = 0 't (Zeit in Sekunden) als Double Dim index As Integer = 0 Dim mw(50000) As Integer 'mw (Messwerte) als array
- 'Einstellungsvariablen Dim autoStop As Integer 'autoStop (automatisches Anhalten in s) Dim cPortName As String 'cPortName (Com Port Name) Dim cPortBaudRate As Integer 'cPortBaudRate (Com Port Baudrate) Dim r As Double 'r (Radius in m) Dim l As Double 'l (Länge in m) Dim dichte As Double 'dichte (Dichte in kg/m³) Dim traegheit As Double 'traegheit (Trägheit in kg/m²)
- 'Sobald das Formular geladen wird Private Sub Leistungspruefstand_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'Funktion zur Ermittlung der ComPorts aufrufen comPortsErmitteln() 'Funktion zum Setzen der Standartwerte stdWerteSetzen() End Sub
- 'Anzeigen aller verfügbaren ComPorts Private Sub comPortsErmitteln() 'Schleife durch alle verfügbaren ComPorst For Each sp As String In My.Computer.Ports.SerialPortNames 'Wenn ein ComPort gefunden wurde, zur Liste hinzufügen ComPortBox.Items.Add(sp) Next End Sub
- 'Standartwerte eintragen Private Sub stdWerteSetzen() 'Automatisch stoppen auf 10s setzen autoStop = 10 txtMessdauer.Text = autoStop 'Den ersten verfügbaren ComPort in der ComPortListe auswählen ComPortBox.SelectedIndex = 2 cPortName = ComPortBox.Text 'Die dritte BaudRate (9600) auswählen BaudRateBox.SelectedIndex = 2 cPortBaudRate = BaudRateBox.Text 'Den Radius auf 0,125m setzen r = 0.149 txtRadius.Text = r 'Die Länge auf 0,3m setzen l = 0.3 txtLaenge.Text = l 'Die Dichte auf 7850(Stahl) setzen dichte = 7850 txtDichte.Text = dichte 'Die Trägheit berechnen traegheit = traegheitBerechnen(r, l, dichte) txtTraegheit.Text = traegheit 'Graphen typ auf Linie setzen Chart1.Series(0).ChartType = DataVisualization.Charting.SeriesChartType.FastLine
- End Sub
- 'Wenn der Button zur Speicherung der Einstellungswerte gedrückt wird Private Sub neueWerte_CLick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles neueWerte.Click 'Funktion zum Setzen der neuen Werte neueWerteSetzen() End Sub
- 'Neue Werte setzen Private Sub neueWerteSetzen() 'ComPort und Baudrate in die Einstellungsvariablen schreiben cPortName = ComPortBox.Text cPortBaudRate = BaudRateBox.Text 'Radius, Länge, Dichte und Trägheit in die Einstellungsvariablen schreiben r = txtRadius.Text l = txtLaenge.Text dichte = txtDichte.Text 'Trägheit berechnen und anzeigen traegheit = traegheitBerechnen(r, l, dichte) txtTraegheit.Text = traegheit End Sub
- 'Funktion zum Berechnen der Trägheit Private Function traegheitBerechnen(ByVal r As Double, ByVal l As Double, ByVal dichte As Double) Dim traegheit As Double 'Formel zur Berechnung der Trägheit traegheit = ((Math.PI * r ^ 2 * l * dichte) * r ^ 2) / 2 'Trägheit zurückgeben Return traegheit End Function
- 'Wenn der Start Button geklickt wird Private Sub btnStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStart.Click 'Reset alle Werte messungReset() 'Start Button deaktiviereun und Stop Button aktivieren btnStart.Enabled = False checkAutostop.Enabled = False txtMessdauer.Enabled = False btnStop.Enabled = True 'ComPort einstellen With cPort .PortName = cPortName .BaudRate = cPortBaudRate .Parity = IO.Ports.Parity.None .ReadBufferSize = 1024 .ReadTimeout = 1000 .ReceivedBytesThreshold = 1 .DataBits = 8 .StopBits = IO.Ports.StopBits.One End With If cPort.IsOpen Then cPort.Close() End If cPort.Open() 'Wenn die Checkbox Autostop ausgewählt wurde If checkAutostop.Checked Then fortschritt.Maximum = txtMessdauer.Text * 10 End If 'Messung starten Timer.Start() End Sub
- 'Wenn der Stop Button geklickt wird Private Sub btnStop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStop.Click messungStoppen() End Sub
- 'Subrutine zum Stoppen der Messung Private Sub messungStoppen() Timer.Stop() MsgBox("Messung gestoppt! Sie können die Ergebnisse nun speichern.") 'Start Button aktiviereun und Stop Button deaktivieren btnStart.Enabled = True checkAutostop.Enabled = True txtMessdauer.Enabled = True btnStop.Enabled = False cPort.Close() End Sub
- 'Subrutine zum Resetten der Messung Private Sub messungReset() fortschritt.Value = 0 takt = 0 t = 0 index = 0 Chart1.Series(0).Points.Clear() DataGridView1.Rows.Clear() End Sub
- '======================================================================================================================
- Private Sub Timer_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer.Tick If checkAutostop.Checked Then If takt = fortschritt.Maximum Then messungStoppen() Else takt += 1 t += 1 fortschritt.Value += 1 End If Else takt += 1 t += 1 End If Counter.Text = t / 10 End Sub
- Public Sub mwVerarbeiten(ByVal takt As Integer, ByVal messwert As Integer) If index = takt Then 'ListBox1.Items.Add("Takt: " & takt & " Messwert: " & messwert) 'ListBox1.SelectedIndex = takt Dim dgvRow As New DataGridViewRow Dim dgvCell As DataGridViewCell 'Setze WErt für Spalte takt dgvCell = New DataGridViewTextBoxCell() dgvCell.Value = takt dgvRow.Cells.Add(dgvCell) 'Setze WErt für Spalte Zeit dgvCell = New DataGridViewTextBoxCell() dgvCell.Value = takt / 10 dgvRow.Cells.Add(dgvCell) 'Setze WErt für Spalte Messergebnis dgvCell = New DataGridViewTextBoxCell() dgvCell.Value = messwert dgvRow.Cells.Add(dgvCell) 'Zeile hinzufügen DataGridView1.Rows.Add(dgvRow) 'Letzte Zeile anzeigen DataGridView1.FirstDisplayedScrollingRowIndex = DataGridView1.RowCount - 1 'Neuen Punkt im Graphen setzen Chart1.Series(0).Points.AddXY(takt, messwert) End If End Sub
- Private Sub cPort_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles cPort.DataReceived If cPort.IsOpen Then Dim buffer(4) As Byte 'Deklariere Buffer Variable cPort.Read(buffer, 0, 1) 'Speichere die ankommenden Daten in den Buffer Dim count As Integer = buffer(0) 'Deklariere die Variable count und setze ihren wert gleich dem Wert im Buffer
- If index = takt Then Me.Invoke(Sub() mwVerarbeiten(takt, count) End Sub) index += 1 End If End If
- End Sub
- End Class
EDIT: Irgendwie geht die Formatierung immer verloren...