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
|
#include <fstream>
#include <string>
#include <iostream>
#include <sstream>
#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´ouvrir le fichier en mode lecture" << endl;
return 1;
}
// Ouverture du port COM (c'est votre code tel quel)
COMMTIMEOUTS timeouts = { 0 };
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´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);
timeouts.ReadIntervalTimeout = 10;
timeouts.ReadTotalTimeoutMultiplier = 10;
timeouts.ReadTotalTimeoutConstant = 10;
timeouts.WriteTotalTimeoutMultiplier = 10;
timeouts.WriteTotalTimeoutConstant = 10;
if (!SetCommTimeouts(h, &timeouts))
return 1;
// 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;
if (input.get() != 'Y')
continue;
input >> y;
// Conversion de la position en pas moteur
// J'ai rendu le calcul compatible avec le type int. (et je le trouve plus lisible)
x_steps = x * 127 / 500;
y_steps = y * 127 / 500;
// 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.
string receivedChar ;
DWORD bytesWritten;
DWORD bytesRead;
output_x << x_steps; // TODO: Ne manque-t-il pas un terminateur ou un cadrage ?
string s_x = output_x.str() ; // string s_x(output_x);
for (size_t i = 0; i < s_x.size(); ++i)
{
if (!WriteFile(h, &s_x[i], 1, &bytesWritten, 0))
return 1;
if (!ReadFile(h, &receivedChar, 1, &bytesRead, 0) || bytesRead != 1)
cout << s_x[i] << " : pas de reponse ?" << endl;
else
cout << s_x[i] << " = " << receivedChar << endl;
}
output_y << y_steps ; // TODO: Ne manque-t-il pas un terminateur ou un cadrage ?
string s_y = output_y.str() ; // string s_y(output_y);
for (size_t j = 0; j < s_y.size(); ++j)
{
if (!WriteFile(h, &s_y[j], 1, &bytesWritten, 0))
return 1;
if (!ReadFile(h, &receivedChar, 1, &bytesRead, 0) || bytesRead != 1)
cout << s_y[j] << " : pas de reponse ?" << endl;
else
cout << s_y[j] << " = " << receivedChar << endl;
}
// TODO: Et là, il ne faut pas attendre un retour ?
}
CloseHandle(h);
return 0;
} |