IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

WinDev Discussion :

comment gérer un time out lors d'une reception d'une trame sur port série


Sujet :

WinDev

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 68
    Points : 50
    Points
    50
    Par défaut comment gérer un time out lors d'une reception d'une trame sur port série
    Bonjour,

    J'utilise un port COM rs232 (donc en UART) pour la reception de trame via le protocol "Cctalk".

    La particularité de ce protocol est qu'il n'utilise pas de marqueur de fin de string comme CR par exemple.
    La taille de la trame est contenue dans la trame elle même, il est donc impossible de savoir a l'avance combien de bytes seront contenu dans la trame.

    1er byte recus = adresse du destinataire.
    2eme byte = nbr de byte de data (0 à 200)
    3eme byte = adresse de la source (expediteur)
    4eme byte = header (ordre dela commande)
    5eme byte = data 0 à N
    ...
    dernier byte = checksum

    Mon probleme:

    j'ai créer un socket et un evenement pour gérer la reception des byte.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sEvénement(gnNumeroPortComOuvert,sEveCaractèreReçu,"gProc_LecturePortCom")

    cela fonctionne tres bien, je construit la trame de reception a chaque byte recus.
    Mais le probleme arrive si il manque un byte lors de le reception de la trame, c'est a dire du à un parasite par exemple.
    la trame se decalle et n'est jamais plus bien interpreter par le programme.

    il faudrait pouvoir reseter la reception de la trame, c'st a dire repositionner le programme de reception sur le 1er byte a recevoir si il n'y a plus de reception de byte apres 20 ms par exemple. donc créer une sorte de time out entre reception de byte.

    Mais comment faire ???

    Merci de votre aide.

  2. #2
    R&B
    R&B est déconnecté
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Mars 2005
    Messages : 571
    Points : 1 263
    Points
    1 263
    Par défaut
    Bonjour,
    rapidement, il semble que vous disposiez de toutes les information car comme vous l'indiquez :
    "La taille de la trame est contenue dans la trame elle même" => 5eme byte
    ... et ...
    dernier byte = checksum

    ce dernier byte permet de vérifier que la trame est juste (et donc ne comporte pas d'erreur)
    si la valeur à cette adresse ne correspond pas où n'est pas présente, il y a eu une erreur en réception. il faut sans doute relire le buffer (et faire une nouvelle demande).

  3. #3
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 947
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 947
    Points : 9 275
    Points
    9 275
    Par défaut
    hello,
    les traitements du protocole cctalk sont assez particuliers et nécessitent une bonne gestion des timings de la liaison série (en particulier les time out ) et des contrôles de checksums :
    /*
    * When receiving bytes within a message packet, the communication software should
    * wait up to 50ms for another byte if it is expected. If a timeout condition occurs, the
    * software should reset all communication variables and be ready to receive the next
    * message. No other action should be taken. (cctalk spec part1, 11.1)
    */

    Il existe des bibliothèques qui gèrent le protocole cctalk (par exemple cctalklib en dotnet) . Soit on utilise ces bibliothèques si cela est possible en windev, soit on s'inspire du code source de ces bibliothèques pour refaire les traitements en windev, soit on refait tout de A à Z .

    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

Discussions similaires

  1. Réponses: 3
    Dernier message: 30/05/2013, 07h05
  2. Réponses: 2
    Dernier message: 25/12/2010, 12h42
  3. Réponses: 0
    Dernier message: 27/07/2009, 19h23
  4. Réponses: 6
    Dernier message: 12/10/2008, 20h33
  5. [API java.net] gestion du time out et de nombre de conn max
    Par java_fun dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 02/11/2006, 23h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo