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;
// Envoie une commande caractère par caractère, et teste la réception d'un ACK
static bool EnvoieCommande(HANDLE h, string s)
{
DWORD length;
char c;
// S'il y avait des réponses à lire depuis la dernière commande,
// trop tard, on les supprime.
PurgeComm(h, PURGE_RXCLEAR);
if (!WriteFile(h, s.c_str(), s.size(), &length, 0) || length != s.size())
{
cout << "Erreur de WriteFile" << endl;
return false;
}
if (!ReadFile(h, &c, 1, &length, 0) || length != 1)
{
cout << "Erreur de ReadFile (time-out)" << endl;
return false;
}
cout << "Réponse : " << (int)c << endl
return c == '\x06'; // ACK
}
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)
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;
dcbOk = SetCommState(h, &dcb);
COMMTIMEOUTS timeouts = { 0 };
timeouts.ReadIntervalTimeout = 100;
timeouts.ReadTotalTimeoutMultiplier = 100;
timeouts.ReadTotalTimeoutConstant = 100;
timeouts.WriteTotalTimeoutMultiplier = 100;
timeouts.WriteTotalTimeoutConstant = 100;
if (!SetCommTimeouts(h, &timeouts))
{
cout << "Erreur: SetCommTimeouts" << endl;
CloseHandle(h);
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; // flux de sortie (une paire de coordonnées)
// 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
output << '\n';
output << x_steps;
output << ',';
output << y_steps;
output << '\r';
cout << "Envoi de : " << output.str() << endl;
if (EnvoieCommande(h, output.str()))
cout << "OK" << endl;
else
cout << "ERREUR" << endl;
}
CloseHandle(h);
return 0;
} |