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:
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;
}