Nous sommes en train de développer une application caisse en liaison
avec un terminal TPE INGENICO.
Le TPE est connecté sur le port Serie 2
Mais nous n'arrivons pas à envoyer le montant sur le terminal et nous
n'arrivons pas à récupérer les messages du terminal
Merci de votre aide
Nous avons écrit les ordres Suivant
PortTPE est une constante = 2
ChENQ = Caract(5)
ChEtx = Caract(3)
ChStx = Caract(2)
sOuvre(PortTPE,256,256)
sEcrit(PortTPE,ChENQ)
lcmontant = "00" + NumériqueVersChaine((pnmontant*100),"08d")+ChEtx
lnresultat = CalculLRC(lcmontant)
sEcrit(PortTPE,ChSTX+lcmontant+Caract(lnresultat))
PROCEDURE CalculLRC(pctexte)
lnind est un entier
lnval est un entier
lnou est un entier
lnou = Asc(Gauche(pctexte,1))
POUR lnind = 1 A Taille(pctexte)
lnval=Asc(Milieu(pctexte,1))
lnou = OuExclusifBinaire(lnou,lnval)
FIN
SI lnou>127 ALORS lnou = lnou - 128
RENVOYER lnou
> Le TPE est connecté sur le port Serie 2
> Mais nous n'arrivons pas à envoyer le montant sur le terminal et nous
> n'arrivons pas à récupérer les messages du terminal
Avez-vous paramétré correctement la vitesse de transmission, la parité
etc...
Cf sFixeParametre.
--
Romain PETIT
http://cerbermail.com/?IJmancZl88
(cliquez sur le lien ci-dessus pour me contacter en privé)
cela ne change rien
> Nous avons modifié les paramétres en utilisant la fonction
> sFixeParamètre(PortTPE, 1200, 1, 7, 0)
>
> cela ne change rien
Bonjour,
Deux idées en passant:
- n'y a-t-il pas un cache dont il faudrait forcer le vidage ?
- si vous essayez d'envoyer par la suite d'autres chaînes au terminal,
les premiers caractères envoyés sont-il récupérés ?
Ce problème me rappelle des soucis rencontrés il y a déjà pas mal
d'années sous WD 4.1 avec une imprimante série.
Si mes souvenirs sont bons, ce problème avait été résolu grâce à un des
switches présents sur l'imprimante.
Par contre nous utilisions des commandes iImprime et non une
communication directe sur le port série...
--
Pascal
> Bonjour,
>
> Nous sommes en train de développer une application caisse en liaison
> avec un terminal TPE INGENICO.
>
[Cut les sources prog]
> lcmontant = "00" + NumériqueVersChaine((pnmontant*100),"08d")+ChEtx
>
> lnresultat = CalculLRC(lcmontant)
je ne sais si le calcul du xor sur la chaine est bon,
dans beaucoup d'application j'ai
lnresult = calculrc(chStx+lcmontant)
secrit(portPE,chStx+lcmontant+lnresult+chEtx)
La verification de la chaine recue se fait sur chetx et non chstx
juste une idée.
Eric
--
Ceci est une signature automatique de MesNews.
Site : http://mesnews.no-ip.com
si TerminalTPE = 0 alors ferme
si NbreOperations = 0 alors ferme
ii,jj,LRC est un entier long
Donnees est une chaine
ACK,ENQ,STX,ETX sont des chaines
TempsInit,TempsEnCours est un entier long
Reponse sont des chaines
Indice est un entier long
MontantTransaction est reel double
TypeReglement est un entier long
TimeOut est un entier long = 500
Essai est un entier
Suite est un booleen
wtest est un booleen = faux
testCh est une chaine
testii est un entier long
numfic est un entier long
wtest = faux
si wtest alors numfic = fouvre("c:\tmp\resultat.txt",focreation+fotexte)
global
abandon est un booleen
STX=caract(2)
ETX=caract(3)
ENQ=caract(5)
ACK=caract(6)
abandon = faux
/////////////////////////////////////////////////////////////////////////////////
//
//
// Ouverture du Port
//
//
//
/////////////////////////////////////////////////////////////////////////////////
sferme(TerminalTPE)
si pas souvre(TerminalTPE,2000,2000,1000) alors
erreur("Impossible d'ouvrir le port COM"+TerminalTPE)
ferme
fin
si pas sfixeparametre(TerminalTPE,1200,1,7,0) alors
erreur("Impossible fixer paramètres du port COM"+TerminalTPE)
ferme
fin
pour Indice = 0 à NbreOperations-1
MontantTransaction = extraitchaine(lignecommande(),(Indice*2)+3," ")
TypeReglement = extraitchaine(lignecommande(),(Indice*2)+4," ")
selon TypeReglement
cas 2 // Cheque
INFOS="Chèque
"+sansespace(numeriqueverschaine(MontantTransaction,"15,2fS"))+caract(128)
Donnees="01"+verschaine(MontantTransaction*100,"08d")+"1C0978"+repete("X",10)+ETX
autres cas // CB
INFOS="Carte Bancaire
"+sansespace(numeriqueverschaine(MontantTransaction,"15,2fS"))+caract(128)
Donnees="01"+verschaine(MontantTransaction*100,"08d")+"110978"+repete("X",10)+ETX
fin
multitache()
/////////////////////////////////////////////////////////////////////////////////
//
//
// Calcul LRC
//
//
//
/////////////////////////////////////////////////////////////////////////////////
LRC=0
pour ii = 1 à taille(Donnees)
LRC=ouexbinaire(LRC,asc(Donnees[[ii]]))
FIN
Donnees=STX+Donnees+caract(LRC)
/////////////////////////////////////////////////////////////////////////////////
//
//
// Vidage des eventuels caractères polluant le COM
//
//
//
/////////////////////////////////////////////////////////////////////////////////
tantque sdansfileentree(TerminalTPE) > 0
multitache(-1)
Reponse=slit(TerminalTPE,sdansfileentree(TerminalTPE))
testCh=""
pour testii = 1 à taille(Reponse)
testCh+=asc(Reponse[[testii]])+" "
FIN
si wtest alors
fecritligne(NumFic,"Vidage du port com "+Reponse+" "+testCh)
fin
FIN
Essai = 0
Suite = faux
tantque pas Suite
Essai++
si Essai > 3 alors
erreur("pas de réponse du TPE après l'initialisation")
sferme(TerminalTPE)
ferme
FIN
si wtest alors
fecritligne(NumFic,"envoi ENQ essai = "+Essai)
fin
si pas secrit(TerminalTPE,ENQ) alors
erreur("Impossible d'envoyer l'ENQ")
sferme(TerminalTPE)
ferme
FIN
Reponse=""
TempsInit=heureversentier(heuresys())
tantque pas Suite
multitache(-1)
TempsEnCours=heureversentier(heuresys())
si TempsEnCours-TempsInit > TimeOut alors // Pas de reponse pendant 2
secondes
secrit(TerminalTPE,ENQ)
si wtest alors
fecritligne(NumFic,"Envoi ENQ Timeout")
fin
sortir
fin
si sdansfileentree(TerminalTPE) > 0 alors
Reponse+=slit(TerminalTPE,sdansfileentree(TerminalTPE))
si wtest alors
testCh=""
pour testii = 1 à taille(Reponse)
testCh+=asc(Reponse[[testii]])+" "
FIN
fecritligne(NumFic,"Lecture port com "+Reponse+" "+testCh)
fin
fin
si taille(Reponse) > 0 alors
si Reponse[[1]] <> ACK alors
secrit(TerminalTPE,ENQ)
si wtest alors
fecritligne(NumFic,"Pas ACK renvoi ENQ")
fin
sortir
FIN
Suite = vrai
fin
FIN
fin
si wtest alors
fecritligne(NumFic,"Envoi Données")
fin
si pas secrit(TerminalTPE,Donnees) alors
erreur("Impossible d'envoyer les données au terminal")
sferme(TerminalTPE)
ferme
FIN
TempsInit=heureversentier(heuresys())
tantque sdansfileentree(TerminalTPE) = 0
si wtest alors
fecritligne(NumFic,"Attente reponse apres donnees")
fin
multitache(-1)
TempsEnCours=heureversentier(heuresys())
si TempsEnCours-TempsInit > TimeOut alors // Pas de reponse pendant 2
secondes
erreur("Impossible d'envoyer les données au terminal (boucle attente)")
sferme(TerminalTPE)
ferme
fin
FIN
Reponse=""
TempsInit=heureversentier(heuresys())
tantque sdansfileentree(TerminalTPE) > 0
si wtest alors
fecritligne(NumFic,"Acquisition reponse apres envoi données")
fin
multitache(-1)
TempsEnCours=heureversentier(heuresys())
si TempsEnCours-TempsInit > TimeOut alors // Pas de reponse pendant 2
secondes
erreur("Pas de réponse du terminal après données")
sferme(TerminalTPE)
ferme
fin
Reponse+=slit(TerminalTPE,sdansfileentree(TerminalTPE))
FIN
si wtest alors
testCh=""
pour testii = 1 à taille(Reponse)
testCh+=asc(Reponse[[testii]])+" "
FIN
fecritligne(NumFic,"Réponse après données "+Reponse+" "+testCh)
fin
si wtest alors
fecritligne(NumFic,"J'envoie 1 EOT")
fin
si pas secrit(TerminalTPE,EOT) alors
erreur("Impossible d'envoyer EOT")
sferme(TerminalTPE)
ferme
FIN
abandon=faux
jj=0
boucle
si wtest alors
fecritligne(NumFic,"J'attends le EOT final du TPE nbre recu "+jj)
fin
si abandon alors sortir
multitache(-1)
si sdansfileentree(TerminalTPE) <> 0 alors
Reponse=slit(TerminalTPE,sdansfileentree(TerminalTPE))
si wtest alors
testCh=""
pour testii = 1 à taille(Reponse)
testCh+=asc(Reponse[[testii]])+" "
FIN
fecritligne(NumFic,"Attente fin "+Reponse+" "+testCh)
fin
si position(Reponse,eot) > 0 alors
si wtest alors
fecritligne(NumFic,"Reception EOT Sortie")
fin
sortir
fin
si position(Reponse,ENQ) > 0 alors
si wtest alors
fecritligne(NumFic,"Reception ENQ -> Envoi ACK")
fin
secrit(TerminalTPE,ACK)
FIN
si position(Reponse,ETX) > 0 alors
si wtest alors
fecritligne(NumFic,"Reception ETX -> Envoi ACK")
fin
secrit(TerminalTPE,ACK)
FIN
fin
FIN
multitache(-10)
fin
si wtest alors fferme(NumFic)
//pour ii = 1 à 3
// secrit(TerminalTPE,EOT)
//FIN
sferme(TerminalTPE)
ferme