Lecture pin CTS/DSR/DCD/RI Port Série.

Résolu/Fermé
MegaRadio - Modifié le 30 août 2018 à 12:01
 MegaRadio - 31 août 2018 à 18:23
Bonjours à tous,

Je but depuis quelque temps sur la lecture des signaux en entrée du port série sur un PC, et de visualiser l'état des pins dans une texte box.
J'ai bien essayé d'utiliser :
Private Sub comPortPinChanged(ByVal sender As Object, ByVal e As SerialPinChangedEventArgs) Handles sp.PinChanged</ital>, COM1.Ports.SerialPinChange.RTSChanged, SerialPort1.CtsHolding, 

et lorsque je lance le debug, et que je change l'état d'une pin, il me sort un message : Opération inter-threads non valide : le contrôle 'TextBox1' a fait l'objet d'un accès à partir d'un thread autre que celui sur lequel il a été créé.
.
Après plusieurs modifications et recherche sur internet, je suis perdu, et je ne trouve pas de solution.
Le but de ce prg. est de visualiser les signaux DCF77( Pour ceux que cela intéresse voir la superbe réalisation https://www.youtube.com/watch?v=ZadSU_DT-Ks ).
Je ne peux pas vous proposer de code car ce que j'ai fais n'est pas correcte.
D'avance merci, bien cordialement. GJC.

1 réponse

jeannets Messages postés 26772 Date d'inscription dimanche 9 septembre 2007 Statut Contributeur Dernière intervention 24 avril 2024 5 767
30 août 2018 à 12:18
Bonjour,

Voila les signaux normalisés d'un port série, qu'il soit en DB9 ou en DB25... Il suffit de faire son câble en reliant les bonnes pinoches aux bons signaux et ça marche... https://fr.wikipedia.org/wiki/RS-232

Disons que à 99% des cas on peut visualiser le message directement dans une console Terminal RS232 ou PUTTY, au moins pour voir si ça marche. quelle que soit l'application... Une horloge, une machine outil, le monitor d'un microprocessor etc..

Ensuite tu peux développer une application qui en extrapole les données ou produit une autre forme de présentation... peut importe https://www.instructables.com/DCF77-Signal-Analyzer-Clock/

Mais pour partir du bon pieds, il faut au minimum se relier aux bon signaux, dès le départ, et sans ambiguité; pour ne pas introduire de doute dans un maillon de la chaine...
1
Bonjour,
Merci de votre réponse, mais je pense que des explications supplémentaires sont nécessaires.
J'ai déjà utilisé sans problème le port com d'un pc pour transmettre et recevoir des données, notez que je n'est pas utilisé le mode handshack, donc pas besoins des signaux dtr/cts etc. etc.
Là, l'application que je souhaite faire c'est uniquement tester le niveau d'une des pins de contrôle sans transmettre de donnée, c'est qui me permettra de mesurer la durée des différents niveau (0 ou 1) de cette pin.
ma difficulté est que je ne sais pas exploiter le résultat du test de la pin, comme je l'ai indiqué dans le msg précédant, j'ai un message : Opération inter-threads non valide : le contrôle 'TextBox1' a fait l'objet d'un accès à partir d'un thread autre que celui sur lequel il a été créé. .
Pour info. j'utilise une DB9, et je connais bien le RS232, mais ou ça coince, c'est le programme.
Je poursuis les recherches.
Bien cordialement.
0
jeannets Messages postés 26772 Date d'inscription dimanche 9 septembre 2007 Statut Contributeur Dernière intervention 24 avril 2024 5 767
30 août 2018 à 17:18
Oui, j'ai apporté ce que je sais, c'est tout. Je ne saisi pas bien cette histoire de "niveau d'une des pin de controle" sur les pin du DB9, il n'y a pas vraiment de niveau à tester... ces liaisons sont en "Tout ou rien" ... et la transmission est en série.
Donc si quelque chose peut avoir un niveau variable (visible sur la DB9) c'est une valeur digital qui est transmise... un mot ou un digit ou un octet... qui doit etre encadré entre un préambule et un postambule...

Je ne comprends pas non plus que tu veuille changer l'état d'une pin par software... Pourquoi..? il suffit de le lire tel qu'il est et de l'exploiter sans changer son état.. il y a aussi des circuits intégrés tout fait pour l'interface, du type MAX232 par ex. https://www.maximintegrated.com/en/products/interface/transceivers/MAX233.html il n'y a qu'à lire le mot en sortie... mais je ne saurais pas t'aider sur le développement que tu veux faire...
0
La bonne nouvelle, c'est que je suis arrivé à mes fins, j'ai poursuivi mes essais, et le problème n’était pas la lecture du niveau des pins en entrées de la rs232, mais la visualisation.
il fallait faire un "invoke et un Délégat" donc ça marche , je mets ci-après le bout de programme que j'ai fais.

Pour la liaison série RS232, il faut distinguer les pins de communication, et les pins de contrôles, pour les pins de communication ce sont : TX (Transmission) RX (Réception) qui comme vous l'indiquez, envoie ou reçois des octets, les pins de contrôle, RTS - DTR (sorties) ainsi que les pins d"entrées : CTS - DSR - DCD - Ri qui peuvent prendre un niveau +/-12V (vue côté Extérieur au pc par exemple, mais qui peuvent avoir un niveau 0 /1 du point de vue logique ou 0 / 5V.
Pour conclure, on peut très bien faire de la transmission de donnés sans utiliser les signaux de contrôles, dans ce cas c'est une transmission asynchrone je crois, et si les signaux de contrôles sont utilisés, c'est du handshack (Entre autre).
Mais pour certaines application, comme la mienne, je ne vais utiliser que les signaux de contrôles en entrée.

Encore merci de vous êtes penché sur mon problème.

Le Programme :

Imports System
Imports System.Threading
Imports System.IO.Ports

Public Class Form1
'------------------------------------------------

Delegate Sub SetTextCallback(ByVal [text] As String) 'Added to prevent threading errors during receiveing of data

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

' La Parite communication est en commentaire
Try
With SerialPort1
.PortName = "COM1"
'.BaudRate = 19200
'.Parity = IO.Ports.Parity.None
'.DataBits = 8
'.StopBits = IO.Ports.StopBits.One
'.Handshake = IO.Ports.Handshake.None
'.Encoding = System.Text.Encoding.Unicode
End With
SerialPort1.Open() ' ouverture Port
Catch ex As Exception
MsgBox(ex.ToString)
End Try
CloseButton4.Enabled = True
AddHandler SerialPort1.PinChanged, AddressOf comPortPinChanged
End Sub

' Bouton appelé RTS commandant la sortie RTS

Private Sub RTS_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RTS.Click
If SerialPort1.RtsEnable = True Then
SerialPort1.RtsEnable = False
Else
SerialPort1.RtsEnable = True
End If
End Sub

' Bouton Appelé DTR Commandant la sortie DTR

Private Sub DTR_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DTR.Click
If SerialPort1.DtrEnable = True Then
SerialPort1.DtrEnable = False
Else
SerialPort1.DtrEnable = True
End If
End Sub

' Visualisation Etat Entrée CTS

Private Sub ChangeValue_CTS(ByVal Var_CTS As String)
TextBox1.Text = Var_CTS
End Sub

' Déclanchement sur Changement d'état des Entrées RS232

Public WithEvents ComPortPin As New IO.Ports.SerialPort
Private Delegate Sub ChangValue_CTS(ByVal Var_CTS As String)
Public Var_CTS As String


Private Sub comPortPinChanged(ByVal sender As Object, ByVal e As SerialPinChangedEventArgs) Handles comPortPin.PinChanged

If SerialPort1.CtsHolding = True Then
Var_CTS = "RTS"
Else
Var_CTS = "Pas RTS"
End If

If InvokeRequired Then
Invoke(New ChangValue_CTS(AddressOf ChangeValue_CTS), Var_CTS)
End If
End Sub

' Bouton CloseButton4 Fermeture Port et Application

Private Sub CloseButton4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CloseButton4.Click
SerialPort1.Close()
CloseButton4.Enabled = False
Application.Exit()
End Sub

End Class
0
jeannets Messages postés 26772 Date d'inscription dimanche 9 septembre 2007 Statut Contributeur Dernière intervention 24 avril 2024 5 767
31 août 2018 à 17:29
OK, ça doit etre assez long pour un projet comme ça... en tout cas, merci du retour d'info..
0
De rien, c'est normal si çà peut aider quelqu'un, c'est tant mieux et ça évite de perdre du temps qui file vite (j'ai bientôt 72ans...)
Oui, le projet va être long, car je souhaite faire en logiciel ce qui a été fait en "hard" (Solid Stat) (voir la vidéo).

Merci encore et à plus MR.
0