PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → Echange avec un boitier FT231X USB UART sur un port com
Echange avec un boitier FT231X USB UART sur un port com
Débuté par Arnaud PIERRON, 26 juil. 2017 11:23 - 22 réponses
Membre enregistré
15 messages
Posté le 26 juillet 2017 - 11:23
Bonjour

J'ai un boitier FT231X USB UART que je branche en USB. il prend un port com
Il permet de paramétrer une parabole
J'utilise le logiciel Terminal (v1.9b)
Je me connecte au boitier (vitesse 57600, data bits 8, parity none, stop bits 1 et handshaking none
Lorsque, dans ce logiciel, je saisi 2 et entrée, il m'affiche le paramétrage des satellites.

Je souhaite faire la même chose sous WinDev
Le problème c'est que je n'ai j'avais rien en retour
Comme la communication avec ce genre de boitier ce n'est pas trop ma spécialité, j'aimerai un peu d'aide.
Je vous donne deux exemple que j'ai fait (dans le premier je n'ai jamais l'évènement caractère reçu qui est déclenché, et dans le deuxième il n'y a jamais rien a réception
(Je sais je ne ferme pas le port à la fin, mais comme je voulais être certain de fermer trop tot et que c'est juste des tests, je le ferme au debut pour l'instant)

Merci de votre aide

LeCom est un entier = 3

sFerme(LeCom)
SI sOuvre(LeCom, 2000, 2000,sTimeoutDéfaut,Vrai) ALORS
sEvénement(LeCom,sEveCaractèreReçu, SiRecu)
sFixeParamètre(LeCom, 57600, 0, 8, 0)
sEcrit(LeCom,"2")
SINON
Erreur("Erreur d'ouverture du port COM"+LeCom)
FIN
Sablier(Faux)


LeCom est un entier = 3
LeMessR est une chaîne = ""
LaTailleMess est un entier

sFerme(LeCom)
SI sOuvre(LeCom, 2000, 2000,sTimeoutDéfaut) ALORS
sFixeParamètre(LeCom, 57600, 0, 8, 0)
sEcrit(LeCom,"2")
Temporisation(200)
LaTailleMess = sDansFileEntrée(LeCom)
SI LaTailleMess > 0 ALORS
LeMessR = sLit(LeCom,LaTailleMess)
FIN
SINON
Erreur("Erreur d'ouverture du port COM"+LeCom)
FIN
Info(LeMessR)
Membre enregistré
946 messages
Popularité : +102 (110 votes)
Posté le 26 juillet 2017 - 14:29
Bonjour,
Dans votre premier essais (avec sEvenement), vous nous donnez pas le code de la procédure : SiRecu
Membre enregistré
946 messages
Popularité : +102 (110 votes)
Posté le 26 juillet 2017 - 15:18
Dans vos 2 essais vous envoyez "2" ce qui n'est pas l'équivalent de ce que vous envoyez avec Terminal : " je saisi 2 et entrée"
Vous oubliez d'envoyer RC :
sEcrit(LeCom, "2" + Caract(0x0d) )
Membre enregistré
15 messages
Posté le 26 juillet 2017 - 20:09
Bonjour
Oui je n'avais pas mis la procédure SiRecu car pour l'instant il n'y a qu'une commande info()
Pour ce ui du retour chariot. j'avais essayé avec caract(13) et je viens d"essayer comme vous l'avez indiqué mais cela n'a rien changé.
Mais je me suis aperçu de quelque chose. pour être certain d'avoir les bon paramétrages j'ai fait une boucle qui traite tous les cas possible (avec la vitesse à 57600) et parfois je recois quelques chose de lisible,toujours la même chose, mais jamais avec le même paramétrage.
j'ai l'impression que c'est un message quand le boitier se met en veille (je j'avais avant tester sous terminal)
Donc ca voudrai dire que mon programme reçois bien mais ceux sont les ordres que je donnes qui sont inefficaces
Membre enregistré
15 messages
Posté le 26 juillet 2017 - 20:10
en tout cas merci a vous de m'aider, je vais continuer à faire des tests pour essayer de comprendre
Membre enregistré
15 messages
Posté le 27 juillet 2017 - 08:33
Si cela peut aider je donne le paramétrage que j'utilise sous TerminalV1.9b:





Et voici ce que me repond Terminal1.9b:

BOOTING...
DISH_STOP {0,0} t:0.2 n:0
WAIT(158)
TUNER_POWER: DOWN
LNB_STATE CHANGED FROM 0 TO S
TUNER_POWER: ON
TRY#1 GETTING TUNER ID=E0 (OK)
TUNER INIT...
M88DS3103 firmware upload................................................................
EEPROM TEST : OK
CLOSE BUT: 1
STEP:0 {0,0} t:4.0 n:0
DISH_STOP {0,0} t:4.0 n:0
TUNER_POWER: DOWN
Going HOME before anything else...
BOOT : SUCCESS. STARTING ZENMATIC.
DISH_STOP {0,0} t:4.5 n:0
STEP3: Going home now...
DISH_STOP {0,0} t:0.0 n:0
DISH_LEFT {0,0} t:0.1 n:0
WAIT(221)
STEP2: Dish left end, moving down now
DISH_STOP {0,0} t:0.3 n:0
DISH_DOWN {0,0} t:0.3 n:0
WAIT(222)
WAIT(53)
WAIT(53)
WAIT(53)
WAIT(53)
WAIT(53)
WAIT(53)
WAIT(53)
WAIT(53)
WAIT(53)
WAIT(53)
SPEED_V:0 < SPEED_STOPPED
DISH_STOP {0,0} t:1.1 n:0
ORIGIN REACHED, AT_HOME=1
$SLEEP :)

Je voulais savoir s'il existe une commande pour tester la connexion avec le boitier
j'ai essayé AT mais j'ai l'impression que le boitier ne tiens pas du tout compte des commandes que j'envoi
il doit manquer quelque chose autour mais je ne vois pas quoi
Membre enregistré
15 messages
Posté le 27 juillet 2017 - 08:57
Pour tester le paramétrage de la connexion, j'ai fait un programme qui test tous les cas possibles.
en balançant une commande AT (mais je ne sais pas si c'est celle ci qu'il faut utiliser)
Parfois, lors de cette boucle, je reçois la trame affichée au dessus.
Mais incapable de dire, pour moi, si c'est la commande AT qui provoque la réception de cette trame ou si c'est la mise en veille de mon boitier qui envoie cette trame (le doute vient a cause du côté un peu aléatoire de la réception de cette trame)
voici ce que j'ai fait pour tester les différents paramétrages:

SiOK est un booléen
LeCom est un entier = 3
LeTab1 est un tableau d'entier = [57600]
LeTab2 est un tableau d'entier = [0,1,2]
LeTab3 est un tableau d'entier = [4,5,6,7,8]
//LeTab3 est un tableau d'entier = [7,8]
LeTab4 est un tableau d'entier = [0,1,2]
LeTab5 est un tableau d'entier = [0,1,2]
LeTab6 est un tableau d'entier = [0,1,2]
LeTab7 est un tableau de booléens = [Vrai,Faux]
LaVal1 est un entier
LaVal2 est un entier
LaVal3 est un entier
LaVal4 est un entier
LaVal5 est un entier
LaVal6 est un entier
LaVal7 est un booléen
LeNb1 est un entier = 0
LaRep1 est une chaîne = ""
LeEnvoi2 est une chaîne = ChaîneVersUTF8("AT"+Caract(13))
LeNb2 est un entier = 0
LaRep2 est une chaîne = ""
//sLeEnvoi3 est une chaine = ChaîneVersUTF8("AT2"+caract(13))
//LeNb3 est un entier = 0
//LaRep3 est une chaîne = ""

LeCpt est un entier = 0

TableSupprimeTout(TABLE_Resultat)
sFerme(LeCom)
SI sOuvre(LeCom, 9000, 9000,sTimeoutDéfaut) ALORS
// sEvénement(LeCom,sEveCaractèreReçu, SiRecu)
Sablier(Vrai)
POUR TOUT LaVal1 de LeTab1
POUR TOUT LaVal2 de LeTab2
POUR TOUT LaVal3 de LeTab3
POUR TOUT LaVal4 de LeTab4
POUR TOUT LaVal5 de LeTab5
POUR TOUT LaVal6 de LeTab6
POUR TOUT LaVal7 de LeTab7
SiOK = sFixeParamètre(LeCom,LaVal1,LaVal2,LaVal3,LaVal4,LaVal5,LaVal6,LaVal7)
SI SiOK ALORS
LeCpt++
LeNb1 = sDansFileEntrée(LeCom)
LaRep1 = sLit(LeCom,LeNb1)
Temporisation(20)
sEcrit(LeCom,LeEnvoi2)
Temporisation(20)
LeNb2 = sDansFileEntrée(LeCom)
LaRep2 = sLit(LeCom,LeNb2)
Temporisation(20)
// sEcrit(LeCom,LeEnvoi3)
// Temporisation(25)
// LeNb3 = sDansFileEntrée(LeCom)
// LaRep3 = sLit(LeCom,LeNb3)
// Temporisation(25)
TableAjouteLigne(TABLE_Resultat,LeCpt,LaVal1,LaVal2,LaVal3,LaVal4,LaVal5,LaVal6,LaVal7,"OK",LeNb1,LaRep1,LeNb2,LaRep2)
TableTrie(TABLE_Resultat,"-TABLE_Resultat.COL_LeCpt")
FIN
FIN
FIN
FIN
FIN
FIN
FIN
FIN
sFerme(LeCom)
Sablier(Faux)
// sEvénement(LeCom,sEveCaractèreReçu, SiRecu)
// sFixeParamètre(LeCom, 57600, 0, 8, 0)
// sEcrit(LeCom,"2" + caract(13))
SINON
Erreur("Erreur d'ouverture du port COM"+LeCom)
FIN
Sablier(Faux)
Membre enregistré
15 messages
Posté le 27 juillet 2017 - 09:11
Voici ce que j'obtient, parfois en faisant tourner le programme ci-dessus (mais pas forcement avec le même paramétrage)
de plus impossible pour moi de savoir si cette réponse arrive a cause de la commande AT envoyée ou bien si c'est une trame envoyée par mon boitier lorsqu'il se met en veille
(Le fait que la trame soit reçue en plusieurs morceaux vient du fait que ma temporisation est trop courte)



Membre enregistré
946 messages
Popularité : +102 (110 votes)
Posté le 27 juillet 2017 - 14:07
Bonjour,
- La commande "AT" est sauf erreur de ma part, réservée au dialogue avec les modems (commandes HAYES)
- Avez la documentation de votre boitier ?

Pour tester je ferais comme cela :

Une fenêtre avec 2 boutons "Open com" et "Close" et une zone d'affichage de texte SAI_DATA multi-ligne

Déclaration globale de cette fenêtre :
myBufferRx est une chaîne
PortCom est un entier


Code du bouton "Open com"
myBufferRx = ""
SAI_DATA = ""
PortCom = 3
sFerme(PortCom)

IF NOT sOuvre(PortCom, 4096, 4096, sTimeoutDéfaut, Vrai) THEN
Erreur("Erreur sOuvre")
RETOUR
END

IF NOT sFixeParamètre(PortCom, 57600, 0, 8, 0, Vrai, Vrai, Vrai) THEN
Erreur("Erreur sFixeParamètre")
sFerme(PortCom)
RETOUR
END

IF NOT sEvénement(PortCom,sEveCaractèreReçu, getRxChar) THEN
Erreur("Erreur sEvénement")
sFerme(PortCom)
RETOUR
END


Code de la procédure locale getRxChar
Procedure getRxChar()
i est un entier
DataLine est une chaîne = ""
myBufferRx += sLit(PortCom,sDansFileEntrée(PortCom))

i = Position(myBufferRx,Caract(0x0d))
IF i > 0 THEN
DataLine = myBufferRx[[1 A i]]
myBufferRx = myBufferRx[[i+1 A]]
SAI_DATA += DataLine
END


Éteindre le boitier, lancer le test, cliquez sur le bouton "Open com" et allumez votre boitier : vous devriez avoir les messages du boot

pour envoyer des caractères ajoutez un bouton "Send"
sEcrit(PortCom, "données à envoyer"+Caract(0x0d))


Quant aux données à envoyer, sans la documentation c'est mission quasi impossible
Membre enregistré
15 messages
Posté le 27 juillet 2017 - 15:04
Bonjour
je vais tester cela des ce soir
merci
Membre enregistré
15 messages
Posté le 28 juillet 2017 - 19:33
Bonjour. non ca na rien donné. je dois rater quelque chose mais je ne vois pas encore quoi :)
j'ai quelques exemple de commandes pour lister le paramétrage et aussi pour modifier des paramétres
Sous terminal1.9b cela fonctionne tres bien quand je les saisie simplement dans la pavé inférieur de celui ci
mais sous windev pour l'instant il ne veut rien savoir
ce que j'essaye de faire en fait, c'est simplement reproduire la partie saisie de commande de termine1.9b, mais en vain pour l'instant
je vais encore chercher de mon cotes; merci pour votre aide en tout cas :)
Membre enregistré
948 messages
Popularité : +30 (92 votes)
Posté le 29 juillet 2017 - 13:49
Coucou

Temporisation(200) c pas bon tu utilise Multitask()

et je croi que 0x0D 0x0A

j me suis exploser le poignet droit desoler pour la response courte

--
Charly CanDo.
Forg en Nouvelle-Zélande ;-) - In üs we trust
Nasi Goreng en Indonesie ;-) - #oulouou
Char Kuey Tiao en Malaisie ;-) - #OKLM
irc.freenode.net - ##pcsoft
Membre enregistré
962 messages
Popularité : +183 (185 votes)
Posté le 29 juillet 2017 - 15:22
hello,
je ne comprends pas pourquoi la réception des données par événement ne fonctionne pas .Tu peux essayer de t'inspirer de ma contribution de 2010
"Windev : Gestion de liaison série par événement série" sur developpez.net ici : https://www.developpez.net/forums/d1008591/environnements-developpement/windev/contribuez/windev-gestion-liaison-serie-evenement-serie/

--
Ami calmant, J.P
Membre enregistré
946 messages
Popularité : +102 (110 votes)
Posté le 29 juillet 2017 - 16:51
Bonjour
Une méthode simple et efficace pour tester votre programme (sauf la partie paramétrage) c'est de relier la pin n°2 du connecteur RS232 à la pin n°3 (c'est les mêmes pin que ce soit un connecteur Canon SubD 9 ou 25 broches) sans rien d'autre. Ainsi tout ce que vous enverrez devra s'afficher
Membre enregistré
15 messages
Posté le 02 août 2017 - 07:41
bonjour, désolé j'étais absent quelque jours
Je vais tester toutes vos suggestions et je vous tiendrai au courant
Merci de votre aide en tout cas
Membre enregistré
15 messages
Posté le 04 août 2017 - 20:56
Bonjour
J'ai fait des tests selon vos remarques, faisant différents programmes
Cela ne fonctionne pas
Mais j'ai remarqué quelque chose
Quand je me connecte au boitier avec le logiciel Terminal, apparait les messages de boot suivant

BOOTING...
DISH_STOP {0,0} t:0.2 n:0
WAIT(158)
TUNER_POWER: DOWN
LNB_STATE CHANGED FROM 0 TO S
TUNER_POWER: ON
TRY#1 GETTING TUNER ID=E0 (OK)
TUNER INIT...
M88DS3103 firmware upload................................................................
EEPROM TEST : OK
CLOSE BUT: 1
STEP:0 {0,0} t:4.0 n:0
DISH_STOP {0,0} t:4.0 n:0
TUNER_POWER: DOWN
Going HOME before anything else...
BOOT : SUCCESS. STARTING ZENMATIC.
DISH_STOP {0,0} t:4.5 n:0
STEP3: Going home now...
DISH_STOP {0,0} t:0.0 n:0
DISH_LEFT {0,0} t:0.1 n:0
WAIT(221)
STEP2: Dish left end, moving down now
DISH_STOP {0,0} t:0.3 n:0
DISH_DOWN {0,0} t:0.3 n:0
WAIT(222)
WAIT(53)
WAIT(53)
WAIT(53)
WAIT(53)
WAIT(53)
WAIT(53)
WAIT(53)
WAIT(53)
WAIT(53)
WAIT(53)
SPEED_V:0 < SPEED_STOPPED
DISH_STOP {0,0} t:1.1 n:0
ORIGIN REACHED, AT_HOME=1
$SLEEP :)

Pendant ce temps la toutes les led du boitier clignotent, comme si le boitier etait en train de s'activer
et ensuite le boitier clignote comme s'il etait en attente

Hors moi quand je me connecte par windev, il me detecte bien le boitier sur le port com mais rien ne clignote sur le boitier
Il n'y a aucun boot
Est ce que le logiciel terminal n’enverrai pas une instruction de boot, par défaut?
De plus, windev me détecte un branchement sur le port com meme si le boitier n'est pas sous tension.
Je pense que mon problème vient de la, je me connecte simplement au port com mais le boitier ne s'active pas
Si c'est le cas, je pense que ce n'est pas quelque chose de spécifique au boitier que j'ai, vu que Terminal le fait par defaut

Dans le test que j'ai indiqué plus haut (celui ou je fait une boucle en testant toutes les paramétrage en balancant la commande "AT") parfois je recevait le message de boot (comme sous terminal) et le boitier clignotait. le probleme c'est qu'il ne le faisait pas tout le temps et de facon aléatoire (pas toujours avec le même parametrage et jamais avec celui que j'utilise sous Terminal)

je sais je débute vraiment dans ce domaine, plus habitué à travailler sur des bases que sur des ports com :(
Membre enregistré
946 messages
Popularité : +102 (110 votes)
Posté le 05 août 2017 - 13:33
Bonjour,
- Avez-vous testé votre programme juste en bouclant la pin n°2 à la pin n°3 du connecteur RS232, sans connecter votre boitier satellite ?

Si votre connecteur est un Cannon Sub-d 9 broches comme sur l'image :



la pin n°2 est la réception (RX) de votre pc et la n°3 est la transmission (TX)

Faite juste un pont entre ces deux pins (ne connectez pas votre boitier satellite) et dans le code d'un bouton, envoyez du texte «sEcrit(PortCom, "ABCDE")"»
Si votre programme est correcte vous devriez recevoir "ABCDE". Tant que cette étape ne fonctionne pas, pas la peine d'essayer de communiquez avec votre boitier satellite...

J'ai bossé durant de nombreuses années avec les liaisons asynchrones (rs232,rs422,rs485) et j'ai toujours utilisé cette méthode pour vérifier que mon programme envoyez et recevez bien (cela ne permet pas de vérifier le paramétrage du port)

Une fois que cela fonctionne :
- retirez le pont
- lancez votre programme
- votre programme prêt connectez votre boitier satellite
- mettez le sous tension


«Est ce que le logiciel terminal n’enverrai pas une instruction de boot, par défaut?»
"Terminal" de Windows n'envoie rien de plus que ce que l'on lui demande d'envoyer et affiche tout ce qu'il reçoit.

«il me détecte bien le boitier sur le port com»
Comment le savez-vous ?
Membre enregistré
962 messages
Popularité : +183 (185 votes)
Posté le 05 août 2017 - 14:58
hello,
il y a aussi peut-être le signal série DTR à gérer. Arnaud sur ta copie d'écran on ne voit pas la partie transmit de terminal 1.9b
A quel moment l'affichage de caractères venant de ton périphérique apparaît avec terminal 1.9B ? Au moment où tu fait un connect ou au moment où tu envois un 2 ?

--
Ami calmant, J.P
Membre enregistré
15 messages
Posté le 08 août 2017 - 06:44
Bonjour J.P

le DTR n'est pas coché
Sous Terminal, c'est lorsqu'on clique sur connect quele boot démarre, que les led clignotent et que les messages de boot apparaissent.
la commande 2 permet de lister dles paramétrages de satellites, elle fonctionne bien aussi sous Terminal
CI dessous l'écran après avoir cliqué sous connect.



Membre enregistré
15 messages
Posté le 08 août 2017 - 06:54
Bonjour Philippe
Le problème c'est que je ne passe pas par ce genre de cable mais par un cable USB
Quant à savoir si le boitier est bien détecté par mon programme, disons que que mon programme détecte qu'il y a quelque chose sur le port Com3 quand je branche mon câble USB dessus. mais c'est vrai qu'il me le détécte même si le boitier n'est pas alimenter
Après, je recois des messages parfois lorsque j'utilise ma boucle de test des differentes souvent une suite de lettres, parfois je recois un BOOT_START (ca c'est toujours avec les mêmes paramétrages) et, de temps en temps, les messages de boot comme sous Terminal et les leds se lancent (mais ca ca arrive aléatoirement parmis 4 ou 5 paramétrages precis) mais pour le paramétrage qui et identique à celui utilisé sous Terminal, la je ne recois jamais rien
Membre enregistré
15 messages
Posté le 08 août 2017 - 06:56
Pardon Philippe et JP dans mes derniers messages, j'ai oublié la formulre de politesse :)
message fait rapidement juste avant de partir

merci de votre aide en tout cas
Membre enregistré
946 messages
Popularité : +102 (110 votes)
Posté le 08 août 2017 - 12:18
Bonjour
je ne comprend pas votre architecture...
D'après ce que j'avais compris, vous auriez :
[PC]<----usb---->[boitier FT231X USB UART]<---cable RS232--->[boitier satellite]
Le "boitier FT231X USB UART" ne servant qu'à vous fournir un port RS232C (par l'intermédiaire d'un driver Windows)

Si ce n'est pas le cas, pourriez-vous donner ce shéma ?
Membre enregistré
15 messages
Posté le 08 août 2017 - 20:32
Bonjour.
j'ai juste le boitier qui se branche en USB sur le pc.
c'est un boitier qui se branche sur une antenne satellite et qui permet le pointage de celle ci
Le fabriquant (du boitier et des antennes) utilise des outils comme Terminal pour changer le paramétrage
Mais justement il souhaite un logiciel qui permette de le faire de façon plus facile et le diffuser à ses clients.
Mais dans ce projet, je bloque depuis plusieurs semaines sur l’échange avec ce boitier.
L’échange avec ce genre de boitier c'est un domaine que je decouvre
Mais tout le paramétrage est contenu dans le boitier, vu que j'y accède facilement avec Terminal