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++Builder Discussion :

Communication via USB


Sujet :

C++Builder

  1. #1
    Membre éprouvé
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    novembre 2003
    Messages
    831
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : novembre 2003
    Messages : 831
    Points : 997
    Points
    997
    Par défaut Communication via USB
    Bonjour

    Je dois piloter un système via un port USB. Mais j'ai du mal à voir comment faire ça avec CBuilder.

    Après quelques recherche j'ai vu la librairie libusb mais j'ai des soucis pour la faire tourner avec CBuilder. Voici l'erreur que j'ai à l'édition des liens
    [ilink32 Erreur] Error: 'D:\LIBCPP\LIBUSB\MS32\STATIC\LIBUSB-1.0.LIB' contient un enregistrement OMF non valide, type 0x21 (COFF possible)

    Sinon mon port USB doit se comporter comme un port com. Je sais qu'on peut affecter un port COM à un port USB sous windows du coup je pourrais peut être me passer de libusb?

    Merci
    Il y a des jours où j'éprouve une haine profonde envers microsoft
    Venez vous défouler ici ou c'est amusant
    Mon modeste site et mes modestes oeuvres sont
    Rémi

  2. #2
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    mars 2002
    Messages
    868
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : mars 2002
    Messages : 868
    Points : 1 871
    Points
    1 871
    Par défaut
    Salut mon Ami
    quand je vois COFF je vois Microsoft!
    ce format est incompatible avec les compilateurs Borland
    pas de souci il te suffit de recrèer la librarie avec l'outil de Borland Implib

    Cordialement
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  3. #3
    Membre éprouvé
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    novembre 2003
    Messages
    831
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : novembre 2003
    Messages : 831
    Points : 997
    Points
    997
    Par défaut
    Argh je l'avais oublié celui là.
    Voilà la ligne de commande que j'ai faite:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ImpLib libusb.lib libusb-1.0.dll
    et ça compile maintenant.
    Il y a des jours où j'éprouve une haine profonde envers microsoft
    Venez vous défouler ici ou c'est amusant
    Mon modeste site et mes modestes oeuvres sont
    Rémi

  4. #4
    Membre actif Avatar de Argol_Medusa
    Homme Profil pro
    Ingénieur Radiofréquences
    Inscrit en
    août 2005
    Messages
    204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Radiofréquences
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : août 2005
    Messages : 204
    Points : 233
    Points
    233
    Par défaut
    Citation Envoyé par Gouyon Voir le message
    Sinon mon port USB doit se comporter comme un port com. Je sais qu'on peut affecter un port COM à un port USB sous windows du coup je pourrais peut être me passer de libusb?
    Merci
    Si tu dois le faire se comporter comme un port com, après l'avoir défini en tant que tel la première étape c'est de lire la liste des ports com disponibles dans la base de registre et mettre tout ça dans une ComboBox :

    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
     
    #include <Registry.hpp>
     
    void __fastcall TForm1::ComboBox1Enter(TObject *Sender)
    {
    	  TStringList* availableComPorts;
              availableComPorts = new TStringList();
    	  TRegistry *Registry = new TRegistry(KEY_READ);
    	  AnsiString portNb ="";
     
    	  Registry->RootKey = HKEY_LOCAL_MACHINE;
    	  Registry->OpenKey("HARDWARE\\DEVICEMAP\\SERIALCOMM", false);
    	  Registry->GetValueNames(availableComPorts);
    	  for (int i(0); i < availableComPorts->Count; i++)
    	  {
    		  portNb = Registry->ReadString(availableComPorts->Strings[i]);
    		  ComboBox1->AddItem(portNb, NULL);
    	  }
    	  delete Registry;
    	  delete availableComPorts;
    }

    Après on initialise le port com et on envoie les données. Un exemple :

    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
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    	/*! Definir le nom du port */
    	UnicodeString ComPort = this->ComboBox1->Text;
    	static HANDLE Handle_Com=NULL;
     
    	/*! Ouvrir le com port */
    	if (Handle_Com == NULL)
    	{
    		Handle_Com = CreateFile(ComPort.w_str(),
    								 GENERIC_READ | GENERIC_WRITE,
    								 0, 0,
    								 OPEN_EXISTING,
    								 0,0);
    	  // SET THE COMM TIMEOUTS IN OUR EXAMPLE.
    	  COMMTIMEOUTS ctmoNew = {0}, ctmoOld;
    	  GetCommTimeouts(Handle_Com,&ctmoOld);
     
    	  ctmoNew.ReadTotalTimeoutConstant = 10;
    	  ctmoNew.ReadTotalTimeoutMultiplier = 0;
    	  ctmoNew.WriteTotalTimeoutMultiplier = 0;
    	  ctmoNew.WriteTotalTimeoutConstant = 0;
     
    	  SetCommTimeouts(Handle_Com, &ctmoNew);
     
    	  // SET BAUD RATE, PARITY, WORD SIZE, AND STOP BITS.
    	  // THERE ARE OTHER WAYS OF DOING SETTING THESE BUT THIS IS THE EASIEST.
    	  DCB dcbCommPort;
    	  dcbCommPort.DCBlength = sizeof(DCB);
    	  GetCommState(Handle_Com, &dcbCommPort);
    	  UnicodeString ConfigTxt = "9600,N,8,1";
    	  BuildCommDCB(ConfigTxt.w_str(), &dcbCommPort);
    	  SetCommState(Handle_Com, &dcbCommPort);
     
    	  /*! Balancer un message d'erreur si ouverture du port com impossible */
    	  if(Handle_Com == INVALID_HANDLE_VALUE)
    	  {
    			Memo1->Lines->Add("Impossible d'ouvrir le port COM");
    			Handle_Com = NULL;
    	  }
    	  else
    	  {
    			Memo1->Lines->Add("Port COM ouvert avec succes");
     
    			/* Activer la RS232 */
    			this->Memo1->Lines->Add("Activation RS232");
    				/* Envoyer une trame et regarder si elle revient */
    			bool Identique1 = EnvoyerTrameSurRS232EtRecupererLaReponse(Handle_Com);
     
     
     
             	if (Identique1==true)
    			{
    				Label1->Color=clLime;
    				Label1->Caption="OK";
    			}
    			else
    			{
    				Label1->Color=clRed;
    				Label1->Caption="KO";
    			}
     
     
     
    			Sleep(500);
     
    			/* Fermer le port COM */
    			PurgeComm(Handle_Com, PURGE_RXABORT);
    			CloseHandle(Handle_Com);
    			Handle_Com=NULL;
    			Memo1->Lines->Add("Port COM1 fermé avec succes");
    	  }
    	}
    	else
    	{
    			// fermer le port com
    			Memo1->Lines->Add("Erreur : Port COM1 déja ouvert");
    			PurgeComm(Handle_Com, PURGE_RXABORT);
    			CloseHandle(Handle_Com);
    			Handle_Com=NULL;
    	}
    }

    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
     
    bool TForm1::EnvoyerTrameSurRS232EtRecupererLaReponse(HANDLE Handle_Com1)
    {
    	/* Envoyer un message sur le port COM */
    	char Message[34]="Pleine puissance Monsieur Solo !!\0";
    	unsigned long int writtenbytes=0;
    	WriteFile(Handle_Com1, &Message[0], 34, &writtenbytes, NULL);
    	this->Memo1->Lines->Add("Sending message");
    	/* Recevoir la reponse */
    	Sleep(500);
    	this->Memo1->Lines->Add("Receiving message");
    	char Rx_Buffer[100];
    	memset(&Rx_Buffer[0],0,100);
    	unsigned long NbOctetsLus=0;
    	ReadFile(Handle_Com1,&Rx_Buffer[0],  34, &NbOctetsLus,  NULL);
    	AnsiString tst1=Rx_Buffer;
    	AnsiString tst2=Message;
     
    	this->Memo1->Lines->Add(tst1);
     
    	bool Returned_Value=false;
    	if (tst1 == tst2)
    		Returned_Value=true;
    	return(Returned_Value);
    }

    Bon c'est à adapter en fonction de ton besoin, mais c'est un exemple de base fonctionnel qui devrait te permettre de commencer.

    P.S : désolé pour l'indentation pourrie, c'est le copier / coller qui a fait des trucs bizarres, c'est bien indenté normalement
    Désolé, on savait pas que c'était impossible, alors on l'a fait

  5. #5
    Membre éprouvé
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    novembre 2003
    Messages
    831
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : novembre 2003
    Messages : 831
    Points : 997
    Points
    997
    Par défaut
    Merci pour toutes ces informations. Et pas de soucis pour l'indentation "pourrie" un petit Ctrl D arrangera tout ça
    Il y a des jours où j'éprouve une haine profonde envers microsoft
    Venez vous défouler ici ou c'est amusant
    Mon modeste site et mes modestes oeuvres sont
    Rémi

  6. #6
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    mars 2002
    Messages
    868
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : mars 2002
    Messages : 868
    Points : 1 871
    Points
    1 871
    Par défaut
    Salut
    il existe également d'excellent composants qui simplifient considérablement la programmation des PortCom
    par exemple le composant TComPort
    plusieurs tuto sur ce site
    https://petit.developpez.com/serie/cours_tcomport/ et
    https://trote.developpez.com/tutorie...ar-rad-studio/

    cdlt
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  7. #7
    Membre actif Avatar de Argol_Medusa
    Homme Profil pro
    Ingénieur Radiofréquences
    Inscrit en
    août 2005
    Messages
    204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Radiofréquences
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : août 2005
    Messages : 204
    Points : 233
    Points
    233
    Par défaut
    Merci pour l'astuce du CTRL-D

    Citation Envoyé par DjmSoftware Voir le message
    Salut
    il existe également d'excellent composants qui simplifient considérablement la programmation des PortCom
    par exemple le composant TComPort
    Oui c'est ce que j'utilisais avant, et puis j'ai migré de 2010 à XE3, puis de XE3 à rio 10.2 et là tu te retrouves avec un TCOMPort qui ne tourne que sur une version et pas sur les 2 à la fois, obligé de passer sur une image viturelle, et puis après il faut bien reinstaller le composant dès que tu changes de PC pour un autre, bref, j'ai laissé tombé (parce que j'avais pas que le TComPort, j'avais aussi le TJoystick et tout un tas de composants dans le genre.

    Dommage parce qu'effectivement c'est sympa aussi le TComPort, mais si tu utilises plusieurs versions du C++ builder, ou plusieurs machines de développement différentes, c'est chiant à la longue.
    Par contre si tu utilises une version et que tu la gardes des années et des années, c'est une bonne solution oui.
    Désolé, on savait pas que c'était impossible, alors on l'a fait

  8. #8
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    mars 2002
    Messages
    868
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : mars 2002
    Messages : 868
    Points : 1 871
    Points
    1 871
    Par défaut
    Salut
    je ne peux que te conseiller un des meilleurs pack gratuits de composants spécialisés dans le traitement de la comm
    AsyncPro disponible gratuitement dans le gestionnaire de Package Getit
    cordialement

    extrait:
    TurboPack AsyncPro
    Updated for 10.3 Rio / VER330 / PKG 260
    You can still access 10.2 Tokyo and 10.1 Berlin too.
    Table of contents
    Introduction
    Package names
    Installation

    1. Introduction
    Async Professional is a comprehensive communications toolkit for Embarcadero Delphi and C++Builder. It provides direct access to serial ports, TAPI, and the Microsoft Speech API. It supports faxing, terminal emulation, VOIP, & more.
    This is a source-only release of TurboPack AsyncPro. It includes designtime and runtime packages for Delphi and C++Builder and supports Win32. Win64 support is experimental!

    Package names
    TurboPack AsyncPro package names have the following form:
    Delphi
    AsyncProDR.bpl (Delphi Runtime)
    AsyncProDD.bpl (Delphi Designtime)
    C++Builder
    AsyncProCR.bpl (C++Builder Runtime)
    AsyncProCD.bpl (C++Builder Designtime)

    Installation
    AsyncPro is available via the GetIt Package Manager where you can quickly and easily install and uninstall it.
    To manually install TurboPack AsyncPro into your IDE, take the following steps:
    Unzip the release files into a directory (e.g., d:\AsyncPro).
    Start RAD Studio.
    Add the source subdirectory (e.g., d:\AsyncPro\source) to the IDE's library path. For CBuilder, add the hpp subdirectory (e.g., d:\AsyncPro\source\hpp\Win32\Debug) to the IDE's system include path.
    Open & compile the runtime package specific to the IDE being used.
    Open & install the designtime package specific to the IDE being used. The IDE should notify you the components have been installed.
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

Discussions similaires

  1. communication via usb
    Par loicog dans le forum APIs
    Réponses: 1
    Dernier message: 22/05/2013, 15h36
  2. Communication via un port USB
    Par insane1 dans le forum C#
    Réponses: 3
    Dernier message: 23/02/2011, 00h05
  3. Réponses: 0
    Dernier message: 27/03/2010, 14h16
  4. Communication de données via USB
    Par nico57600 dans le forum Langage
    Réponses: 0
    Dernier message: 10/02/2010, 19h45
  5. communication via USB
    Par archer dans le forum C++
    Réponses: 0
    Dernier message: 10/01/2008, 11h59

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