Port rs232 écriture lecture et enregistement

Signaler
Messages postés
9
Date d'inscription
mercredi 29 février 2012
Statut
Membre
Dernière intervention
4 mars 2012
-
Messages postés
14675
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
4 juillet 2020
-
bonjour à toutes et à tous.

je suis un débutant , donc excusé moi si je n'emploi pas les bon termes mais je me soigne grâce au forum.

j'aimerais avoir vos avis ou conseils, voila j'aimerais essayer de faire un petit soft qui dialogue sur un port com (RS232).

j'ai télécharger et installer visual basic 2010 express. je me suis documenté sur l'appareil avec le quel je voudrais me connecter.

d’ailleurs je me connecte déjà et dialogue avec.

j'ai une doc avec les requêtes à envoyer pour connaitre les valeurs qui m'intéresse .

exemple : si je lui envoie 02 FD 00 03 30 00 62 F2 <- je lui demande sont nombres d'heures de fonctionnement.
réponse 02 FD 00 03 30 10 E2 42 <- 4322 heures de fonctionnement.

se que j'aimerais faire, c'est de me faire un petit soft qui interroge la chaudière régulièrement et qui enregistre
les résulta en "claire" dans un fichier CSV ou directement dans une base de donnée (SQL?) qui serait consultable
depuis un autre pc.

si je télécharge un code source il faut qu'il soit fais avec VB2010 non? j'ai encore du mal à tout comprendre

merci d'avoir pris le temps de me lire.

12 réponses

Messages postés
14675
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
4 juillet 2020
143
Bonjour,

Pour accéder au port COM en VB.NET, System.IO.Ports.SerialPort

Concernant l'enregistrement, il faut savoir quel traitement tu veux faire ensuite.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, ce lien ou encore celui-ci[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Messages postés
9
Date d'inscription
mercredi 29 février 2012
Statut
Membre
Dernière intervention
4 mars 2012

merci pour les infos.
Messages postés
9
Date d'inscription
mercredi 29 février 2012
Statut
Membre
Dernière intervention
4 mars 2012

encore moi .

connaîtriez vous de bon tuto ou livre qui explique les ports com sous vb2010? voir bouts de code

j'ai suivi un tuto (anglais) mais je ne comprend pas , je n'y arrive pas .

pour simuler l'arrivé des données sur le port , j'utilise un émulateur de port et un terminale qui envoie une trame en Hexa (celle que je doit recevoir) .
Messages postés
14675
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
4 juillet 2020
143
Bonjour,

Pas spécialement, j'ai surtout appris en regardant la doc (la fameuse MSDN).

Tu peux t'inspirer de certaines sources :
http://www.vbfrance.com/codes/UTILISATION-PORT-COM-VS2005_42181.aspx (en retirant la conversion du tableau et chaine, System.Text.Encoding.ASCII.GetString et en plus, tu as la technique pour appeler des modifs sur une form à partir d'un thread)

Regardes aussi les sources traitant du Modbus Série, les données sont traitées en binaire.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, ce lien ou encore celui-ci[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Messages postés
9
Date d'inscription
mercredi 29 février 2012
Statut
Membre
Dernière intervention
4 mars 2012

je viens de suivre se petit tuto Comment implémenter la communication par un port série COM

j'ai ajouté 2 boutons "connect" et disconnect" , cela fonctionne bien.

maintenant j'aimerais pouvoir choisir le port com.

j'ai donc trouvé cela en remplacent ListBox1 par ComboBox1 , cela ne fonctionne pas.
Sub GetSerialPortNames()
    ' Show all available COM ports.
    For Each sp As String In My.Computer.Ports.SerialPortNames
        ListBox1.Items.Add(sp)
    Next
End Sub


puis en fouinant j'ai trouvé , qui n'a pas fonctionné non plus
ComboBox1.Items.AddRange(IO.Ports.SerialPort.GetPortNames)


et enfin celui là qui ne fonctionne pas .
 1 Imports System
    2 Imports System.IO.Ports
    3 Imports System.Threading
    4 
    5 
    6 Function AddCom2Combo(ByVal cbPort As ComboBox)
    7 
    8     ' Get a list of serial port names.
    9     Dim ports As String() = SerialPort.GetPortNames()
   10     ' Show a label with Action information on it
   11     cbPort.Text = "The following serial ports were found:"
   12 
   13     ' Put each port name Into a comboBox control.
   14     Dim port As String
   15     For Each port In ports
   16         cbPort.Items.Add(port)
   17 
   18     Next port
   19     ' Select the first item in the combo control
   20     cbPort.SelectedIndex = 0
   21 End Function

Code from www.visiblevisual.com


auriez vous une piste ? je continue mes recherche
Messages postés
14675
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
4 juillet 2020
143
Bonjour,

Comment ça "ça ne fonctionne pas" ?
Un message d'erreur ?
Pas de liste des ports COM ?
Autre ?

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, ce lien ou encore celui-ci[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Messages postés
9
Date d'inscription
mercredi 29 février 2012
Statut
Membre
Dernière intervention
4 mars 2012

désolé j'ai été un peut vague!

le combobox reste vide.

pour info, je crée 2 ports virtuelle , et avec un terminale j'envoie des données.

avec le 1° tuto j'avais bien les données dans une textebox.

mais pour pouvoir choisir le port à utilisé la je sèche.

en soit se n'est pas grave , mais pouvoir choisir le port est quand même plus pratique.
Messages postés
14675
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
4 juillet 2020
143
Bonjour,

Je l'utilise pourtant dans mes programmes.
2 explications possibles :
- Soit tu as lancé l'application avant la définitions des ports
- Soit il sont vraiment virtuels et l'emplacement de leur identification n'est pas reconnu par la fonction utilisée.

Pour information, l'utilisation de cette fonction fonctionne :
- Avec des ports physiques
- Avec des ports déportés (Moxa dans mon cas)
- Avec un simulateur de liaison (Ports COM virtuels, en version 32 bits)
Sur OS 32 bits (XP).

Sinon, tu peux toujours forcer le numéro de port directement dans ton code, même si je reconnais qu'avoir la liste des ports reconnus sur la machine est quand même plus pratique.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, ce lien ou encore celui-ci[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Messages postés
9
Date d'inscription
mercredi 29 février 2012
Statut
Membre
Dernière intervention
4 mars 2012

merci pour les infos je vais cherché dans se sens.

je viens de réussir mais le code n'est pas de moi ! donc pas de koi être fière mais au moins cela va me permette d'avancé un peut.

donc prochaine étape , mise en forme des données !

alors une petite question s impose.

mes données sont composé du nom (genre température) la valeur et l'unité .(actuellement elles s'affichent dans un Ritchtextbox en données brut)

sachant que par la suite je voudrais faire des graphiques avec ces données et affiché un schéma de l'installation avec les valeurs.

vers quoi je doit m'orienté pour enregistrer les données qui viennent du port com et les exploitées par la suite?

merci
Messages postés
14675
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
4 juillet 2020
143
Bonjour,

Voir pour un fichier CSV ou similaire et si il y a beaucoup de données, une base de données (Access, MySql, ...) peut être utilisable.

A voir comment sont organiser les informations pour décoder cela.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, ce lien ou encore celui-ci[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Messages postés
9
Date d'inscription
mercredi 29 février 2012
Statut
Membre
Dernière intervention
4 mars 2012

alors si je peut me permette , je vous explique du mieux que je peut .

voila comment se compose une trame.

24 20 4B 65 73 73 65 6C 74 65 6D 70 2E 3B 30 30 37 31 3b 32 3b 32 3b B0 433B 1A

Début de la trame je ne mets pas tout il y'en a quelques lignes...
fin de la trame
Texte
Séparateur
valeur
index
diviseur
unité
= température chaudiére 35.5 C°(on divise la valeur par le diviseur)

dans un code source vb6 que j'ai trouvé sur un site allemand il y'a.

 With LV1 'Définir les propriétés de ListView
            .Width = VB6.TwipsToPixelsX(6000)
            .Height = VB6.TwipsToPixelsY(8000)
            .BackColor = System.Drawing.ColorTranslator.FromOle(&HC0FFFF)
            .Columns.Add("", "Fonction", CInt(VB6.TwipsToPixelsX(1000)))
            .Columns.Add("", "Valeur", CInt(VB6.TwipsToPixelsX(3900)))
            .Columns.Add("", "Unité", CInt(VB6.TwipsToPixelsX(1000)))
            'UPGRADE_WARNING: La limite inférieure de la collection LV1.ColumnHeaders est passée de 1 à 0. Cliquez ici : 'ms-help://MS.VSCC.v90/dv_commoner/local/redirect.htm?keyword="A3B628A0-A810-4AE2-BFA2-9E7A29EB9AD0"'
            .Columns.Item(2).TextAlign = System.Windows.Forms.HorizontalAlignment.Right
            'UPGRADE_WARNING: La limite inférieure de la collection LV1.ColumnHeaders est passée de 1 à 0. Cliquez ici : 'ms-help://MS.VSCC.v90/dv_commoner/local/redirect.htm?keyword="A3B628A0-A810-4AE2-BFA2-9E7A29EB9AD0"'
            .Columns.Item(3).TextAlign = System.Windows.Forms.HorizontalAlignment.Center
            .View = System.Windows.Forms.View.Details
        End With

si j'ai bien compris la on définie la Listview

puis les données

Private Sub MSComm1_OnComm(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles MSComm1.OnComm
Dim SplitStr() As String
Dim x As Short
Dim index As Short


If MSCommLib.OnCommConstants.comEvReceive Then
RString = RString & MSComm1.Input
            If VB.Right(RString, 2) = Chr(&H3B) & Chr(&H1A) Then 'Identifiant la fin de la chaîne reçue
                If VB.Left(RString, 2) = Chr(&H24) & Chr(&H20) Then 'Début du code de la chaîne reçue
                    LV1.Items.Clear() 'ListView delete
                    RString = Mid(RString, 3) 'Retirer commencer identifiant
                    SplitStr = Split(RString, ";") 'Dissoudre et de stocker de chaîne dans le tableau
                    RString = ""
                    For x = 0 To UBound(SplitStr) - 5 Step 5 'ListView avec les données de la matrice pour remplir
                        index = index + 1

                        With LV1
                            'UPGRADE_WARNING: La limite inférieure de la collection LV1.ListItems est passée de 1 à 0. Cliquez ici : 'ms-help://MS.VSCC.v90/dv_commoner/local/redirect.htm?keyword="A3B628A0-A810-4AE2-BFA2-9E7A29EB9AD0"'
                            .Items.Insert(index, SplitStr(x)) 'Bezeichnung
                            If SplitStr(x + 4) <> " " Then
                                'UPGRADE_WARNING: La limite inférieure de la collection LV1.ListItems est passée de 1 à 0. Cliquez ici : 'ms-help://MS.VSCC.v90/dv_commoner/local/redirect.htm?keyword="A3B628A0-A810-4AE2-BFA2-9E7A29EB9AD0"'
                                'UPGRADE_WARNING: La limite inférieure de la collection LV1.ListItems.Item(index) est passée de 1 à 0. Cliquez ici : 'ms-help://MS.VSCC.v90/dv_commoner/local/redirect.htm?keyword="A3B628A0-A810-4AE2-BFA2-9E7A29EB9AD0"'
                                If .Items.Item(index).SubItems.Count > 1 Then
                                    .Items.Item(index).SubItems(1).Text = CStr(Val(SplitStr(x + 1)) / Val(SplitStr(x + 3)))
                                Else
                                    .Items.Item(index).SubItems.Insert(1, New System.Windows.Forms.ListViewItem.ListViewSubItem(Nothing, CStr(Val(SplitStr(x + 1)) / Val(SplitStr(x + 3)))))
                                End If
                            Else
                                'UPGRADE_WARNING: La limite inférieure de la collection LV1.ListItems est passée de 1 à 0. Cliquez ici : 'ms-help://MS.VSCC.v90/dv_commoner/local/redirect.htm?keyword="A3B628A0-A810-4AE2-BFA2-9E7A29EB9AD0"'
                                'UPGRADE_WARNING: La limite inférieure de la collection LV1.ListItems.Item() est passée de 1 à 0. Cliquez ici : 'ms-help://MS.VSCC.v90/dv_commoner/local/redirect.htm?keyword="A3B628A0-A810-4AE2-BFA2-9E7A29EB9AD0"'
                                If .Items.Item(index).SubItems.Count > 1 Then
                                    .Items.Item(index).SubItems(1).Text = SplitStr(x + 1)
                                Else
                                    .Items.Item(index).SubItems.Insert(1, New System.Windows.Forms.ListViewItem.ListViewSubItem(Nothing, SplitStr(x + 1)))
                                End If 'Wert
                            End If
                            'UPGRADE_WARNING: La limite inférieure de la collection LV1.ListItems est passée de 1 à 0. Cliquez ici : 'ms-help://MS.VSCC.v90/dv_commoner/local/redirect.htm?keyword="A3B628A0-A810-4AE2-BFA2-9E7A29EB9AD0"'
                            'UPGRADE_WARNING: La limite inférieure de la collection LV1.ListItems.Item() est passée de 1 à 0. Cliquez ici : 'ms-help://MS.VSCC.v90/dv_commoner/local/redirect.htm?keyword="A3B628A0-A810-4AE2-BFA2-9E7A29EB9AD0"'
                            If .Items.Item(index).SubItems.Count > 2 Then
                                .Items.Item(index).SubItems(2).Text = SplitStr(x + 4)
                            Else
                                .Items.Item(index).SubItems.Insert(2, New System.Windows.Forms.ListViewItem.ListViewSubItem(Nothing, SplitStr(x + 4)))
                            End If 'Unité
                        End With

                    Next x
                Else
                    RString = ""
                End If
            End If
End If
End Sub

arf là franchement je ne sais plus ou j'en suis !!
voici une capture d'écrant du soft.



comme vous pouvez le voir le texte est en allemand pour le moment se n'est pas grave mais par le futur elle seront traduite , Regex ? mais pour nos amis allemand je préférer avoir un combobox avec un choix de langue mais on en ai pas là!!!

pour le moment j'ai ça


ne vous moquez pas je débute
Messages postés
14675
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
4 juillet 2020
143
Bonjour,

Sous format texte, ta trame don,ne :
$ Kesseltemp.;0071;2;2; |B0|C;|SUB|
(entre | les caractères non imprimable ou non standard)

Donc, en excluant les début et fin de trame, tu as du texte et avec un split sur le caractère ; tu as toutes les données dans un tableau.

Concernant l'utilisation du ListView, utilises plutôt des sources plus simples et déjà en .NET, cela te permettra de faire un code plus propre.

Pour convertir un tableau d'octet en String, tu peux aller voir ce sujet qui en cause :
http://www.vbfrance.com/forum/sujet-ANOMALIE-CRYPTAGE-DECRYPTAGE_1577747.aspx

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, ce lien ou encore celui-ci[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---