tony241265
Messages postés4Date d'inscriptionmardi 20 octobre 2009StatutMembreDernière intervention 8 novembre 2009
-
4 nov. 2009 à 14:32
tony241265
Messages postés4Date d'inscriptionmardi 20 octobre 2009StatutMembreDernière intervention 8 novembre 2009
-
8 nov. 2009 à 04:14
Bonjour à tous,
dans une form j'ai ajouter un ole mscomm pour la communication en série. j'ai fais des procédures qui permettent de gérer la communication ouverture et fermeture du port, les paramètres (vitesse, bit de parité, ....)
je dois écrire un programme qui permet de communiquer avec une caisse enregistreuse à travers le port série. la communication se passe bien sauf pour enregistrer les données du buffer de mscomm.
dans une fonction je fais :
return mscomm.input
si je met set step on et je pointe le curseur sur mscomm.input j'ai bien la chaine souhaité
et si j'appuie sur F8 la fonction me renvoie bien la chaine, mais si j'enlève le set step on , la fonction me renvoie toujours une chaine vide ????
mscomm est configurée avec :
handshaking 1, inputlen 0, rthreshold = 0
le settings (vitesse, ...) est bien configuré car je lis bien les données renvoyés mais je n'arrive pas à les sauvegarder.
tony241265
Messages postés4Date d'inscriptionmardi 20 octobre 2009StatutMembreDernière intervention 8 novembre 2009 4 nov. 2009 à 19:39
Bonjour Michel,
merci de ton aide, j'ai écris le code que tu as proposé mais toujours la variable est vide.
voici le code qui permet d'envoyer un message :
envoie_port (procédure dans la form)
lparameters mscomm, mes as string
Local lcRet as String
m.lcRet = ''
mscomm.output = mes
if mscomm.inbuffercount > 0
m.lcRet = mscomm.input
endif
return m.lcRet
voici l'appel de cette fonction
lcr = thisform.envoie_port(thisform.mscomm1,'instruction' + CHR(13))
lcr est toujours vide, comme j'avais écris dans le post précédent je vois bien le nom de l'article de la caisse dans mscomm.input si je met un point d'arrêt.
michelatoutfox
Messages postés828Date d'inscriptionmardi 5 octobre 2004StatutMembreDernière intervention 7 mai 20131 5 nov. 2009 à 14:09
[list]
[*] As-tu vraiment besoin de passer l'objet mscomm comme paramètre à ta méthode ?
Si je comprends bien, cette méthode est sur le même form que l'objet mscomm. Tu peux donc passer uniquement la chaine comme paramètre:
m.lcr = thisform.envoie_port('instruction' + CHR(13))
et dans ta méthode, tu supprimes le besoin de 1er paramètre.
[*] quand tu débogues en pas à pas en mettant un point d'arret au début de ta procédure, est-ce que m.lcRet prend bien la valeur souhaitée?
/list
tony241265
Messages postés4Date d'inscriptionmardi 20 octobre 2009StatutMembreDernière intervention 8 novembre 2009 5 nov. 2009 à 20:40
oui la méthode est sur le même form, oui m.lcret prend bien la valeur souhaitée, je ne sais pas ce qui cloche pourquoi si je fais un pas à pas j'ai bel et bien la valeur renvoyé c'est vraiment bizarre c'est comme si l'information se volatilise. je suis toujours bloqué.
Vous n’avez pas trouvé la réponse que vous recherchez ?
michelatoutfox
Messages postés828Date d'inscriptionmardi 5 octobre 2004StatutMembreDernière intervention 7 mai 20131 6 nov. 2009 à 10:19
as-tu essayé en simplifiant l'écriture (ne pas passer l'objet OLE en paramètre et modifer le code de la méthode) comme je te le suggérais?
si cette suggestion ne fonctionne pas mieux, il faudrait essayer en passant la valeur de retour en paramètre par référence (donc en ajoutant @lcr dans l'appel de la méthode)
tony241265
Messages postés4Date d'inscriptionmardi 20 octobre 2009StatutMembreDernière intervention 8 novembre 2009 8 nov. 2009 à 04:14
après plusieurs essaies et recherche j'ai trouvé 2 solutions :
1)
m.lcRet = ''
mscomm.output = mes
inkey(0.01)
if mscomm.inbuffercount > 0
m.lcRet = mscomm.input
endif
return m.lcRet
dans la première je dois faire une temporisation (même si je ne suis pas convaincue) et tester si je trouve des information dans le buffer, si je ne fais pas de temporisation mscomm.inbuffercount est toujours =0
si je dois ramener 800 lignes des articles je pense que ça mettra plus de temps avec le temporisation que la deuxième solution
2)j'ai mis mscomm.inputlen = 1
m.lcRet = ''
m.lcchar = ''
_second1 = datetime()
do while .t.
m.lcchar = mscomm.input
m.lcRet = m.lcRet + x
if m.lcchar = chr(13) or datetime() - _second1 > thisform.timeout
exit
endif
enddo
return m.lcRet
la caisse revoie le caractère 'O' suivie du retour chariot puis envoie l'information suivie du RC(retour chariot)c'est à dire
'O' + RC
INFO + RC
dans cette procédure j'ai mis un timeout au cas ou il y a un problème de communication
laquelle est la meilleure???
dans les deux cas j'ai toujours un blocage pendant la lecture des articles c'est à dire si je clique sur un bouton.. etc rien ne se passe jusqu'à la fin de lecture des articles