Bonjour,
Je regarde pour créer un pacage d'installation !
Si d'aventure tu as besoin d'autres contrôles dis le pour que je puisse les intégrer !
hello,
la gestion hardware du flux de contrôle de liaison série se fait plutôt par les signaux RTS/CTS ? Non ? En tout cas, moi ce que j'ai constaté en utilisant plusieurs logiciels de liaisons série (comme teraterm pro par exemple).
En attendant la version 64 bits de l'activeX Mscomm32.ocx je te propose de tester le module de classe VBA CLRS232. Ce module créé par Brendan Lambe est basé sur le module modComm de David M. Hitchner. J'ai modifié le module de classe pour y intégrer deux nouvelles propriétés de contrôle de flux :
XonXoff - (R/W) Default value = False
HardFlow - (R/W) Default value = False
Le module de classe CLRS232 est passé de la version 1.01 à la version 1.02.
Voici un exemple d'utilisation. Dans le classeur ReceptionGPS_avec_Module_CLRS232.xlsm qui est en pièce jointe, sur la Feuille 1, il y a deux boutons. Le premier START permet d'initialiser le port série 8 (COM8) avec un contrôle de flux Hardware. On envoie un message à un GPS série connecté à la liaison série puis on se met en écoute dans une boucle de ce qui arrive sur le port série. Le GPS transmet des trames NMEA RMC toutes les 2 secondes. Dans la cellule A2 de la Feuille1, on affiche ce qui arrive sur la liaison série. Dans la cellule C2, on affiche l'état du port série (ouvert ou fermé). Avec le bouton STOP, on interrompt la boucle et on ferme le port série.
Voici le code :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46 Option Explicit Dim blnStop As Boolean Sub StartCom() Dim strRecBuf, strData As String Dim intPos As Integer Dim MonRS232 As New CLRS232 With MonRS232 .ComPort = 8 .BaudRate = 9600 .Parity = "N" .Databits = 8 .StopBits = 1 .XonXoff = False .HardFlow = True .PostCommDelay = 0.1 .OpenComms Range("C2").Value = "Port ouvert" blnStop = False .WriteComm "Salut le GPS!" & vbCrLf strRecBuf = "" Do While blnStop = False .ReadComm If Len(.Data) > 0 Then strRecBuf = strRecBuf + .Data intPos = InStr(strRecBuf, vbCr) If intPos > 0 Then strData = Mid$(strRecBuf, 1, intPos - 1) Range("A2").Value = strData strRecBuf = vbNullString End If End If Loop Range("C2").Value = "Port fermé" .CloseComms End With End Sub Sub StopCom() blnStop = True Debug.Print "Stoppé par Macro" End Sub
et voici le résultat :
Ami calmant, J.P
Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko
Bonjour,
j’arrive à utiliser MSCOMM32.OCX dans une application VB6;
j'arrive à faire un Pacage de publication {SetUp}
j'arrive à installer le setUp et à visualiser MSCOMM32 dans Excel mais pas à le faire fonctionner!
je vais tenter de créer un controls passe plat mais ça prend plus de temps!
@ jurassic pork
je n'ais pas besoin d'ajouter cette ligne a mon programme pour le mode DSR/DTR...?
une autre remarque:
Code : Sélectionner tout - Visualiser dans une fenêtre à part .LineDTR= True
la communication consomme beaucoup du CPU meme quand j'augmente le temps dans PostCommDelay
hello,
Non car dans la procédure OpenComms, il y a à la fin cette ligne :
qui met le DTR à True pendant toute la durée d'utilisation du port COM.
Code : Sélectionner tout - Visualiser dans une fenêtre à part lngStatus = CommSetLine(clComport, LINE_DTR, True)
En effet, j'ai constaté cela aussi. C'est la procédure Delay qui pose problème avec ce code :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 Private Sub Delay(T As Single) If T = 0 Then Exit Sub Dim TempSNG As Single TempSNG = Timer Do While Timer < TempSNG + T DoEvents ' Yield to other processes. Loop End Sub
La boucle infernale Do Loop tourne en permanence pendant toute la durée de la temporisation.
En ajoutant un Sleep de 20 ms à l'intérieur de la boucle, on rend la main au système pendant 20 ms et il y a alors beaucoup moins de boucles :
Par exemple pour un .PostCommDelay de 0.1 il y aura au maximum 5 boucles alors qu'avant il y en avait énormément.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 Private Sub Delay(T As Single) If T = 0 Then Exit Sub Dim TempSNG As Single TempSNG = Timer Do While Timer < TempSNG + T Sleep (20) DoEvents ' Yield to other processes. Loop End Sub
Avec cette modification, le temps CPU excel est bien souvent proche de 0.
J'ai créé une version 1.03 du module de classe CLRS232 avec cette modification. On retrouve cette nouvelle version dans le classeur excel ci-joint.
Ami calmant, J.P
Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko
@jurassic pork
Jai integrer l'envoie de charactere $ dans la boucle
Et ca marche parfaitement
Sans consommation du CPU
Merci beacoup pour la mise a jours
REMARQUE:
1. comment communiquer avec deux ports differents au meme temps ?
2. Il ya une gestion des erreur dans le module
Mais quand le port est occuper
Le message d'erreur de "port occuper" ne saffiche pas
3. Esque c'est possible de fermer une communication
Qui est deja occuper, pour relancer la par ce module.
Cest juste des améliorations supplementaire...
Et pour le moment j'attendtai des nouvelles de la part de Thumb Down
voila jai fait un code qui peut lire depuis COM1 et COM2
il fonctionne normale
mais s'il ya d'autres façon plus simple pour la faire je suis a l'ecoute
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61 Option Explicit Dim blnStop As Boolean Sub StartCom() Dim strRecBuf, strData As String Dim intPos, ss, dd As Integer Dim MonRS1 As New CLRS232 Dim MonRS2 As New CLRS232 MonRS1.ComPort = 1 MonRS1.BaudRate = 9600 MonRS1.Parity = "N" MonRS1.Databits = 8 MonRS1.StopBits = 1 MonRS1.XonXoff = False MonRS1.HardFlow = False MonRS1.PostCommDelay = 0.2 MonRS1.OpenComms MonRS2.ComPort = 2 MonRS2.BaudRate = 9600 MonRS2.Parity = "N" MonRS2.Databits = 8 MonRS2.StopBits = 1 MonRS2.XonXoff = False MonRS2.HardFlow = False MonRS2.PostCommDelay = 0.2 MonRS2.OpenComms blnStop = False Do While blnStop = False MonRS1.ReadComm If Len(MonRS1.Data) > 0 Then strRecBuf = strRecBuf + MonRS1.Data intPos = InStr(strRecBuf, vbCr) If intPos > 0 Then strData = Mid$(strRecBuf, 1, intPos - 1) Range("A1").Value = strData strRecBuf = vbNullString End If End If MonRS2.ReadComm If Len(MonRS2.Data) > 0 Then strRecBuf = strRecBuf + MonRS2.Data intPos = InStr(strRecBuf, vbCr) If intPos > 0 Then strData = Mid$(strRecBuf, 1, intPos - 1) Range("A2").Value = strData strRecBuf = vbNullString End If End If Loop MonRS1.CloseComms MonRS2.CloseComms End Sub
merci pour vous @jurassic pork & @Thumb Down
et jattendrai vos réponses
hello,
J'ai revu la gestion des erreurs dans le module CLRS232 et voici maintenant comme cela fonctionne :
Si le port est occupé un message est affiché demandant si l'on veut fermer le port et le ré-ouvrir.
Si il y a un autre type d'erreur un message s'affiche et le port est fermé.
La nouvelle version ( V1.04) du module de classe CLRS232 est dans le classeur en pièce jointe
Pour pouvoir fermer le port quand on est pas dans la boucle il faut mettre la variable de classe en globale comme ceci par exemple :
et alors on peut fermer le port à tout moment avec un code du genre :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 Option Explicit Dim blnStop As Boolean Dim MonRS232 As New CLRS232 Sub StartCom() Dim strRecBuf, strData As String Dim intPos As Integer With MonRS232 ...
Si c'est une autre application qui a ouvert ce port, cela n'est pas possible de fermer le port.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 Sub ResetCom() MonRS232.ComPort = 8 MonRS232.CloseComms Range("C2").Value = "Port fermé" End Sub
Le souci avec ta gestion des deux ports série c'est que tu utilises les même variables strRecBuf, strData, intPos pour les deux ports.
Cela risque fortement de s'emmêler les pinceaux si les données série n'arrive pas en une seule fois. Si les données renvoyées ne sont pas importantes il y a peu de chance que
cela arrive. Combien d'octets sont envoyés par le périphérique à chaque trame ?
Par sécurité il faut des variables différentes pour les deux ports série.
Ami calmant, J.P
Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko
ahhhh bon c'est bien
et pour le forçage de fermeture du port
c'est pas grave
je v utiliser des commandes exterieurs
merci pour l'aide et les conseils
merci Mr.jurassic pork
merci Mr.Thumb Down
mission accomplie
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager