Datentransfer von PC zu zwei Motorsteuerung über ein Mikrocontroller

truth

Neues Mitglied
12. Okt. 2012
2
0
0
Sprachen
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 ASCii-Form zu den zwei Motorsteuerungen gesendet. Der Atmega 644p hat zwei USARTS(USART0 und USART1). USART0(RS232) dient zum Empfangen der Positionskoordinaten, die vom PC gesendet wurde. Dann wird über USART1(RS485) die empfangenen Positionskoordinaten zu den beiden Motorsteuerungen gesendet.
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. Dh, die Motorsteuerungen bekommen nicht alle Befehle vom Atmega644p. 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.

Bemerkung: Die Antworten von Motorsteuerungen auf Befehle wurden deaktiviert, so dass sie keine Rückmeldungen an der Atmega644p senden muss.

Ich wäre sehr dankbar, wenn jemand mir hilft.
Danke im Voraus.

Das PC-Programm(c++) lautet:
Code:
#include <fstream>
#include <string>
#include <iostream>
#include <sstream>

#include <Windows.h>

using namespace std;

//Senden eines Befehls Charakter pro Charakter, und Prüfung das Empfangen von ACK 
static bool SendenBefehl(HANDLE h, string s)
{
	DWORD	length;
	char	c;

        // Wenn es seit dem letzten Befehl Antorten  zu lesen gab,
	// zu spät, alles muss gelöscht werden.
	PurgeComm(h, PURGE_RXCLEAR);
	if (!WriteFile(h, s.c_str(), s.size(), &length, 0) || length != s.size())
	{
		cout << "Error von WriteFile" << endl;
		return false;
	}
	if (!ReadFile(h, &c, 1, &length, 0) || length != 1)
	{
		cout << "Error von ReadFile (time-out)" << endl;
		return false;
	}
	cout << "Antwort : " << (int)c << endl;
	return c == '\x06';	// ACK
}

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

	if (!file)
	{
		cout << "Error: Oeffnung der Textdatei in Lesen-Modus unmöglich" << endl;
		return 1;
	}
	// Oeffnung 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: Oeffnung des seriellen Ports 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 << "Error: SetCommTimeouts" << endl;
		CloseHandle(h);
		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ß (Positionskoordinaten)

		//Eine Zeile wird ein Eingangsfluß
		input.str(line);
		// Extraktion von X und Y ab der Textdatei.
		if (input.get() != 'X')
			continue;
		input >> x;
		if (input.get() != 'Y')
			continue;
		input >> y;
		//Konvertierung von Positionen in Schrittmotor 
		
		x_steps = x * 127 / 500;
		y_steps = y * 127 / 500;
		// Senden von Posotionskoordinaten über serieller Port COM1
		output << 'D';
		output << x_steps;
		output << ',';
		output << y_steps;
		output << 'F';
		cout << "Senden von : " << output.str() << endl;
		if (SendenBefehl(h, output.str()))
			cout << "OK" << endl;
		else
			cout << "ERROR" << endl;
	}
	CloseHandle(h);
	return 0;
}
 

Anhänge

  • 644p.c
    7,5 KB · Aufrufe: 0
  • koordinaten.txt
    706 Bytes · Aufrufe: 1

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)