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

Arduino Discussion :

Protocole non série ?


Sujet :

Arduino

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 105
    Par défaut Protocole non série ?
    Bonjour


    Je dois travailler au décodage d'un protocole et je ne parviens pas à identifier comment sont encodées les données.

    Voici la trace de 3 messages différents.

    Nom : traces.png
Affichages : 1304
Taille : 131,2 Ko

    A première vue cela ressemble a du RS485

    La largeur d'impulsion est de 5 micro secondes.
    Je m'attendais a retrouver un bit de start / stop régulièrement espacé dans le message or il n'en est rien. Ca ne ressemble pas a un message série de type (Start + 8 bit + parité + stop)

    Des idées de ce que ca pourrait être comme type d'encodage ?


    Merci d'avance

  2. #2
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 252
    Par défaut
    Salut,
    En effet les signaux différentielles font tout de suite penser à du RS485/422 mais ça pourrait tout aussi bien être un bus CAN (si je ne dis pas de bêtises ceux sont aussi des signaux différentielles) au quel cas c'est plus compliqué à décoder.

    Les signaux sont issus de quel appareil ?

  3. #3
    Modérateur

    Homme Profil pro
    Ingénieur électricien
    Inscrit en
    Septembre 2008
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur électricien

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 282
    Par défaut
    Bonsoir à tous

    C'est une trame série différentielle, mais qui n'est pas du RSxxx
    Le CAN, l'USB, le DVI/HDMI, l’Ethernet en RJ45, le SATA utilisent tous une communication série différentielle, sur une ou plusieurs paires.

    Bon ici cela ressemble quand bien à du CAN, la datasheet du MCP2515, chap 2, contient une bonne référence sur la trame du CAN.
    La longueur de la trame standard c'est 44 + 8N bits et celle de la trame étendue c'est 64+8N, avec N=0 à 8, avec un start bit visible, et 7 stop bits non visible à la fin. Le dernier bit dominant est le "acknowledge" et est émis par le récepteur, ce qui semble être le cas ici car la tension n'est pas identique.

    Bon décodage

    Delias

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 105
    Par défaut
    Merci beaucoup, effectivement mes recherches m'ont amenées à pencher pour le CanBus. Les tensions sont cohérentes avec les spécifications.

    La prise est une prise DVI mais ce n'est pas de la video qui est passée sur ce cable (un autre apapreil est sur le même bus avec une prise 4 pin hirose ) - matériel d'optique.

    Je me suis commandé une carte Arduino / CAnBus. J'espère l'avoir assez vite pour voir ce que ca donne.

    Merci pour votre aide.

  5. #5
    Membre Expert
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Par défaut
    Hello

    Citation Envoyé par Delias Voir le message
    C'est une trame série différentielle, mais qui n'est pas du RSxxx
    Le CAN, l'USB, le DVI/HDMI, l’Ethernet en RJ45, le SATA utilisent tous une communication série différentielle, sur une ou plusieurs paires.
    Dans la liste on peut virer :
    DVI / HDMI : 200kHz c'est beaucoup trop lent pour ça.
    Ethernet : modulation QAM -> ça devrait ressembler à l'union de 2 sinusoïdes.

    Pour le reste, aucune idée.

    (Marrant comme les pics en début d'impulsion sont doublés, je pensais que comme le bruit c'était divisé par deux avec du différentiel.)

  6. #6
    Modérateur

    Homme Profil pro
    Ingénieur électricien
    Inscrit en
    Septembre 2008
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur électricien

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 282
    Par défaut
    Bonsoir Iradrille

    Ce que je voulais dire avec tous ces formats, c'est que "série différentiel <=> RS485" est un abus de langage, le RS485 était probablement le plus répandu, mais il n'est pas le seul.
    Après le CAN doit être le seul de la liste qui utilise le même niveau de tension et de vitesse que le RS485, les autres ont d'autres tensions et/ou d'autres vitesses.

    Bonne soirée

    Delias

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 105
    Par défaut
    Finalement avec mon oscilo j'ai réussi a décoder le message; Donc c'est bien du canbus.

    Nom : candecode.png
Affichages : 1185
Taille : 9,7 Ko

    Par ailleurs j'ai recu ce matin mon CanBusShield (SeeedStudio). Il est arrivé en moins de 48h !
    Et là : grosse déception, ca ne marche pas.
    Le shield s'initialise correctement mais il ne capte pas de données. Pourtant je vois que la LED RX clignote quand des données sont présente sur le bus.
    J'ai tenté toutes les vitesses de bus, rien n'y fait.

    J'ai vérifié le CANH/CANL (si j'interverti la LED RX ne clignote pas).

    Est ce que ca peut être que mon signal est un peu moche ?
    Sur l'oscillo j'ai du ajuster finement les niveaux pour parvenir à décoder (hyterisis de seulement 200mV pour ne pas avoir d'erreurs) ?

    J'ai utilisé le code des exemples fournis avec la lib

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    #include <SPI.h>
    #include "mcp_can.h"
     
    // the cs pin of the version after v1.1 is default to D9
    // v0.9b and v1.0 is default D10
    const int SPI_CS_PIN = 9;
     
    MCP_CAN CAN(SPI_CS_PIN);                                    // Set CS pin
     
    unsigned char speeds[] = { CAN_5KBPS,CAN_10KBPS,CAN_20KBPS,CAN_25KBPS,CAN_31K25BPS,CAN_33KBPS,CAN_40KBPS,CAN_50KBPS,CAN_80KBPS,CAN_83K3BPS,CAN_95KBPS,CAN_100KBPS,CAN_125KBPS,CAN_200KBPS,CAN_250KBPS,CAN_500KBPS,CAN_666KBPS,CAN_1000KBPS};
    String speedslib[]={"CAN_5KBPS","CAN_10KBPS","CAN_20KBPS","CAN_25KBPS","CAN_31K25BPS","CAN_33KBPS","CAN_40KBPS","CAN_50KBPS","CAN_80KBPS","CAN_83K3BPS","CAN_95KBPS","CAN_100KBPS","CAN_125KBPS","CAN_200KBPS","CAN_250KBPS","CAN_500KBPS","CAN_666kbps","CAN_1000KBPS"};
    unsigned char flagRecv = 0;
    unsigned char len = 0;
    unsigned char buf[8];
    char str[20];
     
    void setup()
    {
        Serial.begin(115200);
        unsigned char speed = getspeed();
       // unsigned char speed= CAN_200KBPS;
    	while (CAN_OK != CAN.begin(speed))              // init can bus : baudrate = 200k
        {
            Serial.println("CAN BUS Shield init fail");
            Serial.println(" Init CAN BUS Shield again");
            delay(100);
        }
        Serial.println("CAN BUS Shield init ok!");
     
     
    }
     
    unsigned char getspeed() {
     
    	int speedindex=-1;
     
    		for (int i =0; i<18;i++) {
    			Serial.print("[");
    			//Serial.print(i+65);
    			Serial.write(i+65);
    			Serial.print("] ");
    			Serial.println(speedslib[i]);
    		}
    		Serial.println(">>");
    		while ( (speedindex<0 || speedindex>17)) {
    			while (Serial.available()) {
    			char c = Serial.read();
    			speedindex=c-65;
    			if ( (speedindex>=0 && speedindex<17)) {
    				Serial.println(speedslib[speedindex]);
    				return speeds[speedindex];
    			} else {
    				Serial.println("Speed unknown - try again\n>>");
    			}
    			}
    		}
    		return CAN_200KBPS;
    }
     
    void loop()
    {
        unsigned char len = 0;
        unsigned char buf[8];
     
     
     
        if( CAN_MSGAVAIL == CAN.checkReceive())            // check if data coming
        {
            CAN.readMsgBuf(&len, buf);    // read data,  len: data length, buf: data buf
     
            unsigned int canId = CAN.getCanId();
     
            Serial.println("-----------------------------");
            Serial.print("Get data from ID: ");
            Serial.println(canId, HEX);
     
            for(int i = 0; i<len; i++)    // print the data
            {
                Serial.print(buf[i], HEX);
                Serial.print("\t");
            }
            Serial.println();
        }
    }

Discussions similaires

  1. protocole interface série Ethernet
    Par Emcy dans le forum Développement
    Réponses: 3
    Dernier message: 15/09/2008, 16h01
  2. Réponses: 2
    Dernier message: 03/03/2008, 15h02
  3. Reverse engeneering protocole port série.
    Par tazio dans le forum Windows
    Réponses: 1
    Dernier message: 10/05/2007, 17h20
  4. [API] Communication série NON-bloquante : OVERLAPPED/Thread
    Par Rodrigue dans le forum C++Builder
    Réponses: 2
    Dernier message: 07/11/2003, 13h43
  5. Ping sous protocole TCP (et non UDP)
    Par ovdz dans le forum Développement
    Réponses: 2
    Dernier message: 19/06/2003, 14h10

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