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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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!

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