Option Strict On Imports System.Windows.Forms Public Class Class1 'timer simulant un thread Dim WithEvents tmr As New Timers.Timer(5000) 'délégué avec signature du timer Public Delegate Sub tmr_ElapsedDelegate(ByVal sender As Object, ByVal e As Timers.ElapsedEventArgs) 'événement Public Event PoidsReceived(ByVal sender As Object, ByVal e As PoidsReceivedEventArgs) 'on mémorise ici le formulaire (ou autre d'ailleurs) Dim _control As Control 'on fait passer le formulaire (ou autre) dans le constructeur de la classe Sub New(ByVal controle As Control) _control = controle 'on démarre le timer (thread) tmr.Start() End Sub Private Sub tmr_Elapsed(ByVal sender As Object, ByVal e As System.Timers.ElapsedEventArgs) Handles tmr.Elapsed 'si invoke est requis... If _control.InvokeRequired Then 'on invoque le délégué (qui exécutera cette même sub) en lui passant les paramètres sender et e _control.Invoke(New tmr_ElapsedDelegate(AddressOf tmr_Elapsed), sender, e) Else 'on déclenche l'événement qui est maintenant thread safe RaiseEvent PoidsReceived(Me, New PoidsReceivedEventArgs(50)) End If End Sub 'argument d'événement Public Class PoidsReceivedEventArgs Inherits EventArgs Private _poids As Decimal Public Property Poids() As Decimal Get Return _poids End Get Set(ByVal value As Decimal) _poids = value End Set End Property Public Sub New(ByVal poids As Decimal) _poids = poids End Sub End Class End Class
Option Strict On 'import de la dll (faire en plus une référence à la dll dans les propriétés du projet) Imports ClassLibrary1 Public Class Form1 'déclaration de la dll avec ses événements Dim WithEvents maclasse As ClassLibrary1.Class1 'déclaration d'un label à intégrer au form Dim lblPoids As New Label With {.Parent = Me} Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'instance de la dll en lui passant le formulaire maclasse = New ClassLibrary1.Class1(Me) End Sub 'événement PoidsReceived Private Sub maclasse_PoidsReceived(ByVal sender As Object, ByVal e As ClassLibrary1.Class1.PoidsReceivedEventArgs) Handles maclasse.PoidsReceived lblPoids.Text = e.Poids.ToString End Sub End Class
Me reste plus qu'a trouver une solution au cas : Aucune donnée n'est retourné. Je pense qu'un timer dans la winform devrait suffir pour ce point.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionPrivate _display As Control
New Object() {(Text)}Text simplement suffirait.
Dim MonLabel as new Label() with {.parent = me}
Dim MonLabel as new Label() Me.controls.add(monlabel)
Private Sub btnPeser_Click(sender As System.Object, e As System.EventArgs) Handles btnPesAvecColle1.Click, btnPesAvecColle2.Click, btnPesSSColle1.Click, btnPesSSColle2.Click Dim btn As Button = sender Dim lbl As Label = Nothing Dim affiche As Boolean = False Dim poidsText As String = "" Dim err As Boolean = False Select Case btn.Name Case "btnPesSSColle1" lbl = tbPoidsSSColle1 Case "btnPesSSColle2" lbl = tbPoidsSSColle2 Case "btnPesAvecColle1" lbl = tbPoidsAvecColle1 Case "btnPesAvecColle2" lbl = tbPoidsAvecColle2 End Select AddHandler lbl.TextChanged, AddressOf tbPoids_TextChanged Try btn.Enabled = False bal.Display = lbl bal.Peser() Catch ex As Exception err = True End Try ' code de vérification qui n'influ pas derrière ... End Sub
Public Sub NawCom() comPort = New SerialPort comPort.PortName = "COM1" comPort.Parity = IO.Ports.Parity.None comPort.BaudRate = 9600 comPort.StopBits = IO.Ports.StopBits.One comPort.RtsEnable = True AddHandler comPort.DataReceived, AddressOf dataReceived End Sub
Public Sub CloseCom() If comPort.IsOpen Then comPort.Close() End If End Sub
Option Explicit On Option Strict On Imports System.IO.Ports Imports System.Windows.Forms Public Class Balance Private comPort As SerialPort Dim MonLabel As New Label() 'control dans lequel on veux afficher le résultat' 'Détermine les propriétés du port Public Sub NawCom() comPort = New SerialPort comPort.PortName = "COM1" comPort.Parity = IO.Ports.Parity.None comPort.BaudRate = 9600 comPort.StopBits = IO.Ports.StopBits.One comPort.RtsEnable = True AddHandler comPort.DataReceived, AddressOf dataReceived End Sub 'Ouverture du port COM' Public Sub Open() If Not comPort.IsOpen Then comPort.Open() End If End Sub 'Fermeture du port Public Sub CloseCom() If comPort.IsOpen Then comPort.Close() End If End Sub 'Demande de récupération de la pesé sur la balance' Public Sub Peser() comPort.Write("PRT" & Chr(13) & Chr(10)) End Sub 'Procédure éxécuté quand la balance répond' Private Sub dataReceived(ByVal sender As Object, ByVal e As SerialDataReceivedEventArgs) Timer1.Enabled = True End Sub 'Démarrage de la form Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Timer1.Interval = 100 Timer1.Enabled = False Me.Controls.Add(MonLabel) End Sub 'Ce qui execute le Timer Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick Timer1.Enabled = False Dim mess As String = comPort.ReadExisting() 'Permet de formater la valeur afin d enlever les caractère indésiable (signe, unité, blanc)' Dim nb As Integer For Each c In mess If Not Integer.TryParse(c, nb) Then If c <> "." Then mess = mess.Replace(c, "") End If End If Next mess = mess.Trim 'on souhaite afficher le résultat' MonLabel.Text = mess End Sub End Class
Imports System Imports System.Text Imports System.Drawing Imports System.IO.Ports Imports System.Windows.Forms '***************************************************************************************** ' LICENSE INFORMATION '***************************************************************************************** ' PCCom.SerialCommunication Version 1.0.0.0 ' Class file for managing serial port communication ' ' Copyright (C) 2007 ' Richard L. McCutchen ' Email: richard@psychocoder.net ' Created: 20OCT07 ' ' 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/>. '***************************************************************************************** Public Class CommManager #Region "Manager Enums" ''' <summary> ''' enumeration to hold our transmission types ''' </summary> Public Enum TransmissionType Text Hex End Enum ''' <summary> ''' enumeration to hold our message types ''' </summary> Public Enum MessageType Incoming Outgoing Normal Warning [Error] End Enum #End Region #Region "Manager Variables" 'property variables Private _baudRate As String = String.Empty Private _parity As String = String.Empty Private _stopBits As String = String.Empty Private _dataBits As String = String.Empty Private _portName As String = String.Empty Private _transType As TransmissionType Private _displayWindow As RichTextBox Private _msg As String Private _type As MessageType 'global manager variables Private MessageColor As Color() = {Color.Blue, Color.Green, Color.Black, Color.Orange, Color.Red} Private comPort As New SerialPort() Private write As Boolean = True #End Region #Region "Manager Properties" ''' <summary> ''' Property to hold the BaudRate ''' of our manager class ''' </summary> Public Property BaudRate() As String Get Return _baudRate End Get Set(ByVal value As String) _baudRate = value End Set End Property ''' <summary> ''' property to hold the Parity ''' of our manager class ''' </summary> Public Property Parity() As String Get Return _parity End Get Set(ByVal value As String) _parity = value End Set End Property ''' <summary> ''' property to hold the StopBits ''' of our manager class ''' </summary> Public Property StopBits() As String Get Return _stopBits End Get Set(ByVal value As String) _stopBits = value End Set End Property ''' <summary> ''' property to hold the DataBits ''' of our manager class ''' </summary> Public Property DataBits() As String Get Return _dataBits End Get Set(ByVal value As String) _dataBits = value End Set End Property ''' <summary> ''' property to hold the PortName ''' of our manager class ''' </summary> Public Property PortName() As String Get Return _portName End Get Set(ByVal value As String) _portName = value End Set End Property ''' <summary> ''' property to hold our TransmissionType ''' of our manager class ''' </summary> Public Property CurrentTransmissionType() As TransmissionType Get Return _transType End Get Set(ByVal value As TransmissionType) _transType = value End Set End Property ''' <summary> ''' property to hold our display window ''' value ''' </summary> Public Property DisplayWindow() As RichTextBox Get Return _displayWindow End Get Set(ByVal value As RichTextBox) _displayWindow = value End Set End Property ''' <summary> ''' Property to hold the message being sent ''' through the serial port ''' </summary> ''' <value></value> ''' <returns></returns> ''' <remarks></remarks> Public Property Message() As String Get Return _msg End Get Set(ByVal value As String) _msg = value End Set End Property ''' <summary> ''' Message to hold the transmission type ''' </summary> ''' <value></value> ''' <returns></returns> ''' <remarks></remarks> Public Property Type() As MessageType Get Return _type End Get Set(ByVal value As MessageType) _type = value End Set End Property #End Region #Region "Manager Constructors" ''' <summary> ''' Constructor to set the properties of our Manager Class ''' </summary> ''' Desired BaudRate ''' Desired Parity ''' Desired StopBits ''' Desired DataBits ''' Desired PortName Public Sub New(ByVal baud As String, ByVal par As String, ByVal sBits As String, ByVal dBits As String, ByVal name As String, ByVal rtb As RichTextBox) _baudRate = baud _parity = par _stopBits = sBits _dataBits = dBits _portName = name _displayWindow = rtb 'now add an event handler AddHandler comPort.DataReceived, AddressOf comPort_DataReceived End Sub ''' <summary> ''' Comstructor to set the properties of our ''' serial port communicator to nothing ''' </summary> Public Sub New() _baudRate = String.Empty _parity = String.Empty _stopBits = String.Empty _dataBits = String.Empty _portName = "COM1" _displayWindow = Nothing 'add event handler AddHandler comPort.DataReceived, AddressOf comPort_DataReceived End Sub #End Region #Region "WriteData" Public Sub WriteData(ByVal msg As String) Select Case CurrentTransmissionType Case TransmissionType.Text 'first make sure the port is open 'if its not open then open it If Not (comPort.IsOpen = True) Then comPort.Open() End If 'send the message to the port comPort.Write(msg & Chr(13) & Chr(10)) 'display the message _type = MessageType.Outgoing _msg = msg + "" + Environment.NewLine + "" DisplayData(_type, _msg) Exit Select Case TransmissionType.Hex Try 'convert the message to byte array Dim newMsg As Byte() = HexToByte(msg) If Not write Then DisplayData(_type, _msg) Exit Sub End If 'send the message to the port comPort.Write(newMsg, 0, newMsg.Length) 'convert back to hex and display _type = MessageType.Outgoing _msg = ByteToHex(newMsg) + "" + Environment.NewLine + "" DisplayData(_type, _msg) Catch ex As FormatException 'display error message _type = MessageType.Error _msg = ex.Message + "" + Environment.NewLine + "" DisplayData(_type, _msg) Finally _displayWindow.SelectAll() End Try Exit Select Case Else 'first make sure the port is open 'if its not open then open it If Not (comPort.IsOpen = True) Then comPort.Open() End If 'send the message to the port comPort.Write(msg) 'display the message _type = MessageType.Outgoing _msg = msg + "" + Environment.NewLine + "" DisplayData(MessageType.Outgoing, msg + "" + Environment.NewLine + "") Exit Select End Select End Sub #End Region #Region "HexToByte" ''' <summary> ''' method to convert hex string into a byte array ''' </summary> ''' string to convert ''' <returns>a byte array</returns> Private Function HexToByte(ByVal msg As String) As Byte() If msg.Length Mod 2 = 0 Then 'remove any spaces from the string _msg = msg _msg = msg.Replace(" ", "") 'create a byte array the length of the 'divided by 2 (Hex is 2 characters in length) Dim comBuffer As Byte() = New Byte(_msg.Length / 2 - 1) {} For i As Integer = 0 To _msg.Length - 1 Step 2 comBuffer(i / 2) = CByte(Convert.ToByte(_msg.Substring(i, 2), 16)) Next write = True 'loop through the length of the provided string 'convert each set of 2 characters to a byte 'and add to the array 'return the array Return comBuffer Else _msg = "Invalid format" _type = MessageType.Error ' DisplayData(_Type, _msg) write = False Return Nothing End If End Function #End Region #Region "ByteToHex" ''' <summary> ''' method to convert a byte array into a hex string ''' </summary> ''' byte array to convert ''' <returns>a hex string</returns> Private Function ByteToHex(ByVal comByte As Byte()) As String 'create a new StringBuilder object Dim builder As New StringBuilder(comByte.Length * 3) 'loop through each byte in the array For Each data As Byte In comByte builder.Append(Convert.ToString(data, 16).PadLeft(2, "0"c).PadRight(3, " "c)) 'convert the byte to a string and add to the stringbuilder Next 'return the converted value Return builder.ToString().ToUpper() End Function #End Region #Region "DisplayData" ''' <summary> ''' Method to display the data to and ''' from the port on the screen ''' </summary> ''' <remarks></remarks> <STAThread()> _ Private Sub DisplayData(ByVal type As MessageType, ByVal msg As String) _displayWindow.Invoke(New EventHandler(AddressOf DoDisplay)) End Sub #End Region #Region "OpenPort" Public Function OpenPort() As Boolean Try 'first check if the port is already open 'if its open then close it If comPort.IsOpen = True Then comPort.Close() End If 'set the properties of our SerialPort Object comPort.BaudRate = Integer.Parse(_baudRate) 'BaudRate comPort.DataBits = Integer.Parse(_dataBits) 'DataBits comPort.StopBits = DirectCast([Enum].Parse(GetType(StopBits), _stopBits), StopBits) 'StopBits comPort.Parity = DirectCast([Enum].Parse(GetType(Parity), _parity), Parity) 'Parity comPort.PortName = _portName 'PortName 'now open the port comPort.Open() 'display message _type = MessageType.Normal _msg = "Port opened at " + DateTime.Now + "" + Environment.NewLine + "" DisplayData(_type, _msg) 'return true Return True Catch ex As Exception DisplayData(MessageType.[Error], ex.Message) Return False End Try End Function #End Region #Region " ClosePort " Public Sub ClosePort() If comPort.IsOpen Then _msg = "Port closed at " + DateTime.Now + "" + Environment.NewLine + "" _type = MessageType.Normal DisplayData(_type, _msg) comPort.Close() End If End Sub #End Region #Region "SetParityValues" Public Sub SetParityValues(ByVal obj As Object) For Each str As String In [Enum].GetNames(GetType(Parity)) DirectCast(obj, ComboBox).Items.Add(str) Next End Sub #End Region #Region "SetStopBitValues" Public Sub SetStopBitValues(ByVal obj As Object) For Each str As String In [Enum].GetNames(GetType(StopBits)) DirectCast(obj, ComboBox).Items.Add(str) Next End Sub #End Region #Region "SetPortNameValues" Public Sub SetPortNameValues(ByVal obj As Object) For Each str As String In SerialPort.GetPortNames() DirectCast(obj, ComboBox).Items.Add(str) Next End Sub #End Region #Region "comPort_DataReceived" ''' <summary> ''' method that will be called when theres data waiting in the buffer ''' </summary> ''' ''' Private Sub comPort_DataReceived(ByVal sender As Object, ByVal e As SerialDataReceivedEventArgs) 'determine the mode the user selected (binary/string) Select Case CurrentTransmissionType Case TransmissionType.Text 'user chose string 'read data waiting in the buffer Dim msg As String = comPort.ReadExisting() 'display the data to the user _type = MessageType.Incoming _msg = msg DisplayData(MessageType.Incoming, msg + "" + Environment.NewLine + "") Exit Select Case TransmissionType.Hex 'user chose binary 'retrieve number of bytes in the buffer Dim bytes As Integer = comPort.BytesToRead 'create a byte array to hold the awaiting data Dim comBuffer As Byte() = New Byte(bytes - 1) {} 'read the data and store it comPort.Read(comBuffer, 0, bytes) 'display the data to the user _type = MessageType.Incoming _msg = ByteToHex(comBuffer) + "" + Environment.NewLine + "" DisplayData(MessageType.Incoming, ByteToHex(comBuffer) + "" + Environment.NewLine + "") Exit Select Case Else 'read data waiting in the buffer Dim str As String = comPort.ReadExisting() 'display the data to the user _type = MessageType.Incoming _msg = str + "" + Environment.NewLine + "" DisplayData(MessageType.Incoming, str + "" + Environment.NewLine + "") Exit Select End Select End Sub #End Region #Region "DoDisplay" Private Sub DoDisplay(ByVal sender As Object, ByVal e As EventArgs) _displayWindow.SelectedText = String.Empty _displayWindow.SelectionFont = New Font(_displayWindow.SelectionFont, FontStyle.Bold) _displayWindow.SelectionColor = MessageColor(CType(_type, Integer)) _displayWindow.AppendText(_msg) _displayWindow.ScrollToCaret() End Sub #End Region End Class
Imports PCComm Public Class frmMain Private comm As New CommManager() Private transType As String = String.Empty Private Sub cboPort_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cboPort.SelectedIndexChanged comm.PortName = cboPort.Text() End Sub ''' <summary> ''' Method to initialize serial port ''' values to standard defaults ''' </summary> Private Sub SetDefaults() cboPort.SelectedIndex = 0 cboBaud.SelectedText = "9600" cboParity.SelectedIndex = 0 cboStop.SelectedIndex = 1 cboData.SelectedIndex = 1 End Sub ''' <summary> ''' methos to load our serial ''' port option values ''' </summary> Private Sub LoadValues() comm.SetPortNameValues(cboPort) comm.SetParityValues(cboParity) comm.SetStopBitValues(cboStop) End Sub ''' <summary> ''' method to set the state of controls ''' when the form first loads ''' </summary> Private Sub SetControlState() rdoText.Checked = True cmdSend.Enabled = False cmdClose.Enabled = False End Sub Private Sub frmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load LoadValues() SetDefaults() SetControlState() End Sub Private Sub cmdClose_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdClose.Click comm.ClosePort() SetControlState() SetDefaults() End Sub Private Sub cmdOpen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdOpen.Click comm.Parity = cboParity.Text comm.StopBits = cboStop.Text comm.DataBits = cboData.Text comm.BaudRate = cboBaud.Text comm.DisplayWindow = rtbDisplay comm.OpenPort() cmdOpen.Enabled = False cmdClose.Enabled = True cmdSend.Enabled = True End Sub Private Sub cmdSend_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdSend.Click comm.Message = txtSend.Text comm.Type = CommManager.MessageType.Normal comm.WriteData(txtSend.Text) txtSend.Text = String.Empty txtSend.Focus() End Sub Private Sub rdoHex_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rdoHex.CheckedChanged If rdoHex.Checked() Then comm.CurrentTransmissionType = PCComm.CommManager.TransmissionType.Hex Else comm.CurrentTransmissionType = PCComm.CommManager.TransmissionType.Text End If End Sub Private Sub cboBaud_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cboBaud.SelectedIndexChanged comm.BaudRate = cboBaud.Text() End Sub Private Sub cboParity_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cboParity.SelectedIndexChanged comm.Parity = cboParity.Text() End Sub Private Sub cboStop_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cboStop.SelectedIndexChanged comm.StopBits = cboStop.Text() End Sub Private Sub cboData_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cboData.SelectedIndexChanged comm.StopBits = cboStop.Text() End Sub End Class
Private Sub dataReceived(ByVal sender As Object, ByVal e As SerialDataReceivedEventArgs) MonLabel.Text = comPort.readexisting End Sub
Option Explicit On Option Strict On Imports System.IO.Ports Imports System.Windows.Forms Public Class Balance Dim Timer As New Timer Private comPort As SerialPort Dim MonLabel As New Label() 'control dans lequel on veux afficher le résultat' 'Démarrage de la form Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Timer.Interval = 100 Timer.Enabled = False Me.Controls.Add(MonLabel) 'MonLabel.Left = ... 'MonLabel.Top = ... AddHandler Timer.Tick, AddressOf Timer_Tick End Sub 'Détermine les propriétés du port Public Sub NawCom() comPort = New SerialPort comPort.PortName = "COM1" comPort.Parity = IO.Ports.Parity.None comPort.BaudRate = 9600 comPort.StopBits = IO.Ports.StopBits.One comPort.RtsEnable = True AddHandler comPort.DataReceived, AddressOf dataReceived End Sub 'Ouverture du port COM' Public Sub Open() If Not comPort.IsOpen Then comPort.Open() End If End Sub 'Fermeture du port Public Sub CloseCom() If comPort.IsOpen Then comPort.Close() End If End Sub 'Demande de récupération de la pesé sur la balance' Public Sub Peser() comPort.Write("PRT" & vbCrLf) End Sub 'Procédure éxécuté quand la balance répond' Private Sub dataReceived(ByVal sender As Object, ByVal e As SerialDataReceivedEventArgs) Timer.Enabled = True End Sub 'Ce qui execute le Timer Private Sub Timer_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Timer.Enabled = False Dim mess As String = comPort.ReadExisting() 'Permet de formater la valeur afin d enlever les caractère indésiable (signe, unité, blanc)' Dim nb As Integer For Each c In mess If Not Integer.TryParse(c, nb) Then If c <> "." Then mess = mess.Replace(c, "") End If End If Next mess = mess.Trim 'on souhaite afficher le résultat' MonLabel.Text = mess End Sub End Class
décaler le changement de texte de 100ms
Private Sub DisplayData(Text As String) If _display.InvokeRequired Then _display.Invoke(New SetTextCallback(AddressOf DisplayData), New Object() {(Text)}) Else _display.Text = Text End If End Sub
Peut être que mon Buffer est trop petit aussi
Public Class PoidsReceivedEventArgs Inherits EventArgs Private _poids As Decimal Public Property Poids() As Decimal Get Return _poids End Get Set(ByVal value As Decimal) _poids = value End Set End Property Public Sub New(poids As Decimal) MyBase.New() Me.Poids = poids End Sub End Class
Public Delegate Sub PoidsReceivedEventHandler(sender As Object, e As PoidsReceivedEventArgs)
Public Event PoidsReceived As PoidsReceivedEventHandler
If monLabel.InvokeRequired Then monLabel.Invoke(Sub() monLabel.Enabled = True) Else monLabel.Enabled = True End If