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

C Discussion :

Fixer le baudrate d'un socket


Sujet :

C

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2012
    Messages : 7
    Par défaut Fixer le baudrate d'un socket
    Bonjour à tous,

    Dans le cadre d'un de mes projets, je dois développer une application capable de lire un bus CAN et de réaliser un traitement selon les données lues.

    Le problème est que l'outil est sensé pouvoir être utilisé à des baudrates différents selon le bus utilisé.

    Je développe mon application en C, et donc j'utilise des sockets pour lire et envoyer des données sur le bus, et donc je me demandais si en utilisant par exemple la fonction IOCTL il y avait pas moyen de changer le baudrate de manière logicielle.

    J'utilise un module mcp251x.

    Voila, merci d'avance à ceux qui pourraient m'indiquer des pistes =) j'ai beau éplucher tous les headers à ma disposition je ne trouve pas grand chose :/


    EDIT : j'ai vu dans le fichier header ioctl.h qu'il y avait une fonction qui permettait de communiquer avec le hardware notamment _IOW(type,nr,size) mais je galère un peu pour l'utiliser, est-ce que quelqu'un aurait déjà eu à s'en servir? D'après ce que j'ai compris elle permet de créer des nombres IOCTL, mais je comprends pas trop comment on peut envoyer des infos si le HW est pas au courant qu'on veut lui parler.. :/

    sources : http://www.linuxtopia.org/online_books/Linux_Kernel_Module_Programming_Guide/x872.html
    http://unix.superglobalmegacorp.com/Net2/newsrc/sys/ioctl.h.html
    http://www.kernel.org/doc/Documentation/ioctl/ioctl-number.txt

  2. #2
    Membre chevronné
    Inscrit en
    Décembre 2010
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 290
    Par défaut
    Jamais entendu parler de ce bus.
    Je m'attendais à trouver qqchose au niveau de setsockopt(), mais à première vue y a rien qui concerne la vitesse de transmission.
    Est-ce qu'actuellement tu as déjà un projet qui fonctionne, à un baudrate fixé en dur ?

    p.-s. qui est assez sadique pour t'avoir confié un projet pareil ???

  3. #3
    Membre émérite
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Par défaut
    Salut,

    Il est très difficile de faire cela en C lorsque tu utilises les socket CAN.
    Le plus pratique c'est d'utiliser le programme /sbin/ip.

    # Exemple pour une interface can0 à 50Kbts
    /sbin/ip link set can0 up type can bitrate 50000
    Si tu veux vraiment le faire, essaye de voir comment le programme ip l'effectue. Il y a pas mal de structures à initialiser.

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2012
    Messages : 7
    Par défaut
    Salut et merci pour vos réponses! =)

    J'ai déjà un programme qui tourne oui et pour le moment je fixe mon baudrate exatement comme Elijha me l'indique avec ip.

    @phi1981 : le bus CAN est un bus de terrain principalement utilisé dans l'automobile. C'est mon projet de stage cet été en fait ^^ donc mon programme (au moins les fonctions basiques) est sensé fonctionner a priori sur n'importe quel véhicule. Qui dit véhicules différents, dit vitesses de communication pas forcément identique d'où ma question.

    @Elijha :
    pour le moment en fait j'ai un script shell qui donne ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #configure CAN module
    ip link set can0 type can bitrate 500000
    ifconfig can0 up
    #launch application
    /home/test
    au début je pensais faire un script qui tenterait de se connecter à plusieurs bitrate différents, et au lieu de lancer directement mon application, je lancerais un petit programme qui teste si la connection fonctionne bien. Mais je suis pas familier du tout de ce language d'une part et j'ai un peu peur que l'application mette du temps à se lancer :/ Y a t'il moyen de faire juste ip link set can0 type can bitrate 500000 dans une portion de programme C?

  5. #5
    Membre émérite
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Par défaut
    Salut
    Citation Envoyé par jalber11 Voir le message
    Y a t'il moyen de faire juste ip link set can0 type can bitrate 500000 dans une portion de programme C?
    Peut-être en utilisant la fonction exec(le/v) (voir man exec). Ensuite tu peux modifier ta chaine de commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    char commande[256] = 0 ;
    int bitrateCan[5] = { 50, 125, 250, 500, 1000 } ;
    int n = 2 ;    // Choix baudrate à 250KBits
     
    sprintf(commande, "ip link set can0 type can bitrate %d", (bitrateCan[n]*1000)) ;
    execv(commande) ;  // Tester tous les retours d'execv
    Je te donne pas plus d'informations car je n'ai jamais utilisé la commande execv. Renseigne toi avant de l'utiliser.

    Bonne continuation.

  6. #6
    Membre Expert
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Par défaut
    Salut,

    Citation Envoyé par jalber11 Voir le message
    je dois développer une application capable de lire un bus CAN et de réaliser un traitement selon les données lues.
    Où en es-tu de ton projet? Je pense que tu pars sur de mauvaises bases, car le CAN est un standard vraiment à part, inutilisable sur un support physique UART ou SPI ou autre qui sont quasiment de base sur PC, comme tu sembles le croire. A moins que je n'aie pas tout compris, tu n'a pas donné beaucoup d'infos. Il faut passer par un package interface CAN + driver + DLL (ou son équivalent linux) Il y a un truc très bien que j'utilise en python, mais comme il y a une dll, on peut l'utiliser en C. Il est livré avec un soft qui permet d'émettre et de recevoir des messages CAN et de configurer le baudrate. J'ai cru comprendre que tu allais développer la partie PC

    A+

    Pfeuh

  7. #7
    Membre émérite
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Par défaut
    Salut,

    Citation Envoyé par pfeuh Voir le message
    ... Je pense que tu pars sur de mauvaises bases, car le CAN est un standard vraiment à part, inutilisable sur un support physique UART ou SPI ou autre qui sont quasiment de base sur PC, comme tu sembles le croire.
    Il n'a jamais précisé sur quel type de support il travaillait. Moi même j'utilise une carte PCI avec deux bus CAN (SJA1000) et une sonde USB PEAK-PCAN (SJA1000) en passant par des sockets ou en mode RAW (en fonction du driver installé).
    La seule difficultée en utilisant les sockets, c'est que le baudrate ne peu être facilement modifiable qu'avec le mode RAW.
    Mais avec les sockets, quelque soit ton matériel, ton programme n'aura pas besoin d'être modifié. En mode RAW, tu seras obligé de modifier tes fonctions d'ouverture/lecture/écriture, voir même la structure des messages CAN sera différente (le timestamp, les retours d'erreurs, le codage de l'identifieur etc.).

    Pour reprendre un exemple, mes programmes utilisant le bus CAN par sockets fonctionnent aussi bien sur mon PC avec la carte PCI ou la sonde USB, et même sur une carte IMX35 (Freescale's ARM11) avec un MCP2515 en SPI et depuis peu avec un µC STM32F103 en SPI aussi.

    Je pense que le choix d'utilisation des sockets ou du mode RAW avec le bus CAN dépend du matériel et du domaine de l'application.

    Bonne journée.

  8. #8
    Membre Expert
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Par défaut
    Citation Envoyé par Elijha Voir le message
    Il n'a jamais précisé sur quel type de support il travaillait.
    Certes. Par contre j'ai survolé les sources du mcp251x dont il parle dans son premier post, et j'ai cru comprendre que ça passait par du SPI

  9. #9
    Membre émérite
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Par défaut
    Autant pour moi pfeuh, il parle bien du mcp251x

    Le mcp251x est bien un périphérique CAN piloté par un bus SPI. Les trames CAN émises/reçues par le mcp sont "encapsulées" dans des trames SPI.
    Elles sont converties par le driver qui les retournes sous forme de structure que nous connaissons bien et qui ressemble en gros à ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct canmsg {
        uint32_t id ;
        uint64_t timestamp ;
        uint8_t   dlc ;
        uint8_t   data[8] ;
    } ;
    Bon week-end.

  10. #10
    Membre Expert
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Par défaut
    Citation Envoyé par Elijha Voir le message
    Le mcp251x est bien un périphérique CAN piloté par un bus SPI.
    Ben voilà, j'ai appris quelque chose, merci!

  11. #11
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2012
    Messages : 7
    Par défaut
    Salut,
    désolé je réponds avec un peu de retard mais finalement toutes les questions que soulevait pfeuh ont été éludées par Elijha.

    Je vous avouerais que je ne me suis pas attardé sur la partie HW puisqu'en fait l'application que je dois faire tourne sur un module embarqué sur lequel je n'ai pas d'influence.. Je me suis arrêté à la partie logicielle si on peut dire et donc je sais que pour recevoir des données (ou en envoyer) sur le bus CAN j'utilise des socket comme cela : FileDescriptor = socket(PF_CAN, SOCK_RAW, CAN_RAW) pour me connecter et après recv / sendv pour lire / écrire. J'utilise ensuite une structure can_frame qui est définie dans linux/can.h et qui est à très peu de choses près pareille que celle que Elijha a décrite.

    Pour ce qui est de ma question originale, ce n'est pas l'option la plus importante donc j'ai mis ça de coté pour m'attaquer aux gros morceaux de mon code

  12. #12
    Membre émérite
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Par défaut
    Bonjour,
    Citation Envoyé par jalber11 Voir le message
    ... ont été éludées
    Et moi qui pensait avoir répondu à la question, serais-je passé à côté de quelque chose ?

  13. #13
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2012
    Messages : 7
    Par défaut
    Et moi qui pensait avoir répondu à la question, serais-je passé à côté de quelque chose ?
    Disons que je n'ai pas à y répondre car tu l'as fait avant moi (ça m'apprendra à faire le malin ^^)

    Au passage merci à vous deux pour vos réponses =)

  14. #14
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Je crois qu'il voulait dire qu'élucider serait plus approprié qu'éluder.

  15. #15
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Lycéen
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mars 2011
    Messages : 5
    Par défaut windev14 : utilisation de csp2GetDeviceId( )
    j'arive à me connecter au port com5 (par cable usb)
    comment utiliser ces fonctions en WINDEV 14

    // long CSP2_API csp2GetDeviceId( char cDeviceId[8], long nMaxDeviceIdSz );
    //
    // Description: Get the device ID number from the OPN-2001
    //
    // Parameters: cDeviceId[8] is the buffer where the device ID is copied into
    // nMaxDeviceIdSz is the maximum size of the szDeviceId buffer
    //
    // Important: In the cDeviceId buffer an Hex respresentation of the Device ID is placed
    //
    // Returns: 0L 0n success
    // < 0L on failure
    //
    long CSP2_API csp2GetDeviceId( char cDeviceId[8], long nMaxDeviceIdSz );
    ++++++++++++++++++

    // long CSP2_API csp2GetPacket( char szData[], long nBcrNr, long nMaxDataSz );
    //
    // Description: Get data that was stored in the internal buffer by the csp2ReadData function.
    //
    // Argument: szData[] buffer where the barcode data is stored in
    // nBcrNr the wanted barcode number starting from 0L
    // nMaxDataSz the maximum size of the szData buffer
    //
    // Returns: 0L on success
    // < 0L on failure
    //
    long CSP2_API csp2GetPacket( char szData[], long nBcrNr, long nMaxDataSz );

    ++++++++++++++++++++

    // long CSP2_API csp2ReadData( void );
    //
    // Description: Read all data from the OPN-2001 and store it in an
    // internal buffer. To read data from the internal buffer use
    // one of the functions below.
    // * csp2GetPacket()
    // * csp2GetDeviceId()
    // Returns: >= 0L
    The amount of barcodes that are collected
    // < 0L on failure
    long CSP2_API csp2ReadData( void );
    Images attachées Images attachées  

  16. #16
    Membre émérite
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Par défaut
    Bonjour,

    @zanaulrich ton sujet n'a aucun rapport avec celui traité précédèment. Tu devrais ouvrir directement un nouveau post ici www.developpez.net/forums/f18/c-cpp/c/ pour trouver de l'aide.

    Clique sur le bouton "Nouvelle discussion", met un titre, commence par bonjour et expose ton problème clairement. Pour le code sources utilises les balises [ code ] [ /code ] (bouton #).

    Bonne journée.

Discussions similaires

  1. Réponses: 2
    Dernier message: 22/10/2012, 11h19
  2. comment fixer le port de communication dans un socket
    Par dalilnet dans le forum Windows Forms
    Réponses: 2
    Dernier message: 29/07/2009, 19h04
  3. Fixer une adresse IP pour inititalisation d'un socket
    Par Oursdeglace dans le forum Réseau
    Réponses: 11
    Dernier message: 30/12/2007, 15h07
  4. executer une application a distance : Sockets ? RPC ? CORBA?
    Par a_hic dans le forum Développement
    Réponses: 5
    Dernier message: 30/05/2006, 13h02
  5. transfert d'un fichier bitmap en socket tcp
    Par localhost dans le forum C++Builder
    Réponses: 5
    Dernier message: 29/07/2002, 00h40

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