Guten Tag,
ich versuche gerade Zeile pro Zeile Positionskoordinaten (X,Y) einer Textdatei von PC zu zwei identischen Motorsteuerungen über ein Mikrocontroller zu senden. Die PositionKoordinaten(X,Y) der Textdatei sind in ASCii und werden in dieser Form zu den zwei Motorsteuerungen gesendet. Der Atmega 644p hat zwei USARTS(USART0 und USART1). USART0(RS232) dient zum Empfangen die Positionskoordinaten, die vom PC gesendet wurde. Dann wird über USART1(RS485) die empfangenen Positionskoordinaten zu den beiden Motorsteuerungen gesendet. Das Programm zum Senden der Positionskoordinaten von PC zum Atmega 644p wurde in c++ geschrieben und liegt ganz unten meinem Beitrag.
Die Positionskoordinaten, die von PC zu den beiden Motorsteuerungen über der Mikrocontroller gesendet werden, sind in folgender Form: "DX,YF".
D ---> Anfang des Befehls
X ---> Position auf die x-Achse in ASCii
',' ---> Trennzeichnen dient zur Unterscheidung von X und Y- Position
Y ---> Position auf die y-Achse in ASCii
F ---> Ende des Befehls.
Wenn ich die Positionskoordinaten(X,Y) der Textdatei Zeile pro Zeile zum Atmega644p sende, läuft alles wunderbar.
Aber wenn ich auf einmal alle Positionskoordinaten der Textdatei zum Atmega644p sende, wird nur ein, zwei oder drei Positionskoordinaten ausgeführt. Aber die Andere Positionskoordinaten(X,Y) werden nicht ausgeführt. Ich denke, etwas läuft bei meinem Atmega644p-Programm schief, vielleicht mein Empfangsinterrupt ISR(USART0_RX_vect). Ich komme einfach nicht klar. Mein Atmega644p-Programm liegt im Anhang.
Ich wäre sehr dankbar, wenn jemand mir hilft.
Danke im Voraus.
c++ Programm (PC Programm):
Code:
#include <fstream>
#include <string>
#include <iostream>
#include <sstream>
#include <Windows.h>
using namespace std;
// Senden eines Befehls Charakter pro Charakter und man test das Empfangen eines ACK
static bool SendungBefehl(HANDLE h, const char *s)
{
DWORD dummy;
char c;
// Wenn es seit dem letzten Befehl Antorten zu lesen gab,
// Zu spät, alles muss gelöscht werden.
PurgeComm(h, PURGE_RXCLEAR);
for (int i = 0; s[i] != 0; ++i)
if (!WriteFile(h, s + i, 1, &dummy, 0))
cout << "Error de WriteFile" << endl;
return false;
if (!ReadFile(h, &c, 1, &dummy, 0))
cout << "Erreur de ReadFile (time-out)" << endl;
return false; // Time-out
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 << "Error: Die Öffnung der Textdatein in Lesen-Modus ist unmöglich" << endl;
return 1;
}
// Öffnung des seriellen Ports COM1
HANDLE h = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if (h == INVALID_HANDLE_VALUE)
{
cout << "Error: Öffnung der seriellen Port ist unmöglich" << 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;
return 1;
}
// Lesen Zeile pro Zeile
while (getline(file, line))
{
int x; // x, y von der Textdatei
int y;
int x_steps; // x, y in Schrittmotor
int y_steps;
stringstream input; // Eingangsfluß (Eine Zeile der Textdatei)
stringstream output; // Ausgangsfluß (Ein Koordinatenpaar)
// Eine Zeile wird ein Eingangsfluß sein
input.str(line);
// Extraktion von X et du Y.
if (input.get() != 'X')
continue;
input >> x;
if (input.get() != 'Y')
continue;
input >> y;
// Konvertierung von Positionkoordinaten(X,Y) in Schrittmotor
x_steps = x * 127 / 500;
y_steps = y * 127 / 500;
// Sendung der PositionsKoordinaten Zeile pro Zeile über der serielle Port (COM1)
output << 'D';
output << x_steps;
output << ',';
output << y_steps;
output << 'F';
cout << "Sendung von : " << output.str() << endl;
if (SendungBefehl(h, output.str().c_str()))
cout << "OK" << endl;
else
cout << "ERROR" << endl;
}
CloseHandle(h);
return 0;
}
Lesezeichen