salut, j'ai fais plusieurs applis indus avec 4/6 ou 8ports RS232 et je ne passe pas par des thread, mais par le receive des ports, il faut en revanche leurs donner la fin de trame reçu pour qu'il déclenche l'événement receive.
Tu peux aussi passer par un timer qui scrute les buffer que tu déclares. Ex :
++
' Port de coms RS232
' déclaration du buffer tampon de réception des ports com
Dim buffer1, buffer2 As String
' config des ports et ouverture ici le com4, dans une sub qui va bien ^^
' Configuration du port série 4
Try
With SerialPort4
.PortName = LireINI("com4", "Portname")
.BaudRate = CInt(LireINI("com4", "Vitesse"))
.DataBits = CInt(LireINI("com4", "Databits"))
.StopBits = CType(LireINI("com4", "Stopbit"), Ports.StopBits)
.Handshake = CType(LireINI("com4", "protocole"), Ports.Handshake)
.NewLine = Chr(32) & Chr(60) ' défini la fin de trame du port com4 (sinon CRLF par défaut)
.Open()
End With
Catch ex As Exception
MsgBox("COM4 plus disponible", MsgBoxStyle.Critical)
End Try
'exemple d'une sub qui envoie une demande et attend la réponse, puis la traduit :
Private Function lectureHD2001(ByVal num_com As SerialPort) As Double() 'appelé par le timer
buffer = String.Empty ' efface les anciennes valeurs
Dim data(3) As Double ' valeurs renvoyées par la fonction
For i As Integer = 0 To 2
data(i) = 0 'initialise les valeurs
Next i
Dim out As Boolean = False 'pour sortir de la boucle
Dim ok As Boolean = False ' test si on doit traduire la réception ou pas
Dim fin As Double
fin = Environment.TickCount + 500 ' On ajoute 1/2sec au compteur programme pour avoir le temps
Do
'ecriture
num_com.WriteLine("A00ZS2")
Application.DoEvents()
Pause(100)
' si reception dans le buffer et s'il contient un & (symbol OK pour le HD2001) ?=NOK pour info
If Not buffer Is Nothing AndAlso buffer.Contains("&") _
AndAlso Not buffer.Contains("?") AndAlso Not buffer.Contains("#") Then
out = True
ok = True
ElseIf ((Environment.TickCount >= fin)) Then 'And buffer Is Nothing Then
out = True
ok = False
' truc à faire si défaut
If num_com.PortName = "COM2" Then Ajout_ligne_LV1(4, "pas de réponse du module ambiant")
If num_com.PortName = "COM3" Then Ajout_ligne_LV1(4, "pas de réponse du module sécheur")
End If
Loop While (out = False)
If ok Then
Dim data_buffer() As String = Split(buffer, "$") ' coupe la trame reçu en morceaux
Dim supp As Char() = {CChar("&"), CChar(" ")} ' liste des caractéres à supprimer
For i As Integer = 0 To data_buffer.Length - 1 ' pour chaque morceaux
data_buffer(i) = data_buffer(i).Trim(supp) ' supprimer les caratéres non utile
data_buffer(i) = data_buffer(i).Replace(".", ",") ' remplacer le point par une virgule
Next ' sinon cela fait buguer le cast en Dbl !
For i As Integer = 0 To data_buffer.Length - 1 ' pour chaque morceaux
If data_buffer(i) "ERROR" Then data_buffer(i) "0"
Next i
data(0) = CDbl(data_buffer(0)) ' °C
data(1) = CDbl(data_buffer(1)) ' %HR
data(2) = CDbl(data_buffer(5)) ' %HPA
' dans le cas du HD2001.2 on lit en plus la vitesse d'air
' vérifions que data_buffer(6) ne soit pas vide avant la conversion
If data_buffer(6) <> "" Then data(3) = CDbl(data_buffer(6)) ' m/sec
Else ' si trame reçu NOK alors placer 0
For i As Integer = 0 To 2
data(i) = 0
Next i
End If
Return data
End Function 'lecture des deux modules HD2001 (suivant le port serie)
++