Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[WD10] - Impossible de communiquer avec un TPE via sEcrit, sLit, ...

6 réponses
Avatar
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...

Merci de votre aide

6 réponses

Avatar
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
Avatar
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
Avatar
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.)
Avatar
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
Avatar
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...

_ENQ = 0x05
_STX = 0x02
_ETX = 0x03
_ACK = 0x06
_EOT = 0x04
_NAK = 0x15

FIN



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 )

// 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
Avatar
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)

sEvénement(_PortTPE,sEveBreak,"GestionEvenement")
sEvénement(_PortTPE,sEveCaractèreReçu,"GestionEvenement")
sEvénement(_PortTPE,sEveCTS,"GestionEvenement")
sEvénement(_PortTPE,sEveDSR,"GestionEvenement")
sEvénement(_PortTPE,sEveEnvoiTerminé,"GestionEvenement")
sEvénement(_PortTPE,sEveErreur,"GestionEvenement")
sEvénement(_PortTPE,sEveErreurImprimante,"GestionEvenement")
sEvénement(_PortTPE,sEveFileEntrée80,"GestionEvenement")
sEvénement(_PortTPE,sEveRing,"GestionEvenement")
sEvénement(_PortTPE,sEveRLSD,"GestionEvenement")

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

SINON
Trace("Erreur sur sFixeParamètre")
FIN

SINON
Trace("Erreur sur sOuvre")
FIN



PROCEDURE GestionEvenement(NumPort,myEvent)

Trace(" -> GestionEvenement (n° " + myEvent + ")")

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