Envoi du contenu d´un fichier texte vers le port seriel RS232

arthurdubois - 8 août 2012 à 13:44
 arthurdubois - 15 août 2012 à 17:18
Bonjour,

Je desire depuis mon PC transmettre le contenu de mon fichier texte au microcontrôleur Atmega 644p. Mon Pc et l´Atmega 644p communiquent a travers l´interface de transmission RS232.

J´ai redige un code en C++ pouvant lire le contenu du fichier Texte. Helas, je n´arrive pas a transmettre le contenu du fichier texte a l´Atmega 644p via la peripherie RS232.

Mon code en integralite est le suivant:

#include <cstdlib>
#include 
#include <fstream>
#include <string>
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <tchar.h>
#include 
#include <windows.h>
#include <wtypes.h>


using namespace std;

int main()
{

///////////////////////////////////////////////////////////////////////////
//Lecture du fichier texte et enregistrement dans une chaine de caractere//
///////////////////////////////////////////////////////////////////////////


    string koordinaten_zero = "0" ;
    char a; // Une variable pour stocker les lignes lues.
    string koordinaten_Daten ;
    ifstream file; // Un flux entrant sans fichier associe en mode lecture
    file.open("koordinaten.txt"); // Ouverture du fichier
    if(file)
    {
     // L&#180;ouverture s&#180;est bien passee. On peut donc lire

     while(file) // Tant qu&#180;on n&#180;est pas a la fin, on lit
     {
       a = file.get();
      // cout << a ; // affichage dans la console
      koordinaten_Daten.push_back(a); // Ajout de cases supplementaires a la fin du tableau
     // cout << koordinaten_Daten << endl ;
     }
     file.close();

    }
    else
    {
     cout << "Erreur: Impossible d&#180;ouvrir le fichier en mode lecture" << endl;
    }

/////////////////////////////////////////////////////////////////////////
////////////////////// Traitement du fichier texte //////////////////////
/////////////////////////////////////////////////////////////////////////

    int i = 0 ;
    while( i < koordinaten_Daten.size()) // Tant que i est inferieur au nombre d&#180;element du tableau
    {
    //  cout << koordinaten_Daten.size() << endl ; // Affichage du nombre d&#180;elements du tableau

      if(koordinaten_Daten[i]=='X' && koordinaten_Daten[i+5]=='Y' )
      {
          koordinaten_Daten.insert(i+1, koordinaten_zero);
      }

      if(koordinaten_Daten[i]=='Y' && koordinaten_Daten[i+5]=='\n' )
      {
          koordinaten_Daten.insert(i+1, koordinaten_zero);
      }
        i++;
    }

 //   cout << koordinaten_Daten ;

//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////

     int k 0, l_x 0, l_y = 0;
     float f_x_pos , f_y_pos ;
     float f_x 0,  f_y 0;
     char x_pos[10] = " "; // position suivant l&#180;axe X
     char y_pos[10] = " "; // position suivant l&#180;axe Y
     unsigned int pasdemoteur_x [500];
     unsigned int pasdemoteur_y [500];
     char All_Ascii_Pos_x[1000];
     char All_Ascii_Pos_y[1000];

     while(k < koordinaten_Daten.length())

     {
        // cout << koordinaten_Daten.length() << endl ;
         if(koordinaten_Daten[k] == 'X')
         {
             for(int j_x=0; j_x<5; j_x++)
             {
               x_pos[j_x] = koordinaten_Daten[k+j_x+1];
             }
          f_x_pos = atof (x_pos); // Conversion de ascii en nombre flottant
          //  cout << f_x_pos << endl ;
         f_x = ((f_x_pos*25.4)/10000)*100; // // conversion de la position en pas
         //  cout << f_x << endl ;
         pasdemoteur_x[l_x] = (int)f_x;
         // cout << pasdemoteur_x << endl;
         l_x++;

         }

         if(koordinaten_Daten[k] == 'Y')
         {
             for(int j_y=0; j_y<5; j_y++)
             {
               y_pos[j_y] = koordinaten_Daten[k+j_y+1];
             }
          f_y_pos = atof (y_pos); // Conversion ascii en nombre flottant float
          //  cout << f_y_pos << endl ;
         f_y = ((f_y_pos*25.4)/10000)*100; // conversion de la position en pas
         //  cout << f_y << endl ;
         pasdemoteur_y[l_y] = (int)f_y;
         // cout << pasdemoteur_y << endl;
         l_y++;

         }

      k++ ;
     }


/////////////////////////////////////////////////////////////////////
/////// Transformation des positions X de int en char ////////////////////
/////////////////////////////////////////////////////////////////////

 int  i_x=0, j_x=0, i_help_x = 0, x1 = 1000  ;
 char x[x1] ;

  while(i_x<=l_x)

{
 itoa(pasdemoteur_x[i_x],x,10);

// cout << x << endl ;
         i_x++;
 i_help_x += 1 ; // compteur

}

/////////////////////////////////////////////////////////////////////
/////// Transformation Y-position de int en char ////////////////////
/////////////////////////////////////////////////////////////////////

 int  i_y=0, j_y=0, i_help_y = 0, y1 = 1000 ;
 char y[y1] ;

  while(i_y<=l_y)

{
itoa(pasdemoteur_y[i_y],y,10);

// cout << y << endl ;
         i_y++;
 i_help_y += 1 ; // compteur

 }

//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////

    Sleep (3000) ; // pause

char * temp_x, *temp_y ;

temp_x = x ;
temp_y = y ;

//cout << temp_x << endl ;
// cout << temp_y << endl ;

/////////////////////////////////////////////////////////////////
//Transmission des positions X et Y vers le port seriel RS232////
/////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////
////Initialisation ou configuration du port seriel  /////////////
/////////////////////////////////////////////////////////////////
HANDLE h = CreateFile("COM1",          // specification du port
GENERIC_READ | GENERIC_WRITE,  // lecture, écriture ou les deux
0,                             // the devide isn't shared.
NULL,                             // no security attributes
OPEN_EXISTING,                 // // comm devices must use OPEN_EXISTING
FILE_ATTRIBUTE_NORMAL,
0);                             // not overlapped I/O

DWORD written = 0;

DCB dcb = { 0 };
BOOL dcbOk = GetCommState(h, &dcb);


//////////////////////////////////////////////////////////////////
////////// Reglage du Baudrate, de la taille du byte,/////////////
//////////du bit de parite, du stopbit////////////////////////////
//////////////////////////////////////////////////////////////////
 dcb.BaudRate = CBR_115200; // Specify buad rate of communicaiton.
 dcb.ByteSize = 8; // Specify  byte of size of communication.
 dcb.Parity = NOPARITY; // Specify parity of communication.
 dcb.StopBits = TWOSTOPBITS; // Two stop bit
 dcb.fOutxCtsFlow = false;
 dcbOk = SetCommState(h, &dcb);
 DWORD dwModemStatus;
 BOOL  fCTS;// fDSR, fRING, fRLSD;


 int k1 = 0 ;
 int control=0 ;

while(k1<(i_help_x))

{

GetCommModemStatus(h, &dwModemStatus);
fCTS = MS_CTS_ON & dwModemStatus;

if (fCTS)
{

if( control == 0 )
{
        // Transmission des coordonnees X //
 WriteFile(h,  // handle to file to write to
temp_x, // pointer to data to write to file
1,      // number of bytes to write
&written, // pointer of number of bytes written
0);
cout << "Envoi des coordonnees X" << temp_x << endl;
temp_x++;
Sleep(200);

}

        else
{
        // Transmission des coordonnees Y //
 WriteFile(h,   // handle to file to write to
temp_y, // pointer to data to write to file
1,      // number of bytes to write
&written, // pointer of number of bytes written
0);
cout << " Envoi des coordonnees Y" << temp_y << endl;
temp_y++;
Sleep(200);

}
}

  }


CloseHandle(h);

 system ("pause");


    return 0;

}



.

Mais la partie du code qui ne marche pas est celui-ci je crois:

/////////////////////////////////////////////////////////////////
//Transmission des positions X et Y vers le port seriel RS232////
/////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////
////Initialisation ou configuration du port seriel  /////////////
/////////////////////////////////////////////////////////////////
HANDLE h = CreateFile("COM1",          // specification du port
GENERIC_READ | GENERIC_WRITE,  // lecture, écriture ou les deux
0,                             // the devide isn't shared.
NULL,                             // no security attributes
OPEN_EXISTING,                 // // comm devices must use OPEN_EXISTING
FILE_ATTRIBUTE_NORMAL,
0);                             // not overlapped I/O

DWORD written = 0;

DCB dcb = { 0 };
BOOL dcbOk = GetCommState(h, &dcb);


//////////////////////////////////////////////////////////////////
////////// Reglage du Baudrate, de la taille du byte,/////////////
//////////du bit de parite, du stopbit////////////////////////////
//////////////////////////////////////////////////////////////////
 dcb.BaudRate = CBR_115200; // Specify buad rate of communicaiton.
 dcb.ByteSize = 8; // Specify  byte of size of communication.
 dcb.Parity = NOPARITY; // Specify parity of communication.
 dcb.StopBits = TWOSTOPBITS; // Two stop bit
 dcb.fOutxCtsFlow = false;
 dcbOk = SetCommState(h, &dcb);
 DWORD dwModemStatus;
 BOOL  fCTS;// fDSR, fRING, fRLSD;


 int k1 = 0 ;
 int control=0 ;

while(k1<(i_help_x))

{

GetCommModemStatus(h, &dwModemStatus);
fCTS = MS_CTS_ON & dwModemStatus;

if (fCTS)
{

if( control == 0 )
{
        // Transmission des coordonnees X //
 WriteFile(h,  // handle to file to write to
temp_x, // pointer to data to write to file
1,      // number of bytes to write
&written, // pointer of number of bytes written
0);
cout << "Envoi des coordonnees X" << temp_x << endl;
temp_x++;
Sleep(200);

}

        else
{
        // Transmission des coordonnees Y //
 WriteFile(h,   // handle to file to write to
temp_y, // pointer to data to write to file
1,      // number of bytes to write
&written, // pointer of number of bytes written
0);
cout << " Envoi des coordonnees Y" << temp_y << endl;
temp_y++;
Sleep(200);

}
}

  }


CloseHandle(h);

 system ("pause");


    return 0;

}
.

Concernant le contenu du fichier texte, le voici:

%
M48
M72
T01C0.0320
T02C0.0394
T03C0.0400
T04C0.0440
T05C0.0512
T06C0.1181
%
T01
X21101Y24101
X10851Y16601
X13851Y19101
X10851Y22851
X11851Y22851
X12851Y22851
X12351Y24851
X11351Y24851
X10351Y24851
X9351Y24851
X8351Y24851
X7351Y24851
X6351Y24851
X16101Y22601
X18101Y22601
T04
X23351Y15101
X25351Y15101
X27351Y15101
X29351Y15101
X29351Y19101
X27351Y19101
X25351Y19101
X23351Y19101
X23351Y21601
X23351Y25601
X25351Y25601
X27351Y25601
X29351Y25601
X29351Y21601
X27351Y21601
X25351Y21601
T05
X33611Y6609
X33611Y8609
X33611Y10609
X33611Y12609
X33611Y14609
X33611Y16609
X33611Y18609
X33611Y20609
X33611Y22609
X33611Y24609
X24109Y6841
X26109Y6841
X28109Y6841
X30109Y6841
T06
X2101Y2101
X2101Y29601
X37101Y2351
X37351Y29601
M30
.

N.B: Dans mon fichier texte, je ne lis que les coordonnees X et Y. Les autres symboles se trouvant dans le fichier texte sont d´aucune utilite pour moi. Bref je desire envoyer progressivement le couple de coordonnes (X,Y) vers l´interface de transmission RS232.

Pourriez-vous, s´il vous plaît jeter un coup d´oeil sur mon programme. Je ne parviens pas a trouver la solution a mon probleme. En fait l´envoi des couples de coordonnees ne marchent pas. Je vous prie de bien vouloir m´aider.

Je travaille sous windows XP avec Code-bloc comme IDE et j´espere que se n´est pas un handicap pour moi. En passant, je suis un debutant en C++.

Merci d´avance.

Arthur.

1 réponse

arthurdubois
15 août 2012 à 17:18
Salut ,

j ai reussis a deboguer mon code c++ sous windows 7 et jai par la même occasion grâce a laide dun internaute modifier considerable mon programme.

Apres le debogage de mon code C++, jai recu linformation : "Erreur: Impossible douvrir le port série".

Comment pourrais-je ressoudre ce probleme ?
Es-ce que un membre a une idee ? Vos suggestions et corrections sont les bienvenues.

Mon nouveau code:


#include <fstream>
#include <string>
#include 
#include <sstream>
#include <stdio.h>
#include <stdlib.h>

#include <Windows.h>

using namespace std;

int main(void)
{
ifstream file("koordinaten.txt", ios::in | ios::binary);
string line;

if (!file)
{
cout << "Erreur: Impossible d&#180;ouvrir le fichier en mode lecture" << endl;
return 1;
}

// Ouverture du port COM (c'est votre code tel quel)

HANDLE h = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if (h == INVALID_HANDLE_VALUE)
{
cout << "Erreur: Impossible d&#180;ouvrir le port série" << endl;
return 1;
}

DCB dcb = { 0 };
BOOL dcbOk = GetCommState(h, &dcb);
dcb.BaudRate = CBR_115200;
dcb.ByteSize = 8;
dcb.Parity = NOPARITY;
dcb.StopBits = TWOSTOPBITS;
dcb.fOutxCtsFlow = FALSE;	// Pourquoi ça et puis ensuite un test manuel du CTS ?
dcbOk = SetCommState(h, &dcb);

// Lecture ligne par ligne

while (getline(file, line))
{
int x ;					// x, y du texte
int y ;
int x_steps;			// x, y en pas moteur
int y_steps;
stringstream input;		// flux d'entrée (une ligne du texte)
stringstream output_x;	// flux de sortie (une paire de coordonnées)
stringstream output_y;

// Une ligne devient un flux d'entrée
input.str(line);
// Extraction du X et du Y.
if (input.get() != 'X')
continue;
input >> x;
        //cout << x << endl;
if (input.get() != 'Y')
continue;
input >> y;
        //cout << y << endl ;
        // cout << x << ", " << y << endl;

// Conversion des positions x et y de integer en pas moteur
// J'ai rendu le calcul compatible avec le type int. (et je le trouve plus lisible)

x_steps = (x * 127) / 500;
//cout << x_steps << endl ;
y_steps = (y * 127) / 500;
//cout << x_steps << ", " << y_steps << endl;

// Envoi des coordonnées par le port série, à compléter car votre code ne permet pas de savoir ce que vous deviez réellement faire.

DWORD written = 0;
output_x << x_steps;	// TODO: Ne manque-t-il pas un terminateur ou un cadrage ?
WriteFile(h, output_x.str().c_str(), output_x.str().size(), &written, 0);
output_y << y_steps;	// TODO: Ne manque-t-il pas un terminateur ou un cadrage ?
WriteFile(h, output_y.str().c_str(), output_y.str().size(), &written, 0);
// TODO: Et là, il ne faut pas attendre un retour ?
}
CloseHandle(h);
return 0;
}





Cordialement.

arthurdubois
0
Rejoignez-nous