mstank
Mitglied
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
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