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 :

communication port RS232 ( serie)


Sujet :

C++

  1. #1
    Membre du Club
    Inscrit en
    Avril 2004
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 92
    Points : 44
    Points
    44
    Par défaut communication port RS232 ( serie)
    bonjour

    je dois faire communiquer une telecommande branché via le port serie sur mon application 3d temps reelle.

    je suis parti du code fait par farscape dans la faq VC++. j'ai essayer de faire quelques tests mais j'arrive à rien du tout.

    voici quelques informations que j'ai sur mes trames:
    asynchrone unidirectionnelle ( telecommande vers le pc )
    vitesse : 19200 Bauds
    mots de 8 bits
    1 bit de start
    1 bit de stop
    pas de parité

    avec une trame de 23 caractere ( 1 debut, 20 contenu, 2 fin ).

    si quelqu'un pouvait m'aider ?

  2. #2
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Je te recommande chaudement boost.asio
    Ca va grandement te simplifier la vie...
    Et puis, il parait que d'ici pas longtemps il va y avoir un tuto sur Boost.Asio justement... Ca t'aidera sûrement !

  3. #3
    Membre du Club
    Inscrit en
    Avril 2004
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 92
    Points : 44
    Points
    44
    Par défaut
    merci beaucoup de ta reponse rapide. je vais jeter un oeil à ça je connaissais pas.

    je vous tiendrais au courant si j'arrive à faire tourner mon truc avec ça.

  4. #4
    Membre du Club
    Inscrit en
    Avril 2004
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 92
    Points : 44
    Points
    44
    Par défaut
    alors j'ai essayé de regarder boost asio mais j'ai pas reussi à l'installer/ configurer correctement avec visual c++. alors si quelqu'un a une autre solution ou bien m'aider sur boost asio

    merci

  5. #5
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Pas de problème, on va t'aider. Boost.Asio est vraiment une excellente solution.
    Tu as quelle version de visual C++ ?

  6. #6
    Membre du Club
    Inscrit en
    Avril 2004
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 92
    Points : 44
    Points
    44
    Par défaut
    alors j'ai visual c++ 2005 je tourne sur windows XP

  7. #7
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Ok alors c'est très facile... Voir le lien suivant :
    -> http://arb.developpez.com/c++/boost/install/vc++/

  8. #8
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Citation Envoyé par poukill Voir le message
    Ok alors c'est très facile... Voir le lien suivant :
    -> http://arb.developpez.com/c++/boost/install/vc++/
    Et ici un autre tuto sur Boost.Regex qui décrit l'instal la version 1.37 (mais qui marche aussi pour la 1.38, je viens de le tester) sous Windows XP pour Visual Studio 2005
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  9. #9
    Membre du Club
    Inscrit en
    Avril 2004
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 92
    Points : 44
    Points
    44
    Par défaut
    Alors j'ai réussi à installer, configurer et compiler boost 1.37

    Mais j'ai eu plus d'informations sur ma telecommande et ce n'est plus du RS232 mais du RS485 qui est utilisé.
    est ce que boost asio gére aussi le rs485 ? ou vers quoi dois je me diriger ?

    merci beaucoup de votre aide

  10. #10
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Je vois pas de limitations dans Boost.Asio qui permettrait d'utiliser uniquement du RS 232...
    J'ai envie de dire que c'est bon... Ca vaut vraiment la peine de tester en tout cas !

  11. #11
    Membre du Club
    Inscrit en
    Avril 2004
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 92
    Points : 44
    Points
    44
    Par défaut
    ok , alors on va faire quelques tests pour tester tout ça.

    alors j'ai trouvé une petite classe sur internet qui utilise le port serie.
    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
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
       1. /* minicom.cpp
       2. A simple demonstration minicom client with Boost asio
       3.  
       4. Parameters:
       5.  baud rate
       6.  serial port (eg /dev/ttyS0 or COM1)
       7.  
       8. To end the application, send Ctrl-C on standard input
       9. */
      10.
      11. #include <deque>
      12. #include <iostream>
      13. #include <boost/bind.hpp>
      14. #include <boost/asio.hpp>
      15. #include <boost/asio/serial_port.hpp>
      16. #include <boost/thread.hpp>
      17. #include <boost/lexical_cast.hpp>
      18. #include <boost/date_time/posix_time/posix_time_types.hpp>
      19.
      20. #ifdef POSIX
      21. #include <termios.h>
      22. #endif
      23.
      24. using namespace std;
      25.
      26. class minicom_client
      27. {
      28. public:
      29. minicom_client(boost::asio::io_service& io_service, unsigned int baud, const string& device)
      30.  : active_(true),
      31.    io_service_(io_service),
      32.    serialPort(io_service, device)
      33. {
      34.  if (!serialPort.is_open())
      35.  {
      36.   cerr << "Failed to open serial port\n";
      37.   return;
      38.  }
      39.  boost::asio::serial_port_base::baud_rate baud_option(baud);
      40.  serialPort.set_option(baud_option); // set the baud rate after the port has been opened
      41.  read_start();
      42. }
      43.
      44. void write(const char msg) // pass the write data to the do_write function via the io service in the other thread
      45. {
      46.  io_service_.post(boost::bind(&minicom_client::do_write, this, msg));
      47. }
      48.
      49. void close() // call the do_close function via the io service in the other thread
      50. {
      51.  io_service_.post(boost::bind(&minicom_client::do_close, this, boost::system::error_code()));
      52. }
      53.
      54. bool active() // return true if the socket is still active
      55. {
      56.  return active_;
      57. }
      58.
      59. private:
      60.
      61. static const int max_read_length = 512; // maximum amount of data to read in one operation
      62.
      63. void read_start(void)
      64. { // Start an asynchronous read and call read_complete when it completes or fails
      65.  serialPort.async_read_some(boost::asio::buffer(read_msg_, max_read_length),
      66.   boost::bind(&minicom_client::read_complete,
      67.    this,
      68.    boost::asio::placeholders::error,
      69.    boost::asio::placeholders::bytes_transferred));
      70. }
      71.
      72. void read_complete(const boost::system::error_code& error, size_t bytes_transferred)
      73. { // the asynchronous read operation has now completed or failed and returned an error
      74.  if (!error)
      75.  { // read completed, so process the data
      76.   cout.write(read_msg_, bytes_transferred); // echo to standard output
      77.   read_start(); // start waiting for another asynchronous read again
      78.  }
      79.  else
      80.   do_close(error);
      81. }
      82.
      83. void do_write(const char msg)
      84. { // callback to handle write call from outside this class
      85.  bool write_in_progress = !write_msgs_.empty(); // is there anything currently being written?
      86.  write_msgs_.push_back(msg); // store in write buffer
      87.  if (!write_in_progress) // if nothing is currently being written, then start
      88.   write_start();
      89. }
      90.
      91. void write_start(void)
      92. { // Start an asynchronous write and call write_complete when it completes or fails
      93.  boost::asio::async_write(serialPort,
      94.   boost::asio::buffer(&write_msgs_.front(), 1),
      95.   boost::bind(&minicom_client::write_complete,
      96.    this,
      97.    boost::asio::placeholders::error));
      98. }
      99.
     100. void write_complete(const boost::system::error_code& error)
     101. { // the asynchronous read operation has now completed or failed and returned an error
     102.  if (!error)
     103.  { // write completed, so send next write data
     104.   write_msgs_.pop_front(); // remove the completed data
     105.   if (!write_msgs_.empty()) // if there is anthing left to be written
     106.    write_start(); // then start sending the next item in the buffer
     107.  }
     108.  else
     109.   do_close(error);
     110. }
     111.
     112. void do_close(const boost::system::error_code& error)
     113. { // something has gone wrong, so close the socket & make this object inactive
     114.  if (error == boost::asio::error::operation_aborted) // if this call is the result of a timer cancel()
     115.   return; // ignore it because the connection cancelled the timer
     116.  if (error)
     117.   cerr << "Error: " << error.message() << endl; // show the error message
     118.  else
     119.   cout << "Error: Connection did not succeed.\n";
     120.  cout << "Press Enter to exit\n";
     121.  serialPort.close();
     122.  active_ = false;
     123. }
     124.
     125. private:
     126. bool active_; // remains true while this object is still operating
     127. boost::asio::io_service& io_service_; // the main IO service that runs this connection
     128. boost::asio::serial_port serialPort; // the serial port this instance is connected to
     129. char read_msg_[max_read_length]; // data read from the socket
     130. deque<char> write_msgs_; // buffered write data
     131. };
     132.
     133. int main(int argc, char* argv[])
     134. {
     135. // on Unix POSIX based systems, turn off line buffering of input, so cin.get() returns after every keypress
     136. // On other systems, you'll need to look for an equivalent
     137. #ifdef POSIX
     138. termios stored_settings;
     139. tcgetattr(0, &stored_settings);
     140. termios new_settings = stored_settings;
     141. new_settings.c_lflag &= (~ICANON);
     142. new_settings.c_lflag &= (~ISIG); // don't automatically handle control-C
     143. tcsetattr(0, TCSANOW, &new_settings);
     144. #endif
     145. try
     146. {
     147.  if (argc != 3)
     148.  {
     149.   cerr << "Usage: minicom <baud> <device>\n";
     150.   return 1;
     151.  }
     152.  boost::asio::io_service io_service;
     153.  // define an instance of the main class of this program
     154.  minicom_client c(io_service, boost::lexical_cast<unsigned int>(argv[1]), argv[2]);
     155.  // run the IO service as a separate thread, so the main thread can block on standard input
     156.  boost::thread t(boost::bind(&boost::asio::io_service::run, &io_service));
     157.  while (c.active()) // check the internal state of the connection to make sure it's still running
     158.  {
     159.   char ch;
     160.   cin.get(ch); // blocking wait for standard input
     161.   if (ch == 3) // ctrl-C to end program
     162.    break;
     163.   c.write(ch);
     164.  }
     165.  c.close(); // close the minicom client connection
     166.  t.join(); // wait for the IO service thread to close
     167. }
     168. catch (exception& e)
     169. {
     170.  cerr << "Exception: " << e.what() << "\n";
     171. }
     172. #ifdef POSIX // restore default buffering of standard input
     173. tcsetattr(0, TCSANOW, &stored_settings);
     174. #endif
     175. return 0;
     176. }
    cela a l'air de fonctionner meme si il ya rien de mis sur le port serie.

    donc je voudrais lire dans une boucle les informations qui viennent de ma telecommande.

    voila les infos que je dispose :
    l'emetteur ( la telecommande) émet des trames de manière periodique( 300 ms) sur la liaison serie. on envoit la derniere trame correctement reçueet décodée à la fin du time out de 300 ms.
    le codage est fait en ASCII
    le debut de trame est STX
    la fin de la trame est CR LF

    vitesse : 19200 bauds
    mots de 8 bits
    1 bit de start
    1 bit de stop
    pas de parité

  12. #12
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Il suffit de mettre tes options dans la structure qui va bien et c'est parti. L'exemple montré est un base sur laquelle tu peux partir effectivement.
    Dans serial_port_base, tu as toutes les options que tu veux...

  13. #13
    Membre du Club
    Inscrit en
    Avril 2004
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 92
    Points : 44
    Points
    44
    Par défaut
    ok j'etudie un peu tout ça.
    mais il n'y a qu'une fonction write d'implementé.
    et je vois pas trop comment ecrire la read.

    et ensuite je voudrais faire un truc du style ( en tres gros )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while(1 )
    {
       read_async( str);
       cout<<str;
    }

  14. #14
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Bien sûr qu'il y a une fonction read directement dans la fonction... http://www.boost.org/doc/libs/1_37_0...rial_port.html

    Mais il y a mieux : la meilleure fonction read dans ton cas c'est surement boost::asio::async_read

  15. #15
    Membre du Club
    Inscrit en
    Avril 2004
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 92
    Points : 44
    Points
    44
    Par défaut
    oui j'avais vu ça mais si j'utilise la classe faites dans le lien donné ci-dessus , il n'y en a pas. mais je vais aller plus profondement dans le code de asio.

    je suis retourné aux infos sur la telecommande qui envoit les données en RS458 et d'apres le fabricant le PC ne sait pas lire du RS485 sur le port serie. donc j'ai commandé un convertisseur RS458 ==> RS232

    sinon on m'a parlé de l'hyperTErminal de windows pour tester le port serie. mais j'ai pas reussi a avoir le moindre resultat( surement a cause du RS458)

  16. #16
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Citation Envoyé par sylvain_bos Voir le message
    je suis retourné aux infos sur la telecommande qui envoit les données en RS458 et d'apres le fabricant le PC ne sait pas lire du RS485 sur le port serie. donc j'ai commandé un convertisseur RS458 ==> RS232
    OK ça va drôlement arranger les choses...
    Du coup ça te laisse du temps pour apprivoiser la bête !

  17. #17
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Un truc qui pourra t'aider dans les phases de debug, c'est portmon qui est un outil gratuit de sysinternal (maintenant Microsoft) de surveillance des ports série et //

    http://www.microsoft.com/france/tech...s/Portmon.mspx
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  18. #18
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    Un truc qui pourra t'aider dans les phases de debug, c'est portmon qui est un outil gratuit de sysinternal (maintenant Microsoft) de surveillance des ports série et //

    http://www.microsoft.com/france/tech...s/Portmon.mspx
    Je connaissais pas !
    Effectivement, je pense que c'est très pratique. C'est un genre de Ethereal pour le port série !

  19. #19
    Membre du Club
    Inscrit en
    Avril 2004
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 92
    Points : 44
    Points
    44
    Par défaut
    merci de votre aide.
    je reviens des que j'ai fait des tests avec mon convertisseur.
    pour portmon je vais regarder ça

    edit: je viens de tester portmon ( donc RS485) il voit rien du tout (en connect local) .

  20. #20
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Il y a très très longtemps (un temps que les - de 20 ans....), j'avais bossé sur des cartes RS485. Et il me semble qu'on utilisait l'API Windows classique (çad comme pour RS232) pour piloter la carte, mais bien sûr tout les signaux n'étaient pas disponibles. Mais c'était y quand même pas mal de temps, donc peut être que je dis une bêtise...

Discussions similaires

  1. Communication port RS232 : gestion des erreurs
    Par marcoo577 dans le forum LabVIEW
    Réponses: 1
    Dernier message: 20/04/2009, 19h21
  2. Communication port série (RS232) avec VC++
    Par sanatou dans le forum Visual C++
    Réponses: 2
    Dernier message: 30/10/2006, 13h49
  3. Communication port serie avec un microcontrolleur
    Par crazydede8 dans le forum C
    Réponses: 4
    Dernier message: 29/07/2006, 14h49
  4. [communication] Port serie
    Par Mr bizzz dans le forum Flash
    Réponses: 8
    Dernier message: 07/06/2006, 01h38
  5. [VB6] Communication binaire sur port RS232
    Par Oseval dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 12/04/2006, 12h53

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