[WD10] - Impossible de communiquer avec un TPE via sEcrit, sLit, ...
6 réponses
news.club-internet.fr
Bonjour.
Je suis chargé d'interfacer une application de caisse développée en Windev
10 avec un Terminal de paiement par carte bancaire (TPE).
La liaison peut se faire par le port série ou via un port USB qui simule un
port COM.
Dés que le TPE est branché, je vois bien un port COM(3) dans le gestionnaire
de périphériques.
Le code suivant ne donne malheureusement rien ... le TPE ne répondant pas à
une demande de communication par un ACK (Accept) ou NAK (Refus)
et le buffer de lecture reste désespérement vide...
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
news.club-internet.fr
La même avec le code ;-)
_PortTPE est un entier = 3 _LRC est un entier _ENQ est une chaîne = Caract(5) _STX est une chaîne = Caract(2) _ETX est une chaîne = Caract(3) _ACK est une chaîne = Caract(6) _EOT est une chaîne = Caract(4) _NAK est une chaîne = Caract(21)
nbOctects est un entier buffer est une chaîne
// initialise le port sEcrit(_PortTPE, _ENQ) // attente de la fin de l'écriture BOUCLE SI sDansFileSortie(_PortTPE) = 0 ALORS SORTIR FIN
// attente ACK ou NAK BOUCLE nbOctects = sDansFileEntrée( _PortTPE ) buffer = sLit( _PortTPE, nbOctects ) SI buffer = _ACK OU buffer = _NAK ALORS SORTIR FIN
La même avec le code ;-)
_PortTPE est un entier = 3
_LRC est un entier
_ENQ est une chaîne = Caract(5)
_STX est une chaîne = Caract(2)
_ETX est une chaîne = Caract(3)
_ACK est une chaîne = Caract(6)
_EOT est une chaîne = Caract(4)
_NAK est une chaîne = Caract(21)
nbOctects est un entier
buffer est une chaîne
// initialise le port
sEcrit(_PortTPE, _ENQ)
// attente de la fin de l'écriture
BOUCLE
SI sDansFileSortie(_PortTPE) = 0 ALORS SORTIR
FIN
// attente ACK ou NAK
BOUCLE
nbOctects = sDansFileEntrée( _PortTPE )
buffer = sLit( _PortTPE, nbOctects )
SI buffer = _ACK OU buffer = _NAK ALORS SORTIR
FIN
_PortTPE est un entier = 3 _LRC est un entier _ENQ est une chaîne = Caract(5) _STX est une chaîne = Caract(2) _ETX est une chaîne = Caract(3) _ACK est une chaîne = Caract(6) _EOT est une chaîne = Caract(4) _NAK est une chaîne = Caract(21)
nbOctects est un entier buffer est une chaîne
// initialise le port sEcrit(_PortTPE, _ENQ) // attente de la fin de l'écriture BOUCLE SI sDansFileSortie(_PortTPE) = 0 ALORS SORTIR FIN
// attente ACK ou NAK BOUCLE nbOctects = sDansFileEntrée( _PortTPE ) buffer = sLit( _PortTPE, nbOctects ) SI buffer = _ACK OU buffer = _NAK ALORS SORTIR FIN
news.club-internet.fr
Le même avec le code complet cette fois ;-)
_PortTPE est un entier = 3 _LRC est un entier _ENQ est une chaîne = Caract(5) _STX est une chaîne = Caract(2) _ETX est une chaîne = Caract(3) _ACK est une chaîne = Caract(6) _EOT est une chaîne = Caract(4) _NAK est une chaîne = Caract(21)
SI sOuvre ( _PortTPE , 2000 , 2000 ) ALORS
// Paramétrage de COM3 : Taux 1200 bauds, parité paire, // 7 bits de données, 1 bit de stop sFixeParamètre ( _PortTPE , 1200 , 1 , 7 , 0 )
nbOctects est un entier buffer est une chaîne
// initialise le port sEcrit(_PortTPE, _ENQ) // attente de la fin de l'écriture BOUCLE SI sDansFileSortie(_PortTPE) = 0 ALORS SORTIR FIN
// attente ACK ou NAK BOUCLE nbOctects = sDansFileEntrée( _PortTPE ) buffer = sLit( _PortTPE, nbOctects ) SI buffer = _ACK OU buffer = _NAK ALORS SORTIR FIN
// Fermeture de COM3 sFerme ( _PortTPE ) SINON Erreur ( "Erreur d'ouverture de COM3" ) FIN
Le même avec le code complet cette fois ;-)
_PortTPE est un entier = 3
_LRC est un entier
_ENQ est une chaîne = Caract(5)
_STX est une chaîne = Caract(2)
_ETX est une chaîne = Caract(3)
_ACK est une chaîne = Caract(6)
_EOT est une chaîne = Caract(4)
_NAK est une chaîne = Caract(21)
SI sOuvre ( _PortTPE , 2000 , 2000 ) ALORS
// Paramétrage de COM3 : Taux 1200 bauds, parité paire,
// 7 bits de données, 1 bit de stop
sFixeParamètre ( _PortTPE , 1200 , 1 , 7 , 0 )
nbOctects est un entier
buffer est une chaîne
// initialise le port
sEcrit(_PortTPE, _ENQ)
// attente de la fin de l'écriture
BOUCLE
SI sDansFileSortie(_PortTPE) = 0 ALORS SORTIR
FIN
// attente ACK ou NAK
BOUCLE
nbOctects = sDansFileEntrée( _PortTPE )
buffer = sLit( _PortTPE, nbOctects )
SI buffer = _ACK OU buffer = _NAK ALORS SORTIR
FIN
// Fermeture de COM3
sFerme ( _PortTPE )
SINON
Erreur ( "Erreur d'ouverture de COM3" )
FIN
_PortTPE est un entier = 3 _LRC est un entier _ENQ est une chaîne = Caract(5) _STX est une chaîne = Caract(2) _ETX est une chaîne = Caract(3) _ACK est une chaîne = Caract(6) _EOT est une chaîne = Caract(4) _NAK est une chaîne = Caract(21)
SI sOuvre ( _PortTPE , 2000 , 2000 ) ALORS
// Paramétrage de COM3 : Taux 1200 bauds, parité paire, // 7 bits de données, 1 bit de stop sFixeParamètre ( _PortTPE , 1200 , 1 , 7 , 0 )
nbOctects est un entier buffer est une chaîne
// initialise le port sEcrit(_PortTPE, _ENQ) // attente de la fin de l'écriture BOUCLE SI sDansFileSortie(_PortTPE) = 0 ALORS SORTIR FIN
// attente ACK ou NAK BOUCLE nbOctects = sDansFileEntrée( _PortTPE ) buffer = sLit( _PortTPE, nbOctects ) SI buffer = _ACK OU buffer = _NAK ALORS SORTIR FIN
// Fermeture de COM3 sFerme ( _PortTPE ) SINON Erreur ( "Erreur d'ouverture de COM3" ) FIN
Eric Laurent
Regarde vers la fonction sEchap() qui te permettras de gérer les signaux de controle dont le TPE à sûrement besoin.
-- Eric Laurent
(enlever nospam.)
Regarde vers la fonction sEchap() qui te permettras de gérer les
signaux de controle dont le TPE à sûrement besoin.
--
Eric Laurent
nospam.laurent.systel@wanadoo.fr
(enlever nospam.)
Regarde vers la fonction sEchap() qui te permettras de gérer les signaux de controle dont le TPE à sûrement besoin.
-- Eric Laurent
(enlever nospam.)
PAtrick
news.club-internet.fr wrote:
// attente ACK ou NAK BOUCLE nbOctects = sDansFileEntrée( _PortTPE ) buffer = sLit( _PortTPE, nbOctects ) SI buffer = _ACK OU buffer = _NAK ALORS SORTIR FIN
Je ne sais pas pour Windev10 car je n'ai aps tester, mais avec WD9 il y avait un probleme avec certain XP pro le nombre d'octet dans SdanfileEntrée n'est jamais a Zero mais a 64XXXX oct donc tu tente de lire les 640000 octets :D
news.club-internet.fr wrote:
// attente ACK ou NAK
BOUCLE
nbOctects = sDansFileEntrée( _PortTPE )
buffer = sLit( _PortTPE, nbOctects )
SI buffer = _ACK OU buffer = _NAK ALORS SORTIR
FIN
Je ne sais pas pour Windev10 car je n'ai aps tester, mais avec WD9 il y
avait un probleme avec certain XP pro
le nombre d'octet dans SdanfileEntrée n'est jamais a Zero mais a 64XXXX oct
donc tu tente de lire les 640000 octets :D
// attente ACK ou NAK BOUCLE nbOctects = sDansFileEntrée( _PortTPE ) buffer = sLit( _PortTPE, nbOctects ) SI buffer = _ACK OU buffer = _NAK ALORS SORTIR FIN
Je ne sais pas pour Windev10 car je n'ai aps tester, mais avec WD9 il y avait un probleme avec certain XP pro le nombre d'octet dans SdanfileEntrée n'est jamais a Zero mais a 64XXXX oct donc tu tente de lire les 640000 octets :D
Francis DUHAUT
Bonjour,
Je pense que ton TPE attend pour _ENQ la valeur 0x05 (hexa) hors tu envois Caract(5) !? Caract est a utilisé pour convertir une valeur decimal en caractère ASCII. Exemple : Caract(30) donne la chaine "0".
Bref, pour envoyé 0x05 sur le port série, il faut que tu passes par une variable de type "buffer".
Exemple de ton code modifié:
// Code modifié en utilisant un buffer _PortTPE est un entier = 3 BufferPort est un buffer // Ici la variable de type buffer nbOctects est un entier
CONSTANT // C'est mieux d'utiliser des constantes...
// Paramétrage de COM3 : Taux 1200 bauds, parité paire, // 7 bits de données, 1 bit de stop sFixeParamètre ( _PortTPE , 1200 , 1 , 7 , 0 )
// initialise le port BufferPort[[1]] = _ENQ sEcrit(_PortTPE, BufferPort[[1]])
// attente de la fin de l'écriture BOUCLE SI sDansFileSortie(_PortTPE) = 0 ALORS SORTIR FIN
// attente ACK ou NAK BOUCLE nbOctects = sDansFileEntrée( _PortTPE ) BufferPort = sLit( _PortTPE, nbOctects ) // On récupère la valeur décimale dans BufferPort à la position "i" grace à Val(Asc(BufferPort[[i]])) SI ( Val(Asc(BufferPort[[1]])) = _ACK ) OU ( Val(Asc(BufferPort[[1]])) = _NAK ) ALORS Trace ("Réponse du TPE = " + Val(Asc(BufferPort[[1]])) ) SORTIR FIN FIN
// Fermeture de COM3 sFerme ( _PortTPE ) SINON Erreur ( "Erreur d'ouverture de COM3" ) FIN
Bonjour,
Je pense que ton TPE attend pour _ENQ la valeur 0x05 (hexa) hors tu envois
Caract(5) !?
Caract est a utilisé pour convertir une valeur decimal en caractère ASCII.
Exemple : Caract(30) donne la chaine "0".
Bref, pour envoyé 0x05 sur le port série, il faut que tu passes par une
variable de type "buffer".
Exemple de ton code modifié:
// Code modifié en utilisant un buffer
_PortTPE est un entier = 3
BufferPort est un buffer // Ici la variable de type buffer
nbOctects est un entier
CONSTANT
// C'est mieux d'utiliser des constantes...
// Paramétrage de COM3 : Taux 1200 bauds, parité paire,
// 7 bits de données, 1 bit de stop
sFixeParamètre ( _PortTPE , 1200 , 1 , 7 , 0 )
// initialise le port
BufferPort[[1]] = _ENQ
sEcrit(_PortTPE, BufferPort[[1]])
// attente de la fin de l'écriture
BOUCLE
SI sDansFileSortie(_PortTPE) = 0 ALORS SORTIR
FIN
// attente ACK ou NAK
BOUCLE
nbOctects = sDansFileEntrée( _PortTPE )
BufferPort = sLit( _PortTPE, nbOctects )
// On récupère la valeur décimale dans BufferPort à la position
"i" grace à Val(Asc(BufferPort[[i]]))
SI ( Val(Asc(BufferPort[[1]])) = _ACK ) OU (
Val(Asc(BufferPort[[1]])) = _NAK ) ALORS
Trace ("Réponse du TPE = " +
Val(Asc(BufferPort[[1]])) )
SORTIR
FIN
FIN
// Fermeture de COM3
sFerme ( _PortTPE )
SINON
Erreur ( "Erreur d'ouverture de COM3" )
FIN
Je pense que ton TPE attend pour _ENQ la valeur 0x05 (hexa) hors tu envois Caract(5) !? Caract est a utilisé pour convertir une valeur decimal en caractère ASCII. Exemple : Caract(30) donne la chaine "0".
Bref, pour envoyé 0x05 sur le port série, il faut que tu passes par une variable de type "buffer".
Exemple de ton code modifié:
// Code modifié en utilisant un buffer _PortTPE est un entier = 3 BufferPort est un buffer // Ici la variable de type buffer nbOctects est un entier
CONSTANT // C'est mieux d'utiliser des constantes...
// Paramétrage de COM3 : Taux 1200 bauds, parité paire, // 7 bits de données, 1 bit de stop sFixeParamètre ( _PortTPE , 1200 , 1 , 7 , 0 )
// initialise le port BufferPort[[1]] = _ENQ sEcrit(_PortTPE, BufferPort[[1]])
// attente de la fin de l'écriture BOUCLE SI sDansFileSortie(_PortTPE) = 0 ALORS SORTIR FIN
// attente ACK ou NAK BOUCLE nbOctects = sDansFileEntrée( _PortTPE ) BufferPort = sLit( _PortTPE, nbOctects ) // On récupère la valeur décimale dans BufferPort à la position "i" grace à Val(Asc(BufferPort[[i]])) SI ( Val(Asc(BufferPort[[1]])) = _ACK ) OU ( Val(Asc(BufferPort[[1]])) = _NAK ) ALORS Trace ("Réponse du TPE = " + Val(Asc(BufferPort[[1]])) ) SORTIR FIN FIN
// Fermeture de COM3 sFerme ( _PortTPE ) SINON Erreur ( "Erreur d'ouverture de COM3" ) FIN
Damien
Bonjour et merci pour votre aide
Maleureusement, ça ne change rien à mon problème.
Soit le code suivant avec l'utilisation de sEvenement:
SI sOuvre(_PortTPE, 2000, 2000, sTimeoutDéfaut,Vrai)
Multitâche(-10) // Paramétrage du port : Taux 1200, parité paire, 7 bits de données, 1 bit de stop SI sFixeParamètre(_PortTPE, 1200, 1, 7, 0,Vrai,Faux,Faux) ALORS sEcrit(_PortTPE, _ENQ) Multitâche(-10)
nbOctects est un entier buffer est une chaîne // attente ACK ou NAK BOUCLE nbOctects = sDansFileEntrée( _PortTPE ) buffer = sLit( _PortTPE, nbOctects ) SI buffer = _ACK OU buffer = _NAK ALORS SORTIR Trace("Réponse du TPE : " + buffer) Multitâche(-10) FIN
SELON myEvent CAS sEveBreak : Trace(" -> Réception d'un événement Break line") CAS sEveCaractèreReçu : Trace(" -> Réception d'un caractère") CAS sEveCTS : Trace(" -> Changement d'état CTS") CAS sEveDSR : Trace(" -> Changement d'état DSR") CAS sEveEnvoiTerminé : Trace(" -> Le buffer de sortie est vide") CAS sEveErreur : Trace(" -> Détection d'une erreur sur la ligne") CAS sEveErreurImprimante : Trace(" -> Erreur d'imprimante détectée") CAS sEveFileEntrée80 : Trace(" -> Le buffer d'entrée est plein à 80%") CAS sEveRing :Trace(" -> Détection du signal Ring (sonnerie)") CAS sEveRLSD : Trace(" -> Changement d'état RLSD") FIN
et j'obtient :
-> GestionEvenement (n° 16) -> Changement d'état DSR -> GestionEvenement (n° 4) -> Le buffer de sortie est vide Réponse du TPE : Réponse du TPE : Réponse du TPE : Réponse du TPE : Réponse du TPE : Réponse du TPE : Réponse du TPE : Réponse du TPE : Réponse du TPE : Réponse du TPE : Réponse du TPE : ....
Merci de votre aide
Bonjour et merci pour votre aide
Maleureusement, ça ne change rien à mon problème.
Soit le code suivant avec l'utilisation de sEvenement:
SI sOuvre(_PortTPE, 2000, 2000, sTimeoutDéfaut,Vrai)
Multitâche(-10)
// Paramétrage du port : Taux 1200, parité paire, 7 bits de données, 1
bit de stop
SI sFixeParamètre(_PortTPE, 1200, 1, 7, 0,Vrai,Faux,Faux) ALORS
sEcrit(_PortTPE, _ENQ)
Multitâche(-10)
nbOctects est un entier
buffer est une chaîne
// attente ACK ou NAK
BOUCLE
nbOctects = sDansFileEntrée( _PortTPE )
buffer = sLit( _PortTPE, nbOctects )
SI buffer = _ACK OU buffer = _NAK ALORS SORTIR
Trace("Réponse du TPE : " + buffer)
Multitâche(-10)
FIN
SELON myEvent
CAS sEveBreak : Trace(" -> Réception d'un événement Break line")
CAS sEveCaractèreReçu : Trace(" -> Réception d'un caractère")
CAS sEveCTS : Trace(" -> Changement d'état CTS")
CAS sEveDSR : Trace(" -> Changement d'état DSR")
CAS sEveEnvoiTerminé : Trace(" -> Le buffer de sortie est vide")
CAS sEveErreur : Trace(" -> Détection d'une erreur sur la ligne")
CAS sEveErreurImprimante : Trace(" -> Erreur d'imprimante détectée")
CAS sEveFileEntrée80 : Trace(" -> Le buffer d'entrée est plein à 80%")
CAS sEveRing :Trace(" -> Détection du signal Ring (sonnerie)")
CAS sEveRLSD : Trace(" -> Changement d'état RLSD")
FIN
et j'obtient :
-> GestionEvenement (n° 16)
-> Changement d'état DSR
-> GestionEvenement (n° 4)
-> Le buffer de sortie est vide
Réponse du TPE :
Réponse du TPE :
Réponse du TPE :
Réponse du TPE :
Réponse du TPE :
Réponse du TPE :
Réponse du TPE :
Réponse du TPE :
Réponse du TPE :
Réponse du TPE :
Réponse du TPE :
....
Multitâche(-10) // Paramétrage du port : Taux 1200, parité paire, 7 bits de données, 1 bit de stop SI sFixeParamètre(_PortTPE, 1200, 1, 7, 0,Vrai,Faux,Faux) ALORS sEcrit(_PortTPE, _ENQ) Multitâche(-10)
nbOctects est un entier buffer est une chaîne // attente ACK ou NAK BOUCLE nbOctects = sDansFileEntrée( _PortTPE ) buffer = sLit( _PortTPE, nbOctects ) SI buffer = _ACK OU buffer = _NAK ALORS SORTIR Trace("Réponse du TPE : " + buffer) Multitâche(-10) FIN
SELON myEvent CAS sEveBreak : Trace(" -> Réception d'un événement Break line") CAS sEveCaractèreReçu : Trace(" -> Réception d'un caractère") CAS sEveCTS : Trace(" -> Changement d'état CTS") CAS sEveDSR : Trace(" -> Changement d'état DSR") CAS sEveEnvoiTerminé : Trace(" -> Le buffer de sortie est vide") CAS sEveErreur : Trace(" -> Détection d'une erreur sur la ligne") CAS sEveErreurImprimante : Trace(" -> Erreur d'imprimante détectée") CAS sEveFileEntrée80 : Trace(" -> Le buffer d'entrée est plein à 80%") CAS sEveRing :Trace(" -> Détection du signal Ring (sonnerie)") CAS sEveRLSD : Trace(" -> Changement d'état RLSD") FIN
et j'obtient :
-> GestionEvenement (n° 16) -> Changement d'état DSR -> GestionEvenement (n° 4) -> Le buffer de sortie est vide Réponse du TPE : Réponse du TPE : Réponse du TPE : Réponse du TPE : Réponse du TPE : Réponse du TPE : Réponse du TPE : Réponse du TPE : Réponse du TPE : Réponse du TPE : Réponse du TPE : ....