RS232 et gestion RTS/CTS

Résolu
space_walker Messages postés 84 Date d'inscription mardi 3 février 2004 Statut Membre Dernière intervention 22 juillet 2008 - 7 juin 2007 à 21:16
space_walker Messages postés 84 Date d'inscription mardi 3 février 2004 Statut Membre Dernière intervention 22 juillet 2008 - 26 mars 2008 à 17:31
http://www.vbfrance.com/auteurdetail.aspx?ID=225810



bonjour,

j'essaye en ce moment de gerer la ligne CTS de mon port COM...
voici mon bout de code.
est ce que qqun pourrait confirmer si c'est ok .. car ca deconne un peu et je ne sais pas si c'est ma boucle d'attente du CTS est correcte  ... ?

Merci :=)

'-----------------------------------------------------------------------------------------

Private Sub Button_Send_Click( ByVal sender As Object , ByVal e As System.EventArgs) Handles Button_Send.Click

Dim index, index2 AsInteger

Dim linetowrite AsString

Dim charout AsString

Dim datagridview2 As DataGridView

datagridview2 = Form_Main.DataGridView2

 

If SerialPort1.IsOpen = TrueAndAlso datagridview2.Rows.Count > 0 Then
Cursor = Cursors.WaitCursor
' On passe le curseur en sablier

ProgressBar1.Value = 0
' On initialise la ProgressBar.

ProgressBar1.Maximum = datagridview2.Rows.Count - 1
' Maximum= nombre total d'octet.

For
index = 0 To (datagridview2.Rows.Count - 1)
linetowrite =
"x" & ( CStr (Hex(datagridview2(0, index).Value)))

        For index2 = 1 To 75
           linetowrite = linetowrite &
"x" & CStr (Hex(datagridview2(index2, index).Value))

        Next

For index2 = 0 To linetowrite.Length - 1

   If CheckBoxCTS.Checked = TrueThen

      While SerialPort1.CtsHolding = True

      EndWhile

   EndIf
   charout = linetowrite(index2)

   SerialPort1.Write(charout)

Next


ProgressBar1.PerformStep()








Next



Cursor = Cursors.Arrow


' On repasse le curseur en normal








End
If






End
Sub

30 réponses

space_walker Messages postés 84 Date d'inscription mardi 3 février 2004 Statut Membre Dernière intervention 22 juillet 2008
13 juin 2007 à 21:39
oui oui mon cable est parfait .. a tel point c'est que ca commence a marcher !!!..
alors oui il me manquait la declaration du handshake ....

mais contrairement à ce que tu m'indiquais, quand ma carte est prete a recevoir, elle doit appliquer un "0" logique ( donc +Xv "entre les max232" )..

j'ai enfin une comm correcte !!

youpi, merci bien
3
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
7 juin 2007 à 21:30
Perso j'aurais plutot mis ceci :

      While SerialPort1.CtsHolding = False
          Application.DoEvents

      EndWhile

Si mes souvenirs sont bon, lorsque le recepteur est pret à recevoir, il positionne la ligne CTS de l'emetteur, comme ça l'emetteur sait qu'il peut y aller. Si j'ai bien compris, toi tu veux attendre d'avoir l'autorisation d'emettre. Donc attendre tant que CTS est False.

Application.DoEvents, c'est pour rendre la main au système pendant l'attente. Sinon tu fais une boucle bloquante qui occupe en permanance le proco et ne lui laisse pas le temps (entre-autre) de gerer le port série.

---- Sevyc64  (alias Casy) ---- <hr size ="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
0
space_walker Messages postés 84 Date d'inscription mardi 3 février 2004 Statut Membre Dernière intervention 22 juillet 2008
7 juin 2007 à 22:25
excatement, le PC est toujours pret a emettre ( donc je ne gere pas le RTS ) et j'attend que ma carte sur mon port COM soit dispo a recevoir.
elle positionne alors le signal CTS ..

alors effectivement, mon ecran est bloqué t'en que CTS n'est pas positionné et je pensais regler ca par un thread ( plus tard car je ne sais pas encore comment on fait ! )..

je ne pensais pas que ca bloquait aussi le port com !!..??
et en faite, je ne comprend pas ton code modifié !
"si CTS n'est pas positionné, rendre la main"  .... comprend pas :(

bon je viens de tester cette modif, ca ne semble pas changer grand chose à mon probleme ( à part les ecran qui passaient blanc lorsque c'etait bloqué ) .. mais le resultat final est le meme .. grrr je ne vois vraiment pas non plus de probleme du coté de ma carte .. grrr

merci !
0
space_walker Messages postés 84 Date d'inscription mardi 3 février 2004 Statut Membre Dernière intervention 22 juillet 2008
7 juin 2007 à 22:34
bon je viens de regrader sur MSN le DoEvents

http://msdn2.microsoft.com/fr-fr/library/bd65th41(VS.80).aspx




ok .. je vois mieu ce que c'est .. mais mon probleme n'est pas la ! ..

mais je comprend toujours pas le : While SerialPort1.CtsHolding = False

dons mon idee, pour mon PC, le CTS est vrai lorsque il a pas le droit d'emettre ...

"Clear To Send", ma carte passe le signal à 0 lorsqu'elle est OK a recevoir ...
je me trompe ??
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
7 juin 2007 à 22:48
Non, normalement, si on résonne en états logique, ta carte doit passer CTS à un état 1 lorsque elle est prete à recevoir des données et le passer à 0 lorsque elle ne peut plus recevoir des données.

Evidement si tu te base sur les tensions aux bornes des connecteurs, il te faut connaitre les particularités de la norme RS232 auparavent.

Ainsi un etat 1 se traduit par une tension entre -3 et -18 Volts
Et un etat 0 se traduit par une tension entre +3 et +18 Volts

Souvent les tensions relevées sont de l'ordre de +/-10 à +/-12 Volts

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
0
space_walker Messages postés 84 Date d'inscription mardi 3 février 2004 Statut Membre Dernière intervention 22 juillet 2008
7 juin 2007 à 23:29
je connais la norme rassure toi ..
j'ai bien sur deja essayé avec les 2 etats logique ..

en faite ma carte perd les pedales .. comme si le PC ne verifiait pas l'etat du CTS avant d'emettre ...

j'ai l'impression que le CTS est pris en compte apres un premier vidage de buffer uniquement ..

il me vient un doute .. en faite mon port COM est un adaptateur USB/COM ... avec un driver COM virtuel .. ce convertisseur gere t-il serieusement le handshaking RTS/CTS !!!...????
j'utilise ca car il me permet de specifier un baudrate non standard ( 125000 bps )... si j'essaye avec mon port COM1, je ne peux pas selectionner de baudrate byzare !

bon il va falloir que je valide ca ....
merci de tes conseils ..
0
space_walker Messages postés 84 Date d'inscription mardi 3 février 2004 Statut Membre Dernière intervention 22 juillet 2008
10 juin 2007 à 00:02
bon j'ai verifié, mon convertisseur gere bien le handshaking RTS/CTS ..

un autre doute au niveau du buffer d'emission et de sa taille : WriteBufferSize.
il est indiqué qu"on ne peut mettre que des entiers paires ...

si je met 2, est ce que mes 2 octets ( du buffer ) seront bien envoyés apres controle de l'etat de CTS ?.. c'est a dire est ce que que j'explose pas le buffer de mon recepteur !...?
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
10 juin 2007 à 11:38
On ne peut mettre que des valeurs paires car le port série de .Net tout comme le Framework en générel fonction avec le format de codage Unicode dans lequel un caractère est représenté sur 2 octets.

Ainsi si tu écrit, à l'aide des methodes Write ou WriteLine, une chaine de caractères sur le port série, pour chaque caractères de la chaine, c'est 2 octets qui seront envoyés.

Tu pourrais passer au format ASCII, dans ce cas là tu aurais effectivement un octet par caractère, mais le format ascii entendu n'est pas reconnu. Ce qui fait que tous les caractères dont le code ascii est suppérieur à 127 seront pas reconnues, et ne seront pas envoyées correctement.

Le mieux est de rester avec le codage par defaut, et de convertir les chaines en tableau de bytes puis d'envioyer ce tableau de bytes avec WriteBytes

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
0
space_walker Messages postés 84 Date d'inscription mardi 3 février 2004 Statut Membre Dernière intervention 22 juillet 2008
10 juin 2007 à 14:59
heu mais c'est la mon probleme .. OUI je veux passer en ASCII !.
je veux envoyer 1 octet / caractere ! ..
si la data dans la case de mon datagridview, vaut 230(decimal), je veux envoyer l'octet E6..
et surtout pas les octets 45 puis 36 ..
( ceci afin de limiter le nombre de data a transmettre...

il me faut ecrire :
      For index2 = 1 To 75
           linetowrite = linetowrite & "x" & Cbyte (Hex(datagridview2(index2, index).Value))

        Next

?????
merci encore ;)
0
space_walker Messages postés 84 Date d'inscription mardi 3 février 2004 Statut Membre Dernière intervention 22 juillet 2008
10 juin 2007 à 15:12
alors ca :
For index2 = 1 To 75


           linetowrite = linetowrite & "x" & Cbyte (Hex(datagridview2(index2, index).Value))









        Next





ca plante !..

et SerialPort.WriteByte ... ca existe pas ..?
a priori, c'est pour un "stream"
0
space_walker Messages postés 84 Date d'inscription mardi 3 février 2004 Statut Membre Dernière intervention 22 juillet 2008
10 juin 2007 à 15:29
oups ... les 2 derniers messages sont a supprimer !..je raconte n'importe quoi .. 
reveil difficile ! ;)

dans mon datagridview, chaque ligne est constituée de 76 octets de données en decimal.
je veux inserer un "x" entre chaque donnée et envoyer chaque ligne avec les valeurs en hexa..

par exemple
datagridview : 50, 0, 127, 255 ,0 .... ( 76 octets )

je veux envoyer :
78 3 2 78 0 78 7 15 78 15 15 78 0

( les 78, ceux sont les "x", et sans les espaces bien sur )

c'est clair ce que je raconte ? ;)
merci
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
10 juin 2007 à 15:55
Je comprend pas bien ce que tu veux envoyer.

Si j'ai bien suivi tu as une série de nombres decimaux. Tu veux envoyer sous forme de texte leur représentation hexadecimale précédée du "x".

Donc 50, 0, 127, 255 ,0 ...

donnerait x32x0x7FxFFx0 .....

soit si tu préfère en code ascii correspondant :
78.33.32.78.30.78.37.46.78.30

par contre je ne comprend pas d'ou tu sort 78 3 2 78 0 78 7 15 78 15 15 78 0

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
0
space_walker Messages postés 84 Date d'inscription mardi 3 février 2004 Statut Membre Dernière intervention 22 juillet 2008
10 juin 2007 à 18:22
tu as parfaitement raison ..

50, 0, 127, 255 ,0 ...

donnerait x32x0x7FxFFx0 .....

soit :
78.33.32.78.30.78.37.46.78.46.46.78.30

mais ceci implique que sur la CPU de ma carte, je reconstruise la donnée recu. pour la premiere donnée de l'exemple,  il me faut convertir 33 et 32 pour obtenir h32 .. ceci se fait tres facilement, par une "lookup table" .. ok !

mais ca prend plus de ressources ( de temps principalement ) que si je recois directement 2 octets : 3 puis 2 et que je dit que le premier est mon poid fort directement et le second mon poid faible .. je fais alors 3 * 16 + 2 h32 d50
0
space_walker Messages postés 84 Date d'inscription mardi 3 février 2004 Statut Membre Dernière intervention 22 juillet 2008
11 juin 2007 à 17:52
salut Casy,

bon j'ai modifié ma carte pour qu'elle fonctionne avec les codes ASCII directement ( j'ameliorerai peut etre ca à terme ! )

si dans mon datagrid j'ai la sequence 50, 0, 127, 255 ,0 ...

ca donne x32x0x7FxFFx0 .....

soit :78.33.32.78.30.78.37.46.78.46.46.78.30

qu'elle est la facon d'ecrire cette emission pour mon serialport ( tout en gerant le CTS )?

Merci Casy de ton support, je vois que tu ne maches pas ta peine à aider ceux qui en ont besoin ;)
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
11 juin 2007 à 21:31
Comme tu es en VB2005, le mieux est d'écrire cela dans une chaine de caractère "x32x0x7FxFF.....".

Ensuite tu convertie ta chaine en tableau de bytes, puis tu envoie le tableau de bytes

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
0
space_walker Messages postés 84 Date d'inscription mardi 3 février 2004 Statut Membre Dernière intervention 22 juillet 2008
13 juin 2007 à 00:24
bon j'ai beau retourner le probleme dans tous les sens, quelque chose deconne ! :(

j'ai l'impression que le CTS est mal géré ( coté PC ) et que mon PC sature l'uart de ma carte ...

merci casy, a+
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
13 juin 2007 à 09:07
As-tu spécifier le protocole de controle de la transmission (porpriété Handshake de SerialPort) ?

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
0
space_walker Messages postés 84 Date d'inscription mardi 3 février 2004 Statut Membre Dernière intervention 22 juillet 2008
13 juin 2007 à 18:25
heuuu... non !!!
pt'in ... une lueure d'espoire !...
je vais testet avec : SerialPort1.Handshake = Handshake.RequestToSend

mais en lisant MSDN, je crois comprendre que c'est pour gerer automatiquement le RTS du PC, lorsque le buffer du PC est plein !....

en faite ... j'ai le sentiement que
- le PC envoie l'octet à son uart,
- regarde immediatement ensuite l'etat de son CTS

or il regarde l'etat de CTS, alors que l'octet n'est toujours pas transmis completement .. donc que ma carte ne la toujours pas recu completement et donc que cette derniere n'a pas le temps de positionner le CTS avant que le PC renvoye un autre octet ...

-
0
space_walker Messages postés 84 Date d'inscription mardi 3 février 2004 Statut Membre Dernière intervention 22 juillet 2008
13 juin 2007 à 19:11
c'est clair, je vois au scope que mes données sont emises par le PC malgres le fait que CTS est positionné.

pour verifier que mon convertisseur USB/COM, ben je debranche ma carte .. et la je vois que mon PC reste en attente avant d'envoyer la moindre données .. cool !

maintenant, avec ma carte connectee et le bout de code suivant :



SerialPort1.Write(




"x"
)               ' un premier octet pour faire reagir ma carteThread.Sleep(100)                      ' une pause pour lui laisser le temps de positionner le CTS


If
CheckBoxCTS.Checked =

True



Then          ' verification par le PC si la carte a activé le CTS ( au scope, je vois que OUI ! )






While
SerialPort1.CtsHolding =

False

Application.DoEvents()







End



While






End



If






 






For
index = 0

To
(datagridview2.Rows.Count - 1)                ' et la l'emission de mes données, avec une pause et un check du CTS


linetowrite =

""                                                            ' pour chaque donnee  emise






For
index2 = 0

To
75linetowrite = linetowrite &


"$"
&

CStr
(Hex(datagridview2(index2, index).Value))


Next






For
index2 = 0

To
linetowrite.Length - 1
Thread.Sleep(10)


If
CheckBoxCTS.Checked =

True



Then








While
SerialPort1.CtsHolding =

False

Application.DoEvents()







End



While






End



If

charout = (linetowrite(index2))


SerialPort1.Write(charout)







Label4.Text = index2







Next

ProgressBar1.PerformStep()







Next

Cursor = Cursors.Arrow




' On repasse le curseur en normal






End



If

je vois clairement mes data qui sont envoyees alors que le CTS est positionné ( car ma carte, sur reception du premier caractere doit effectuer des choses, qui durent environ 3s, et apres ca, elle est prete à recevoir les donnees .. mais, les donnees sont deja passées !!!! )
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
13 juin 2007 à 21:11
Question très con.
Le cable reliant la carte au PC est-il correct ?

Comment visualise-tu à l'oscilo, le signal CTS, tu le regarde coté carte ou tu le regarde sur le connecteur du PC ???

Il se peut que ton cable ne comporte pas le fil correspondant au CTS ou alors il comporte une configuration partcumière dans les connecteurs style CTS directement relié au RTS coté PC.

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
0
Rejoignez-nous