CSerialMFC Problem
-
Fenster/Window und ja ein Dialog ist auch ein Window/Fenster...
und was ist Dir am Code nicht klar.
-
serialmfc.Open(_T("COM1"), this, WM_NULL); //in der OnInitDialog LRESULT CSven_Dlg::OnSerialMsg (WPARAM wParam, LPARAM /*lParam*/) { const int nBuflen = sizeof(abBuffer)-1; do{ serialmfc.Read(&abBuffer,nBuflen,&dwBytesRead); if ( dwBytesRead > 0) { abBuffer[dwBytesRead]= '\0'; m_anzeige=abBuffer; } } while (dwBytesRead == nBuflen); // Schleifenbedingung UpdateData(false); //serialmfc.Close(); memset(abBuffer, 0, sizeof(abBuffer)); //serialmfc.Open(_T("COM1"), this, WM_NULL); return 0; }m_anzeige ist an ein Eingabefeld gebunden.
Mein Problem ist nun, das die Klasse immer nur 8 Zeichen zur Zeit anzeigen kann.
Dies hat zur folge das bei zum beispiel 15 Zeichen die Anzeige so schnell aktualisiert wird, dass ich nur noch die letzten Zeichen der Übertragung sehe
und die davor nur "blitzartig"
-
Ich versteh das einfach nicht,
mit der Klasse CSerial kann ich die Daten komplett auslesen,
aber da hab ich die Message Funktion nicht .
Hilfeeeee
-
Sveniemenie schrieb:
m_anzeige ist an ein Eingabefeld gebunden.
Mein Problem ist nun, das die Klasse immer nur 8 Zeichen zur Zeit anzeigen kann.
Dies hat zur folge das bei zum beispiel 15 Zeichen die Anzeige so schnell aktualisiert wird, dass ich nur noch die letzten Zeichen der Übertragung sehe
und die davor nur "blitzartig"
Martin hat Recht. Die Klasse CSerialMFC verwendet eine Nachricht (wenn ich mich nicht irre ist das WM_NULL), die dann an ein Fenster geschickt wird. Du musst also der Klasse das Fenster mitteilen, welches die Nachricht erhalten soll. In dieser Fensterklasse richtest Du dann in der Messagemap eine Behandlungsroutine ein, die dann auch die Message reagiert (das ist dann die Methode OnSerialMsg mit dem Rückgabewert LRESULT).
Zum zweiten Problem:
Warum auch immer wird nach dem erfolgreichen Übertrage aller Zeichen nochmal eine Message ausgelöst, der Puffer ist allerdings bei der letzten Message leer. Warum das so ist habe ich hier auch schon gefragt, es hat noch keiner beantworten können. Mach mal ein TRACE in die Nachrichtenbehandlungsroutine rein und sende dann mal nur ein Zeichen an die Schnittstelle. Du wirst feststellen das die WM_NULL zweimal ausgelöst wird. Vermutlich wird dann nur <CR> und <LF> übertragen (ist aber reine Spekulation).
Versuch mal das hier:serialmfc.Open(_T("COM1"), this, WM_NULL); //in der OnInitDialog LRESULT CFacharbeit_Sven_GruendahlDlg::OnSerialMsg (WPARAM wParam, LPARAM /*lParam*/) { CString m_anzeige_temp; const int nBuflen = sizeof(abBuffer)-1; do{ serialmfc.Read(&abBuffer,nBuflen,&dwBytesRead); if ( dwBytesRead > 0) { abBuffer[dwBytesRead]= '\0'; m_anzeige_temp=abBuffer; } } while (dwBytesRead == nBuflen); // Schleifenbedingung if (m_anzeige_temp.GetLength()>0) { m_anzeige=m_anzeige_temp; UpdateData(false); } return 0; }Dann sollte zumindest der Wert im Editfeld stehenbleiben.
-
AndyDD schrieb:
Warum auch immer wird nach dem erfolgreichen Übertrage aller Zeichen nochmal eine Message ausgelöst, der Puffer ist allerdings bei der letzten Message leer. Warum das so ist habe ich hier auch schon gefragt, es hat noch keiner beantworten können. Mach mal ein TRACE in die Nachrichtenbehandlungsroutine rein und sende dann mal nur ein Zeichen an die Schnittstelle. Du wirst feststellen das die WM_NULL zweimal ausgelöst wird. Vermutlich wird dann nur <CR> und <LF> übertragen (ist aber reine Spekulation)..
Tja ich kann dir sagen warum die zweite Message ausgelöst wird:
Es können nach meinen Tests nur 8 Zeichen zur Zeit angezeigt werden,
dann wird ne neue Message rausgeschickt und die nächsten Zeichen(7) werden
dargestellt.(wenn zum Beispiel 15 Zeichen anstehen)
Leider ist dies ein Vorgang der so schnell geht, das man nur die letzten
Zeichen der Übertragung sieht!
Vieleicht kann man hier eine "Bremse" einbauen.
Zum Beispiel mit Sleep() ??
-
Sveniemenie schrieb:
Tja ich kann dir sagen warum die zweite Message ausgelöst wird:
Es können nach meinen Tests nur 8 Zeichen zur Zeit angezeigt werden,
dann wird ne neue Message rausgeschickt und die nächsten Zeichen(7) werden
dargestellt.(wenn zum Beispiel 15 Zeichen anstehen)
Leider ist dies ein Vorgang der so schnell geht, das man nur die letzten
Zeichen der Übertragung sieht!
Vieleicht kann man hier eine "Bremse" einbauen.
Zum Beispiel mit Sleep() ??
Das kann ich nicht bestätigen. Schicke mal ein Zeichen an die Schnittstelle und Du wirst sehen, dass die Message auch zweimal kommt. Anderes Beispiel: ich habe eine Waage mit seriellem Anschluss. Pro Messwert werden 14 oder 15 Zeichen übertragen. Außer den beiden letzten Zeichen <CR> und <LF> steht aber alles in einem String (d.h. es stehen effektiv 12 oder 13 Zeichen im String).
Anmerkung: bin außerdem kein Freund von Sleep-Befehlen....
-
Sveniemenie schrieb:
Es können nach meinen Tests nur 8 Zeichen zur Zeit angezeigt werden,
dann wird ne neue Message rausgeschickt und die nächsten Zeichen(7) werden
dargestellt.(wenn zum Beispiel 15 Zeichen anstehen)Wenn du den Datenstrom in Pakete bestimmter Größe aufteilen musst, dann musst du selbst dafür sorgen, dass du erkennen kannst, wo ein Paket aufhört und das nächste anfängt. Allgemein nennt man das Protokoll.
Solange du nur Strings verschickst, würde sich ein Nullzeichen als Trennzeichen anbieten.
-
Ne ich hab den Datenstrom nicht aufgeteilt.
Im Anzeigefeld erscheinen nur immer die letzten Zeichen des gesendeten Strings.
Mir kommt das vor als ob er 8 Zeichen ins Anzeigefeld schrebt und diese dann überschreibt hmm
-
Vielleicht holt die Funktion die Daten in 8er-Blöcken aus dem Schnittstellenpuffer. Nur wenn mein 14stelliger String übertragen wird so steht der auch vollständig der Variable ab_buffer. Nach dem zweiten Auslösen der Message ist ab_buffer immer leer.
Wenn ich ab_buffer in einen CString formatiere, so fehlen die letzten beiden Zeichen <CR> und <LF> immer. Die Länge des CStrings ist also nach der ersten Message 12 und nach der 2. Message 0.
Genau so ist das auch bei einem Digitalmultimeter was ich habe. Das gibt in dem einen Messbereich 4 Zeichen für den Messwert und ein Zeichen für die Einheit raus. Mit den beiden Ende-Zeichen sind das insgesamt 7 Zeichen. Da kommt die Message auch zweimal, beim ersten mal mit vollständigem String, beim 2. Mal mit leerem String.
-
Kannst du mir mal deinen Quellcode von der Routine die den Speicher ausliest und in die Anzeigevariable übergibt zeigen?