OnDraw

Hallo Peter!

Mein Aufgebe ist: über die Serielle Schnittstelle die NMEA-Daten einer GPS-Maus einzulesen, in einer SDI-Anwendung anzeigen zu lassen und abzuspeichern. Dazu verwende ich die Klasse "CSerialCom" von codeproject.com. In einem Beispiel habe ich gesehen, wie die Ansichtsklasse gekapselte Daten aus der Dokumentenklasse aufruft und zur Anzeige bringt. Diese beiden Quellen versuche nun miteinander zu verbinden. In mein aktuellstem Versuch von gestern abend gelang es mir, in einer Messagebox Zahlen anzeigen zu lassen. Aber es ist unwahrscheinlich, daß diese Daten wirklich von der GPS-Maus stammen.

Die NMEA-Daten sin ASCII-Zeichen und jeder Datensatz beginnt mit '$GP' und endet nach einer Checksumme mit <CR> und <LF>.

Ich gebe nun die (meines Erachtens wichtigen) Codes an. Benötigt man dazu den Code der CSerialCom?

C++-Code's:

Struktur:

//Struktur zur Aufnahme der GPS-Daten
struct GPS_Daten
{
int nNoOfData; //Anzahl der Daten
char *NMEA_Daten; //Die Daten
};

Sie hat die Variable:
private:
GPS_Daten m_GPS_Daten;

Die Methode zum lesen der Daten:

void CRS232SerialComMsgDoc::OnRs232Lesen()
{
// TODO: Code für Befehlsbehandlungsroutine hier einfügen
CSerialCom Serial;
//Open Port: COM1
Serial.OpenPort("COM1");
//Configure COM1
Serial.ConfigurePort(4800, //Baud Rate
8, //Data Bits
FALSE, //Has Parity
NOPARITY, //Parity Bits
TWOSTOPBITS //Stop Bits
);
//Read data from GPS
// Originalversion: Größe des Buffer festlegen, gesamten
// Buffer mit '\0' füllen und einen Zählder definieren, der
// der auf 0 gesetzt wird
// char Data[100]="\0";
//
// BYTE DataByte='\0';
// int nIndex=0;
//Hier nun die gewandelte Version: Für die Struktur wird ein
//Speicherbereich von 100 Zeichen reserviert.
//Zudem wird ein Zähler definiert und auf 0 gesetzt
m_GPS_Daten.nNoOfData = 100;
m_GPS_Daten.NMEA_Daten = new char[m_GPS_Daten.nNoOfData];
BYTE DataByte = '\0';
int iIndex = 0;
//Obtaining information from GPS character by character
//Note: NMEA0183 sentences will finished by "\r\n" characters!
BOOL Return=Serial.ReadByte(DataByte);
while (DataByte!='\r' && DataByte!='\n' && Return==TRUE)
{
// Data[nIndex]=DataByte;
// nIndex++;
// Return=Serial.ReadByte(DataByte);
m_GPS_Daten.NMEA_Daten[iIndex] = DataByte;
iIndex++;
Return = Serial.ReadByte(DataByte);
}

for (int i=0; i<3; i++)
{
CString txt;
txt.Format("%d", m_GPS_Daten.NMEA_Daten[0]);
AfxMessageBox(txt);
}

m_GPS_Daten.NMEA_Daten[iIndex++]='\r';
m_GPS_Daten.NMEA_Daten[iIndex++]='\n';
m_GPS_Daten.NMEA_Daten[iIndex++]='\0';
//Remove garbage characters if any exists!
iIndex=0;
while (m_GPS_Daten.NMEA_Daten[iIndex]!='$' && iIndex<100)
iIndex++;


}
const GPS_Daten* CRS232SerialComMsgDoc::GetData() const
{
return &m_GPS_Daten;
}


Die Methoden zum Holen eines Zeigers auf die Struktur:

const GPS_Daten* CRS232SerialComMsgDoc::GetData() const
{
return &m_GPS_Daten;
}


Für die Ausgabe habe ich mir folgendes zusammengestrickt:

void CRS232GPSView::OnDraw(CDC* pDC)
{
CRS232GPSDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// ZU ERLEDIGEN: Hier Code zum Zeichnen der ursprünglichen Daten hinzufügen


//Konstanter Zeiger auf die Dokumentdaten holen...
const GPS_Daten *pData = pDoc->GetData();
//...und Daten ausgeben
for(int iIndex=0; iIndex<pData->nNoOfData; iIndex++)
{
CString txt;
txt.Format("%d, ", pData->NMEA_Daten[iIndex]);
pDC->TextOut(iIndex*30,0, txt);
}

}

Da das Programm aber keine Ausgabe hervorbrachte, habe ich zunächst versucht anhand der Messagebox in ONRS232Lesen festzustellen, ob Daten überhaupt gelesen werden.

Im nächsten Schritt habe ich vor die Daten der Ansichtsklasse zu übergeben.

Kannst Du mir weiter helfen?

THX Markus
 
Mit Codetags sind längere Quellcodeschnipsel wesentlich besser zu lesen (Formatierung!). Könntest du das bitte noch reineditieren?
 
Das sind diese Dinger: [ CODE ] blablabla [ /CODE ],
nur ohne Spaces zwischen den Klammern. Bekommt manbeim Editieren, wenn man den '#'-Button drückt (gut versteckt!).
 
Hi Peter!


Nur ein kurzer Versuch!;)

Code:
void main (void)
{
cout << "Hello World!";
}

Nun muß ich meine Brötchen verdienen! Ich melde mich wieder.

Vielen Dank ersteinmal:)

Markus
 
Hallo Peter!


Wie war Weihnachten? Für mich ist es immer recht stressig. Aber für dieses Jahr ist es vorbei, leider ist das Jahr auch bald Geschichte! Aber ich bin kein Philosoph! Denken soll der, der es gelernt hat:)

Mein Problem ist es, die NMEA0183-Daten einer GPS-Maus auszulesen. Sie bestehen aus ACSII-Zeichen.

So sieht ein typische NMEA0183-Datensatz aus:

$GPGGA,074641.651,5137.3941,N,00709.0137,E,1,07,1.3,143.3,M,47.4,M,0.0,0000*73

Am Ende steht ein <CR> und <LF>.

Das Auslesen geschieht über eine serielle Schnittstelle. Die Klasse und den zum Ansprechen der Klasse benötigten Code habe ich. Über ein Menü erzeuge im Assistenten die Methode "CRS232Doc::OnRS232Lesen()" In Ihr steht der Code zum Ansprechen der Klasse:

Code:
 CSerialCom Serial;
 
//Open Port: COM2
Serial.OpenPort("COM2");
 
//Configure COM2
Serial.ConfigurePort(4800,		 //Baud Rate
		 8,		 //Data Bits
		 FALSE,		 //Has Parity
		 NOPARITY,	 //Parity Bits
		 TWOSTOPBITS	 //Stop Bits
		 );
 
//Read data from GPS 
char Data[100]="\0";
 
BYTE DataByte='\0';
int nIndex=0;
 
//Obtaining information from GPS character by character
//Note: NMEA0183 sentences will finished by "\r\n" characters!
BOOL Return=Serial.ReadByte(DataByte);
 
while (DataByte!='\r' && DataByte!='\n' && Return==TRUE)
{
		 Data[nIndex]=DataByte;
		 nIndex++;
		 Return=Serial.ReadByte(DataByte);
}

Data[nIndex++]='\r';
Data[nIndex++]='\n';
Data[nIndex++]='\0';
 
//Remove garbage characters if any exists!
nIndex=0;
 
while (Data[nIndex]!='$' && nIndex<100)
		nIndex++;

Ich scheitere daran, die Datensätze mit Hilfe der Methode OnDraw() anzeigen zu lassen. Kannst du mir den entsprechenden Code geben, wie ich das machen kann?:confused:

Gruß Markus
 
Code:
pDC->TextOut( 0, 0, (char*)Data );
pDC ist der CDC aus deinem ersten Schnipsel. Die Zeile sollte Data (als char-Array) and der Position 0,0 ausgeben.
 
Hallo Peter!

Man bin ich schlecht:mad: !

Als erstes Code-Schnipsel verstehe ich den Code von gestern? Zumal da eine char-Array mit den Namen Data vorkammt.

Nun habe ich deine Zeile in OnDraw() eingefügt und erhielt die Fehlermeldung Variable nicht bekannt. Da habe ich sie einfach als lokal Variable "char Data[100]" in der Methode deklariert.

Ergo kein Fehler, aber das Prog. lebt nach Menü->RS 232->lesen in seiner eigenen Welt und muß durch beenden daran erinnert werden, aus dem Paralleluniversum zurückzukommen.

Was paßt denn da nicht in mein modriges Hirn nicht rein:suspekt:

THX Markus
 

Neue Beiträge

Zurück