Serielle Kommunikation und das WM_Nachrichtensystem



  • Ich hoffe diese Überschrift ist etwas besser;-)
    Vielen Dank für die guten Antworten und Fragen.
    Viele Grüße
    Sven



  • ^^up

    hallo mal wieder,

    wollt mich nur mal bei euch allen bedanken... seit 5 min fang ich jtz erfolgreich die OnSerialMsg ab 🙂 *freu*

    hat zwar etwas länger gedauert abe besser spät als nie.

    aber bei meinem nächsten problem bin ich wieder hier mit fragen
    vielen dank!!!
    gruss balu

    ps:hoffe das war jtz nich zu viel spam 😛



  • Könntest du beschreiben wie du da vorgegangen bist?
    Ich würde das gerne nachvollziehen.
    Du würdest mir wirklich sehr helfen!

    Viele Grüße
    Sven!



  • ok...da selber anfänger versuch ichs mal mit einfachen worten.
    ich hab das ganzew in meinen dialog reingefummelt 😉
    dafür:

    1. in die klasse (in die headerdatei) folgendes reinschreiben

    class NameDeinerKlasse : public CDialog
    {
    //...
    public:
    //...
    protected:
    //...
    //}}AFX_MSG
    afx_msg LRESULT OnSerialMsg (WPARAM wParam, LPARAM lParam);
    DECLARE_MESSAGE_MAP()
    //...
    

    2. in deine cpp-datei

    BEGIN_MESSAGE_MAP(NameDeinerKlasse, CDialog)
    	//{{AFX_MSG_MAP(NameDeinerKlasse)
    	//...
    	//}}AFX_MSG_MAP
    	ON_WM_SERIAL(OnSerialMsg)
    END_MESSAGE_MAP()
    

    3. ebenfalls in deine cpp-datei

    LRESULT NameDeinerKlasse::OnSerialMsg (WPARAM wParam, LPARAM /*lParam*/)
    {	
         MessageBox("Serialle Nachricht erhalten", "Hinweis");
         return 0;
    }
    

    und schon musste wenn bei dir was über die serielle schnittstelle kommt ne messagebox auftauchen (taucht bei jedem zeichen auf also nich gleich riesige datenmengen drüberschicken sonst biste ewig am klicken 😉 )
    kannst anstelle der messagebox hier natürlich alles machen was du willst sobald was über die leitung kommt.

    noch ein hinweise:
    immer erst nach dem

    //}}AFX_MSG
    

    was schreiben sonst kommt der "klassen-assistent" durcheinander

    und noch was fast vergessen...du musst an geeigneter stelle natürlich noch den port öffnen und einstellen.
    hoffe jtz klappt es dann auch bei dir
    gruss
    balu



  • Balu123321 schrieb:

    noch ein hinweise:
    immer erst nach dem

    //}}AFX_MSG
    

    was schreiben sonst kommt der "klassen-assistent" durcheinander

    Das AFX_MSG gibts bei der Version 2003 nicht mehr, da kannst Du es in die Messagemap direkt reinschreiben. Ich mache das im Grunde auch so wie Du. Allerdings wird bei mir die OnSerialMsg beim Anliegen von Daten zweimal aufgerufen. Als Bsp.: Du schickst von dem angeschlossenen Gerät einen Buchstaben. Dann wird die Message abgeschickt und wenn man dann mit serial.read() das ganze ausliest steht dann auch der Buchstabe im String drin. Danach wird die Message aber nochmal aufgerufen und der String beim auslesen ist leer (muss er ja auch, hat ja keine weiteren Daten gegeben). Ist das bei Dir auch so? Müssten ja dann 2 Messageboxen erscheinen.



  • ok...ich hab msvc++ 6.0 . da kommt er durcheinander 😉
    naja...des mit der messagebox war nur zur veranschaulichung. die kommt aber nur einmal pro gesendetes zeichen.
    wenn ich alles in einen string schreibe wir aber auch für jedes zeichen OnSerialMsg aufgerufen(jedenfalls laut debugger).
    was mich nur wundert ist, ich gebe die ankommenden datenin einem combobox-feld aus und der macht mir immer ne leerenstring dazwischen
    also quasi
    1.zeile "string der gesendeten daten"
    2.zeile "leer"
    3.zeile "string"
    ...
    aber aufgerufen wird es wie gesagt nur für jedes zeichen
    gruss balu

    edit: achso und einlesen tue ich wie im beispiel, welches bei der klasse beiliegt



  • Balu123321 schrieb:

    ok...ich hab msvc++ 6.0 . da kommt er durcheinander 😉
    naja...des mit der messagebox war nur zur veranschaulichung. die kommt aber nur einmal pro gesendetes zeichen.
    wenn ich alles in einen string schreibe wir aber auch für jedes zeichen OnSerialMsg aufgerufen(jedenfalls laut debugger).
    was mich nur wundert ist, ich gebe die ankommenden datenin einem combobox-feld aus und der macht mir immer ne leerenstring dazwischen
    also quasi
    1.zeile "string der gesendeten daten"
    2.zeile "leer"
    3.zeile "string"
    ...
    aber aufgerufen wird es wie gesagt nur für jedes zeichen
    gruss balu

    edit: achso und einlesen tue ich wie im beispiel, welches bei der klasse beiliegt

    Genau das meinte ich. OnSerialMsg wird aber nicht nach jedem Zeichen, sondern stringweise aufgerufen. Warum weiß ich aber auch nicht. Laut deinem Quelltext müsste aber dann auch die Messagebox zweimal kommen. Ich habe das versucht mit den Events abzufangen, aber Fehlanzeige. Es kommt immer ein Event in dem er meint, Daten würden an der Schnittstelle anliegen. Ich überprüfe dann, ob die Länge des gelesenen Strings größer Null ist. Nur dann übernehme ich die Daten. Allerdings ist das nicht die eleganteste Lösung. Ich habe dann mal mit dem Programm Docklight (gibts im Netz) mitgeloggt was über die Schnittstelle läuft. Dort wird allerdings immer nur das erste Event (also mit den Daten) angezeigt. Meine Daten haben immer eine Länge von 14 Zeichen und werden immer mit den beiden Zeichen <cr> und <lf> abgeschlossen. Das machen so ziemlich alle Messgeräte so. Ob es daran liegen könnte? Was steht denn bei Dir am Ende des Strimgs?



  • ok,
    jetz seh ich auch was du meinst.
    is nur so, das wenn nur ein zeichen gesendet wird OnSerialMsg auch nur einmal aufgerufen wird.
    sobald aber ein string ankommt wird sie zwei mal aufgerufen.

    AndyDD schrieb:

    Was steht denn bei Dir am Ende des Strimgs?

    ich habe (noch) keine fest definierte zeichenkette. sende mit nem kleinen proggi namens terminal von nem zweiten rechner beliebige zeichenketten.
    dürfte also nicht an den zeichen cr und lf liegen.
    aber woher des kommt bin ich ratlos.

    aber du kannst mir vielleicht hierbei weiterhelfen:
    bei mir stellt er(obwohl zsData[101] ) immer nur strings von 8 zeichen länge dar. der rest kommt in die nächste (bzw übernächste) zeile. wie machst du das mit deinen 14 zeichen?

    wo fragst du das mit dem gelesenen string > 0 ab?

    greez



  • Ok, das mit einem Zeichen hab ich noch nicht ausprobiert, ich habe ein reales Gerät dran hängen, welches immer 14stellige Strings rausbringt. Die letzten beiden Zeichen sind <cr> und <lf>. Kopiere ich den Inhalt des Arrays in einen CString und ermittle dessen Länge so beträgt die 12, d.h. die letzten beiden Zeichen werden schon mal nicht mit übernommen. Das von Dir beschriebene Problem habe ich nicht. Du könntest theoretisch das Array sogar kleiner machen. Diese Stringlänge von 8 Zeichen deutet wahrscheinlich auf ein Hardwareproblem hin. Wie hast Du die Schnittstelle initialisiert (Baudrate, Start/Stoppbits, Handshaking)?
    Wie schreibst Du die Zeichen in das Array? So wie in dem Beispiel?


Anmelden zum Antworten