Serielle Kommunikation



  • Hallo Allerseits,

    Ich habe leider kein Thread zum Thema gefunden, daher erstelle ich mal ein neues Thema.

    Ich habe folgendes Problem:
    Ich möchte von Windows aus über die serielle Schnittstelle mit einem Microcontroller kommunizieren.

    Der Hintergrund ist folgender: Ich habe eine Schaltung mit einem Microcontroller (derzeit PIC16F870 aber noch nicht sicher), der als Pulsgenerator fungiert. Die ganzen Parameter (Pulsart, Pulslängen etc) möchte ich unter windows einstellen, so dass man bequem am PC alles eingeben kann.

    Mittels drücken eines Knopfes wird der ganze Parameterblock dann an den Controller übertragen und dieser startet.

    Dabei möchte ich zum einen eine Bestätigungsnachricht vom Controller senden, dass die Parameter angekommen sind und der Pulsgenerator startet, aber viel entscheidender ist die Nachricht des Controllers, wenn er fertig ist. Dann soll er eine Nachricht zurück an den PC senden, damit das dortige Programm Bescheid weiss und die Eingabefelder wieder frei gibt.

    Der Kern ansich funktioniert auch soweit, auch Microkontroller Programmierung stellt für mich kein Problem da. Aber ich habe bisher noch kein Programm unter Windows geschrieben, dass die serielle Kommunikation verwendet.

    Zur Info: Ich habe Windows 2000 Professional und nutze den C++ Builder von Borland.

    Mein Programm unter Windows funktioniert soweit auch, es fehlt lediglich die serielle Kommunikation. Bisher habe ich es hin bekommen Daten zu senden. Dies mache ich so:

    DCB           dcb;
    	HANDLE hCom = CreateFile ("COM2", GENERIC_WRITE | GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
    	dcb.DCBlength = sizeof(DCB);
    	GetCommState (hCom, &dcb);
    	dcb.BaudRate  = 2400;
    	dcb.ByteSize  = 8;
    	dcb.Parity    = NOPARITY;
    	dcb.StopBits  = ONESTOPBIT;
    	SetCommState (hCom, &dcb);
    
    	DWORD iBytesWritten;
    	unsigned char ucMsg[5];
    
    	ucMsg[0] = status;
    	ucMsg[1] = data1;
    	ucMsg[2] = data2;
    	ucMsg[3] = data3;
    	ucMsg[4] = data4;
    
    	WriteFile (hCom, ucMsg, 5, &iBytesWritten, NULL);
    
    	CloseHandle (hCom);
    

    Dieses Fragment habe ich mir aus dem Internet gesucht und es funktioniert auch. Ich habe es etwas angepasst, werde aber noch ein paar Variablen einfügen (Com Port, Baudrate etc) Aber das ist nicht der Knackpunkt.

    Meine Frage nun an dieser Stelle ist folgende:
    Wie komme ich an die Daten heran, die der Microcontroller sendet?

    Zusätzlich kann ich das Windows Programm aber auch nicht einfrieren und warten bis die Daten da sind (von denen ich nicht weiss wie ich da ran komme), sondern es muss weiter laufen, da der aktuelle Generator Zyklus abbrechbar ist mittels Button. Ich denke ich benötige einen Eventhandler oder so etwas.
    Bei Microcontrollern gibt es interrupts die ausgelöst werden. Gibt es so etwas vergleichbares auch unter Windows? Also eine Funktion die ich schreiben kann die aufgerufen wird, sobald ein Ereignis (z.B. Nachricht vom Controller) eintritt?

    Ich hoffe mir kann jemand von Euch helfen.

    Gruß
    Sascha



  • Hi.

    Deine erste Frage lässt sich folgendermassen beantworten: Wenn das Aussenden über den Comport wohl über WriteFile gemacht wird... Was ist der Wahrscheinlichkeit nach das Einlesen?

    die zweite Frage ist weitaus komplexer. Das geht zum Einen über Overlapped IO, andererseits kanns auch mit Multithreading gelöst werden.

    Generell empfehle ich aber auch das Studium folgenden Artikels:
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnfiles/html/msdn_serial.asp



  • Wennd as so ist, dann gehe ich mal von ReadFile aus. Die Frage ist, wartet dies bis etwas kommt oder bricht das ganze ab und liefert 0 oder so?

    Wenn es abbricht kann ich das ganze ja als Schleife realisieren. OK, nicht gerade toll, aber immerhin. Aber wenn es wirklich hängt und das Programm dann auf eine Rückgabe wartet ist das ungünstig.

    Werden ankommende Nachrichten unter Windows gepuffert und ich kann sie mittels ReadFile auslesen? Oder sind sie verloren, wenn etwas kommt ich aber nicht auf eine Antwort gewartet habe?

    Ich werde mir mal den Link angucken und mir das durchlesen. Vielleicht erübrigen sich dann die oben gestellten Fragen schon...

    Danke erst einmal.

    Gruß
    Sascha



  • die Daten sind gepuffert du musst also nicht immer gleich abfragen.
    Ich würde die Daten von der Schnittstelle in einem Thread pollen.
    Es gibt einen Timeout für das Lesen der Daten.



  • Hi ich hab noch folgenden Link für dich:

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-122860-and-start-is-40-and-postdays-is-0-and-postorder-is-asc-and-highlight-is-.html

    http://www.codeproject.com/system/serial.asp

    Waren auch für mich ganz hilfreich. Weiter gibt es von http://www.greenleafsoft.com/

    noch ein sehr komfortables Tool Greenleaf CommX.

    Ich hoffe du kannst damit was anfangen.

    Gruß, Tom


Anmelden zum Antworten