none
VB.net et communication TPE RRS feed

  • Question

  • Bonjour,

    Je développe un logiciel en VB.NEt qui doit communiquer avec un TPE. J'ai récupéré une documentation sur le protocole CONCERT, qui précise que je dois commencer par envoyer une requète ENQ, que le terminal doit me retopurner une réponse "ACK", et que je dois ensuite renvoyer la requète.

    Or, dès que j'envoie le ENQ, bien que le terminal me réponde "ACK", il affiche "FONCTION IMPOSSIBLE".

    Quelqu'un aurait-il déjà développé ce type d'application, ou rencontré ce problème, et pourrait m'orienter pour la communication avec le TPE ?

    Merci d'avance !


    pieret


    mardi 2 mai 2017 10:04

Réponses

  • Bonjour,

    J'ai finalement résolu mon problème. Au cas où d'autres personnes le rencontrent, voici ma solution :

    En fait, Le TPE récupérait bien mon ENQ, mais m'affichait fonction impossible parce que je n'envoyait pas assez tôt la requête suivante quand je mettais un point d’arrêt, et sans point d’arrêt, le calcul du checksum n'était pas bon.

    Voici mon code en VB.NET :

    Private Sub SimpleButton1_Click(sender As Object, e As EventArgs) Handles SimpleButton1.Click
            Try
                With SerialPort1
                    .PortName = "COM5"
                    .Handshake = IO.Ports.Handshake.XOnXOff
                    .BaudRate = 9600
                    .DataBits = 7
                    .Parity = IO.Ports.Parity.Even
                    .StopBits = IO.Ports.StopBits.One
                    .ReadTimeout = 1000000
                    .Encoding = Encoding.ASCII
                    .Open()
                End With
    
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
    
            Etat = 1
            SerialPort1.Write(Chr(5))
    
        End Sub
    
    
     Private Sub SerialPort1_DataReceived(sender As Object, e As SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
            Dim Buffer(SerialPort1.BytesToRead - 1) As Byte
            SerialPort1.Read(Buffer, 0, SerialPort1.BytesToRead)
            If SerialPort1.Encoding.GetString(Buffer) = Chr(vbACK) Then
                If Etat = 1 Then
                    Dim checksum As Integer = 0
                    Dim St_MontantCent As String = CInt(Montant * 100).ToString.PadLeft(8, "0")
    
                    'Dans la partie "constante : 1 indique que le champ REP sera dans la réponse du TPE, et le 0 indique un traitmeent de débit
                    Dim ChaineEvoi As String = Nocaisse & St_MontantCent & "1" & If(PaiementCheque, "C", "1") & "0978          " & Chr(3)
                    Dim byteChecksum As Byte
                    Dim strChar As Char
                    For Each strChar In ChaineEvoi
                        byteChecksum = byteChecksum Xor Convert.ToByte(strChar)
                    Next
                    ChaineEvoi = Chr(2) & ChaineEvoi & Convert.ToChar(byteChecksum)
                    SerialPort1.Write(ChaineEvoi)
                    Etat = 2
                Else
                    Dim tot As String = ""
                End If
            Else
                If SerialPort1.Encoding.GetString(Buffer) = Chr(15) Then
    
                End If
            End If
            SerialPort1.Close()
        End Sub

    Il me reste à traiter le retour du TPE après paiement.

    En espérant que ça dépanne certains !

      

    pieret

    • Marqué comme réponse glaudioman jeudi 4 mai 2017 09:01
    jeudi 4 mai 2017 09:01

Toutes les réponses

  • Bonjour,
    Avez-vous vérifié du côté du fabricant ou de la documentation de ce TPE en particulier que le protocole CONCERT est le protocole utilisé pour les échanges et également comment connecter l'ordinateur matériellement.

    Cordialement,
    Nina


    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    mercredi 3 mai 2017 09:20
    Modérateur
  • Bonjour,

    J'ai contrôlé plusieurs fois la documentation, et ai joint le constructeur.

    Le constructeur me dit que l'appareil n'arrive pas à interpréter ma requète. Pourtant, j'ai récupéré un logiciel de test de communication en console, il fonctionne bien.

    J'ai analysé les trames avec "serial port monitor", j'envoie bien les mêmes données.

    La seule chose que je n'aurais pas fait, qui est indiquée dans la doc, c'est que la communication doit fonctionner en "half dupleix". Or, sur le contrôle serialport, je n'ais toujours pas trouvé comment on peut paramétrer les échanges en "half dupleix".

    Cordialement

    Olivier


    pieret

    mercredi 3 mai 2017 09:58
  • Bonjour,

    J'ai finalement résolu mon problème. Au cas où d'autres personnes le rencontrent, voici ma solution :

    En fait, Le TPE récupérait bien mon ENQ, mais m'affichait fonction impossible parce que je n'envoyait pas assez tôt la requête suivante quand je mettais un point d’arrêt, et sans point d’arrêt, le calcul du checksum n'était pas bon.

    Voici mon code en VB.NET :

    Private Sub SimpleButton1_Click(sender As Object, e As EventArgs) Handles SimpleButton1.Click
            Try
                With SerialPort1
                    .PortName = "COM5"
                    .Handshake = IO.Ports.Handshake.XOnXOff
                    .BaudRate = 9600
                    .DataBits = 7
                    .Parity = IO.Ports.Parity.Even
                    .StopBits = IO.Ports.StopBits.One
                    .ReadTimeout = 1000000
                    .Encoding = Encoding.ASCII
                    .Open()
                End With
    
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
    
            Etat = 1
            SerialPort1.Write(Chr(5))
    
        End Sub
    
    
     Private Sub SerialPort1_DataReceived(sender As Object, e As SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
            Dim Buffer(SerialPort1.BytesToRead - 1) As Byte
            SerialPort1.Read(Buffer, 0, SerialPort1.BytesToRead)
            If SerialPort1.Encoding.GetString(Buffer) = Chr(vbACK) Then
                If Etat = 1 Then
                    Dim checksum As Integer = 0
                    Dim St_MontantCent As String = CInt(Montant * 100).ToString.PadLeft(8, "0")
    
                    'Dans la partie "constante : 1 indique que le champ REP sera dans la réponse du TPE, et le 0 indique un traitmeent de débit
                    Dim ChaineEvoi As String = Nocaisse & St_MontantCent & "1" & If(PaiementCheque, "C", "1") & "0978          " & Chr(3)
                    Dim byteChecksum As Byte
                    Dim strChar As Char
                    For Each strChar In ChaineEvoi
                        byteChecksum = byteChecksum Xor Convert.ToByte(strChar)
                    Next
                    ChaineEvoi = Chr(2) & ChaineEvoi & Convert.ToChar(byteChecksum)
                    SerialPort1.Write(ChaineEvoi)
                    Etat = 2
                Else
                    Dim tot As String = ""
                End If
            Else
                If SerialPort1.Encoding.GetString(Buffer) = Chr(15) Then
    
                End If
            End If
            SerialPort1.Close()
        End Sub

    Il me reste à traiter le retour du TPE après paiement.

    En espérant que ça dépanne certains !

      

    pieret

    • Marqué comme réponse glaudioman jeudi 4 mai 2017 09:01
    jeudi 4 mai 2017 09:01
  • Bonjour,

    Merci pour code , ça m'a aidé mais je rencontre encore des problèmes.

    En effet , mon code arrive à entrer dans la méthode SerialPort1_DataReceived , et on faisant le Write(chaineEnvoi)

    rien ne s'affciche à l'écran du terminal. Peut être ma chaine à envoyer est fausse. Je suis casi bloqué.

    ça sera gentil de ta part si tu met la totalité du code , au moins un exemple pour voir comment déclarer le montant et NoCaisse.

    Merci d'avance

     
    mercredi 16 octobre 2019 20:02