space_walker
Messages postés84Date d'inscriptionmardi 3 février 2004StatutMembreDernière intervention22 juillet 2008
-
7 juin 2007 à 21:16
space_walker
Messages postés84Date d'inscriptionmardi 3 février 2004StatutMembreDernière intervention22 juillet 2008
-
26 mars 2008 à 17:31
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 ... ?
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 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.
space_walker
Messages postés84Date d'inscriptionmardi 3 février 2004StatutMembreDernière intervention22 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
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 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
space_walker
Messages postés84Date d'inscriptionmardi 3 février 2004StatutMembreDernière intervention22 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 ..
space_walker
Messages postés84Date d'inscriptionmardi 3 février 2004StatutMembreDernière intervention22 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 !...?
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 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
space_walker
Messages postés84Date d'inscriptionmardi 3 février 2004StatutMembreDernière intervention22 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))
space_walker
Messages postés84Date d'inscriptionmardi 3 février 2004StatutMembreDernière intervention22 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 )
space_walker
Messages postés84Date d'inscriptionmardi 3 février 2004StatutMembreDernière intervention22 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
space_walker
Messages postés84Date d'inscriptionmardi 3 février 2004StatutMembreDernière intervention22 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 ...
space_walker
Messages postés84Date d'inscriptionmardi 3 février 2004StatutMembreDernière intervention22 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 !!!! )
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 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.