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