Hallo,
ich habe eine Sub, die jedes mal aufgerufen wird wenn über die Serielle Schnittstelle Daten reinkommen.
Dort starte ich ein Timer. Jedoch wird der Timer nicht gestartet und es passiert nicht das was ich möchte.
Spoiler anzeigen
(Vollständigkeitshalber habe ich den ganzen Code drauf)
Es geht um die Sub DataReceivedHandler (Zeile 311) und um die Sub _Enter (Zeile 204).
Wenn ich die Buttons benutze, funktioniert es einwandfrei, halt per SerialPort wills nicht. Es kommen keine Fehler, nix. Aber der Timer reagiert nicht, wenn dieser über die Sub _Enter von der Sub DataReceivedHandler 'gestartet' wird.
Kennt jemand die Lösung bitte?
mfg
gfc
ich habe eine Sub, die jedes mal aufgerufen wird wenn über die Serielle Schnittstelle Daten reinkommen.
Dort starte ich ein Timer. Jedoch wird der Timer nicht gestartet und es passiert nicht das was ich möchte.
VB.NET-Quellcode
- Imports System.Drawing.Drawing2D
- Imports System.IO.Ports
- Imports System ' BitConverter-Klasse
- Imports System.Collections ' BitArray-Klasse
- Imports System.Runtime.CompilerServices ' Extension-Attribut
- Imports System.Net.NetworkInformation
- Public Class Form1
- Dim i As Integer
- Dim y As Integer
- Dim pen1 As New System.Drawing.Pen(Color.Black, 1)
- Dim fnt As Font = New Font("Courier New", 8)
- Dim DIGIT As Font = New Font("Quartz MS", 20)
- Dim _sp As New SerialPort()
- Public COMPORT As String
- Public Baudrate As Integer
- Dim bmp As New Bitmap(128, 64, Imaging.PixelFormat.Format24bppRgb)
- Dim g As System.Drawing.Graphics
- Dim cdrive As System.IO.DriveInfo
- Dim length As Integer = 65
- Dim spos As Integer = 28
- Dim NUM As Integer = 0
- Dim selected As Integer = 1
- Function MENU(ByVal Control As PictureBox, ByVal num As Integer)
- ' Grafikbereich bereitstellen
- g = Graphics.FromImage(bmp)
- ' Textrenderer herunterschrauben (Keine Graustufen)
- g.TextRenderingHint = Drawing.Text.TextRenderingHint.SingleBitPerPixelGridFit
- ' Grafikbereich löschen (mit "Weiss" übermalen)
- Dim clearall As New Rectangle(0, 0, 128, 64)
- Dim clearallbrush As New LinearGradientBrush(clearall, Color.White, Color.White, LinearGradientMode.Horizontal)
- g.FillRectangle(clearallbrush, clearall)
- ' Menü-Bereich Zeichnen
- Dim menubl As New Rectangle(0, 0, 128, 14)
- Dim menublbrush As New LinearGradientBrush(menubl, Color.Black, Color.Black, LinearGradientMode.Horizontal)
- g.FillRectangle(menublbrush, menubl)
- g.DrawString("MENU", fnt, Brushes.White, 50, 0)
- ' Verfügbare Funktionen anzeigen
- g.DrawString("PC-INFO", fnt, Brushes.Black, 40, 15)
- g.DrawString("DIGI-CLOCK", fnt, Brushes.Black, 30, 30)
- ' "Ausgewählt"-Feld anzeigen
- g.DrawString("->", fnt, Brushes.Black, 5, (15 * num))
- g.DrawRectangle(pen1, 0, 15 * num, 127, 14)
- 'Grafik "konvertieren" und senden
- BitmapToBLCD(bmp)
- Return bmp
- End Function
- Function Digital_Clock(ByVal Control As PictureBox)
- ' Grafikbereich bereitstellen
- g = Graphics.FromImage(bmp)
- ' Textrenderer herunterschrauben (Keine Graustufen)
- g.TextRenderingHint = Drawing.Text.TextRenderingHint.SingleBitPerPixelGridFit
- ' Grafikbereich löschen (mit "Weiss" übermalen)
- Dim clearall As New Rectangle(0, 0, 128, 64)
- Dim clearallbrush As New LinearGradientBrush(clearall, Color.White, Color.White, LinearGradientMode.Horizontal)
- g.FillRectangle(clearallbrush, clearall)
- ' Ein "Weisses Rechteck" definieren
- Dim cleararea As New Rectangle(1, 29, 126, 34)
- Dim _cleararea As New LinearGradientBrush(cleararea, Color.White, Color.White, LinearGradientMode.Horizontal)
- ' Ein "Schwarzes Rechteck" definieren
- Dim filled As New Rectangle(0, 28, 128, 36)
- Dim _filled As New LinearGradientBrush(filled, Color.Black, Color.Black, LinearGradientMode.Horizontal)
- ' Datum usw auslesen
- Dim Jahr As Integer = Date.Now.Year
- Dim _Monat As Integer = Date.Now.Month
- Dim _Tag As Integer = Date.Now.DayOfWeek
- ' Monats-Tabelle
- Dim Monat_Liste() As String = {"Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"}
- ' Tag-Tabelle
- Dim Tag_Liste() As String = {"Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag"}
- ' Tag in der Tabelle auslesen und in einer Variable abspeichern
- Dim Monat As String = Monat_Liste(_Monat - 1)
- Dim Tag As String = Tag_Liste(_Tag - 1)
- ' Schwarzer Rand zeichnen
- g.FillRectangle(_filled, filled)
- g.FillRectangle(_cleararea, cleararea)
- 'Datum und Uhr zeichnen
- g.DrawString(Tag & ", den " & Date.Now.Day.ToString & ".", fnt, Brushes.Black, 1, 1)
- g.DrawString(Monat & " " & Jahr.ToString, fnt, Brushes.Black, 1, 12)
- g.DrawString(Date.Now.ToString("HH:mm:ss"), DIGIT, Brushes.Black, 1, 27)
- 'Grafik "konvertieren" und senden
- BitmapToBLCD(bmp)
- Return bmp
- End Function
- Function PCInfo(ByVal Control As PictureBox)
- ' Zeilen definieren
- Dim zeile1 As Integer = 4
- Dim zeile2 As Integer = 16
- Dim zeile3 As Integer = 28
- Dim zeile4 As Integer = 40
- ' Grafikbereich bereitstellen
- g = Graphics.FromImage(bmp)
- ' Textrenderer herunterschrauben (Keine Graustufen)
- g.TextRenderingHint = Drawing.Text.TextRenderingHint.SingleBitPerPixelGridFit
- ' Grafikbereich löschen (mit "Weiss" übermalen)
- Dim clearall As New Rectangle(0, 0, 128, 64)
- Dim clearallbrush As New LinearGradientBrush(clearall, Color.White, Color.White, LinearGradientMode.Horizontal)
- g.FillRectangle(clearallbrush, clearall)
- ' Kategorieren und Leere Ladebalken zeichen
- g.DrawString("CPU", fnt, Brushes.Black, 0, zeile1 - 1)
- g.DrawRectangle(pen1, spos, zeile1, length, 10)
- g.DrawString("RAM", fnt, Brushes.Black, 0, zeile2 - 1)
- g.DrawRectangle(pen1, spos, zeile2, length, 10)
- g.DrawString("DSK", fnt, Brushes.Black, 0, zeile3 - 1)
- g.DrawRectangle(pen1, spos, zeile3, length, 10)
- g.DrawString("NET", fnt, Brushes.Black, 0, zeile4 - 1)
- ' -CPU-
- ' CPU-Infos auslesen
- i = PerformanceCounter1.NextValue
- y = (length * i) / 100
- If y = 0 Then y = 1
- Dim rect As New Rectangle(spos, zeile1, y, 10)
- g.DrawString(i.ToString + "%", fnt, Brushes.Black, 95, zeile1 - 1)
- Dim gradientBrush As New LinearGradientBrush(rect, Color.Black, Color.Black, LinearGradientMode.Horizontal)
- g.FillRectangle(gradientBrush, rect)
- ' -RAM-
- ' RAM-Infos auslesen
- i = PerformanceCounter2.NextValue
- y = (length * i) / 100
- If y = 0 Then y = 1
- rect = New Rectangle(spos, zeile2, y, 10)
- g.DrawString(i.ToString + "%", fnt, Brushes.Black, 95, zeile2 - 1)
- gradientBrush = New LinearGradientBrush(rect, Color.Black, Color.Black, LinearGradientMode.Horizontal)
- g.FillRectangle(gradientBrush, rect)
- ' -DISK C:\-
- ' DSK-Infos auslesen
- cdrive = My.Computer.FileSystem.GetDriveInfo("C:\")
- i = (100 * (cdrive.TotalSize - cdrive.AvailableFreeSpace) / cdrive.TotalSize)
- y = (length * i) / 100
- If y = 0 Then y = 1
- rect = New Rectangle(spos, zeile3, y, 10)
- g.DrawString(i.ToString + "%", fnt, Brushes.Black, 95, zeile3 - 1)
- gradientBrush = New LinearGradientBrush(rect, Color.Black, Color.Black, LinearGradientMode.Horizontal)
- g.FillRectangle(gradientBrush, rect)
- 'Netzwerk Up- & Download lesen
- Dim up As Integer = Math.Round(PerformanceCounter3.NextValue / 1024)
- Dim dn As Integer = Math.Round(PerformanceCounter4.NextValue / 1024)
- Dim speed As String = " kB/s"
- 'Überprüfung, ob die Variable "Zu gross" ist und entsprechend umrechnen...
- If up > 9999 Then
- up = Math.Round(up / 1024)
- speed = " MB/s"
- End If
- If dn > 9999 Then
- dn = Math.Round(dn / 1024)
- speed = " MB/s"
- End If
- g.DrawString("UP " + up.ToString + speed, fnt, Brushes.Black, 25, zeile4 - 1)
- g.DrawString("DN " + dn.ToString + speed, fnt, Brushes.Black, 25, zeile4 + 9)
- 'Grafik "konvertieren" und senden
- BitmapToBLCD(bmp)
- Return bmp
- End Function
- Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
- If NUM = 1 Then PictureBox1.Image = PCInfo(PictureBox1)
- If NUM = 2 Then PictureBox1.Image = Digital_Clock(PictureBox1)
- End Sub
- Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
- Call _UP()
- End Sub
- Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
- Call _Enter()
- End Sub
- Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
- Call DOWN()
- End Sub
- Public Sub _UP()
- If NUM = 0 Then
- ' Menü "Hoch"
- If selected = 1 Then Exit Sub
- selected = selected - 1
- Debug.Print(selected.ToString)
- PictureBox1.Image = MENU(PictureBox1, selected)
- ElseIf NUM = 2 Then
- 'Analog- /Digitaluhr switcher
- End If
- End Sub
- Public Sub _Enter()
- If NUM = 0 Then
- ' Im Menü die "LCD-App" öffnen & anzeigen
- NUM = selected
- Timer1.Start()
- Else
- ' Timer stoppen und zum Menü zurückkehren
- Timer1.Stop()
- NUM = 0
- PictureBox1.Image = MENU(PictureBox1, selected)
- End If
- End Sub
- Public Sub DOWN()
- If NUM = 0 Then
- ' Menü "Runter"
- If selected = 2 Then Exit Sub
- selected = selected + 1
- Debug.Print(selected.ToString)
- PictureBox1.Image = MENU(PictureBox1, selected)
- ElseIf NUM = 2 Then
- 'Analog- /Digitaluhr switcher
- End If
- End Sub
- Public Sub BitmapToBLCD(ByVal _bmp As Bitmap)
- ' Bitmap-Konvertierer
- ' Konvertiert ein 128x64 Bitmap in das richtige
- ' Format für das LCD-Display um.
- Dim x As Integer = 0
- Dim y As Integer = 0
- Dim page As Integer = 0
- Dim result As Integer = 0
- Dim col As Color
- Dim r, g, b, gem As Integer
- _sp.Write("S")
- Do While (Not page = 8)
- ' Pixel einlesen
- col = _bmp.GetPixel(x, y + (8 * page))
- ' Pixel in die Grundfarben aufteilen
- r = col.R
- g = col.G
- b = col.B
- ' Diese Zusammenrechnen und Teilen
- gem = (r + g + b) / 3
- ' Vergleichen, ob das Pixel "Hell" oder "dunkel" ist
- If Not gem > 128 Then result = result + (2 ^ y) 'Schwarz
- y += 1
- If y = 8 Then
- x += 1
- y = 0
- 'Hier wird die Sache gesendet
- Dim tbyte As Byte() = BitConverter.GetBytes(result)
- _sp.Write(tbyte, 0, 1)
- 'result clearen
- result = 0
- End If
- ' Überprüfen, ob die aktuelle Page voll ist (Zeilenende)
- If x = 128 Then
- page += 1
- x = 0
- End If
- Loop
- X:
- End Sub
- Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
- ' SerialPort schliessen
- _sp.Close()
- End Sub
- Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
- ' Setup-Form Anzeigen
- Me.Hide()
- Form2.ShowDialog()
- ' Zeichnungsbereich beschreiben
- Dim xyz As Boolean = True
- Dim xc As Integer = 0
- Dim yc As Integer = 0
- While (xyz)
- bmp.SetPixel(xc, yc, Color.White)
- xc += 1
- If xc = 128 Then
- xc = 0
- yc += 1
- End If
- If yc = 64 Then
- xyz = False
- End If
- End While
- ' SerialPort-Setup
- _sp.PortName = COMPORT
- _sp.BaudRate = Baudrate
- _sp.Parity = Parity.None
- _sp.DataBits = 8
- _sp.StopBits = StopBits.One
- _sp.Handshake = Handshake.XOnXOff
- _sp.Open()
- ' "Interrupt" für SerialPort_DataReceived
- AddHandler _sp.DataReceived, AddressOf DataReceivedHandler
- PictureBox1.Image = bmp
- PictureBox1.Image = MENU(PictureBox1, selected)
- End Sub
- Private Sub DataReceivedHandler(sender As Object, e As SerialDataReceivedEventArgs)
- Dim sp As SerialPort = CType(sender, SerialPort)
- 'Daten lesen
- Dim indata As String = sp.ReadExisting()
- Debug.Print(indata.ToString() + "-" + indata.Length.ToString)
- ' Empfangene Daten durchgehen
- Select Case indata.ToLower.Trim
- Case "`"
- Call _UP()
- Exit Sub
- Case "b"
- Call _Enter()
- Exit Sub
- Case "d"
- Call DOWN()
- Exit Sub
- End Select
- End Sub
- Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
- Call BitmapToBLCD(bmp)
- End Sub
- End Class
(Vollständigkeitshalber habe ich den ganzen Code drauf)
Es geht um die Sub DataReceivedHandler (Zeile 311) und um die Sub _Enter (Zeile 204).
Wenn ich die Buttons benutze, funktioniert es einwandfrei, halt per SerialPort wills nicht. Es kommen keine Fehler, nix. Aber der Timer reagiert nicht, wenn dieser über die Sub _Enter von der Sub DataReceivedHandler 'gestartet' wird.
Kennt jemand die Lösung bitte?
mfg
gfc