C Empfange keine Daten über COM

Empa

Cadet 4th Year
Registriert
Juni 2010
Beiträge
82
Hey,
ich programmiere gerade einen eZ430, der über USB an meinen PC angeschlossen ist. Leider empfange ich nur Daten, wenn ich zuerst über Hyperterminal den COM Port öffne und dann wieder schließe. Meine vermutung war nun das die Initialisierung von COM Port falsch war. Habe jetzt 2 Tage lang vergeblich nach einer Lösung gesucht (gebe hier nur die derzeitige Lösungsidee an) und hoffe einer von euch kann mir dabei helfen.

Hier der Code:
Code:
wstring testport = L"COM9";    //wird dynamisch erzeug aus testzwecken statisch
FILE *comport;
HANDLE hFile; 
DCB port;
COMMTIMEOUTS timeouts;
char portString[5]={'C','O','M','9'}; //wird dynamisch erzeug aus testzwecken statisch

      /**************************************   
      /**************Init COM*****************
      /**************************************/

	hFile = CreateFile(testport.c_str(),//only to init port
                      GENERIC_READ ,
                      0,
                      0,
                      OPEN_EXISTING,
                      0,
                      NULL);

	if (hFile == INVALID_HANDLE_VALUE)
	printf("Cannt create File (COM) with error %d.\n", GetLastError()); 

	SetupComm(hFile,(DWORD)2048, (DWORD)2048);

	memset(&port, 0, sizeof(port));
        port.DCBlength = sizeof(port);

	if(!GetCommState(hFile, &port))
		printf("GetCommState failed with error %d.\n", GetLastError()); 

	port.BaudRate=CBR_9600;
	port.Parity=NOPARITY;
	port.StopBits=ONESTOPBIT;
	port.ByteSize=8;

    if(!SetCommState(hFile, &port))
		printf("SetCommTimeouts failed with error %d.\n", GetLastError()); 

	GetCommTimeouts(hFile, &timeouts);

    timeouts.ReadIntervalTimeout = MAXDWORD; 
    timeouts.ReadTotalTimeoutMultiplier = 0;
    timeouts.ReadTotalTimeoutConstant = 10;
    timeouts.WriteTotalTimeoutMultiplier = 0;
    timeouts.WriteTotalTimeoutConstant = 0;

    if(!SetCommTimeouts(hFile, &timeouts))
			printf("SetCommTimeouts failed with error %d.\n", GetLastError()); 

	
	CloseHandle(hFile);


       /***********************************************
       /*************Open COM**************************
      /*************************************************/

	if((comport=fopen(portString,"r"))==NULL) //create the conncetion to the COM Port
	{
		printf("Cannt open %s ",portString);
		while(1);
	}

       do
       {
        data=fgetc(comport);		//get the first char from COM
        printf("%i\n",GetLastError());

        if(data!=-1)	
       {
        //Fill buffer and do some calculations
       }
       }while(1);

fgetc gibt jedoch immer nur den Wert -1 aus. GetLastError() gibt 0 zurück, also kein Error.
 
Zuletzt bearbeitet: (Nachgetragen)
Bei ALLEN Funktionen Errorchecking betreiben. Angefangen ab Zeile 21.
 
habe nun bei allen Funktionen einen Fehler check jedoch kriege ich nirgendwo eine Fehler meldung
 
Der Code, wie du ihn gepostet hast wird dir auch keine Fehler liefern, weil er nicht durch den Compiler kommt. Deine Kommentare fangen mit /* an, das heißt es handelt sich um ein mehrzeiliges Kommentar, das mit */ wieder aufhören muss. Ein einzeiliges Kommentar wird mit zwei Slashes gemacht: // Comment

Außerdem sagst du, dass es sich um C handelt, mir wäre aber neu, dass es in C wstring gibt. Also ist dein Projekt eine hässliche Mischung aus C und C++. Entscheide dich bitte für eine Sprache und bleibe bei der.

Weiter unten bei Open COM verwendest du dann ein paar Variablen, die du nirgens definiert hast. Was ist comport und portString?

Wenn du diese ganzen Fehler bereinigt hast könnte der Code eventuell kompilieren und erst dann kannst du anfangen nach Laufzeitfehlern zu suchen!

Gruß
BlackMark
 
Der wird Compiliert. Die /*********** Linien habe ich im nachhinein im Beitrag eingefügt. Das Comport sowie Portstring sind definiert habe aber vergessen die anzugeben, da das nur ein Teil des Programms ist. Füge sie aber jetzt noch hinein. Die Tatsache das ich wstring benutze liegt darin, dass die "CreateFile" Funktion kein char array nimmt (muss datentyp LPCWSTR sein).
 
Glaubst du es gibt in C keinen wide-character string? Natürlich gibt es den! Abhängig vom Compiler, aber meistens sollte wchar_t funktionieren, das ist die wide-character Version von char. Ich würde dir aber empfehlen das Ganze mit TCHAR zu machen, denn dann ist es egal ob du dein Programm mit Unicode oder Multi-Byte kompilierst. Also statt wstring nimmst du: TCHAR szString[BUFFER_SIZE];
Dazu musst du dann noch den <tchar.h> Header inkludieren.

Außerdem, die Tatsache, dass dein Code mit wstring ohne Probleme kompiliert heißt, dass du einen C++ Compiler verwendest. Wenn du in C programmieren willst, dann verwende auch einen C-Compiler!

Wenn dein Code kompiliert dann nimm deinen Debugger und gehe den Code Schritt für Schritt durch, dann solltest du schon herausfinden, wo der Fehler liegt.

Gruß
BlackMark
 
Das mit TCHAR ist mir neu, da ich mich mit den Datentypen bis jetzt noch nicht rumprügeln musste. Werde das aber auf jedenfall einbauen. Das Programm bin ich jetzt schon x mal mit dem Debugger durchgegangen. Die Daten werden alle korrekt gesetzt etc. . Desswegen frage ich ja überhaupt im Forum, weil sich evt wer gut auskennt und evt sieht das ich was vergessen oder falsch gemacht habe, was ich selber nicht erkenne. Bin die Lösungsansätze von msdn und weiteren Seiten durchgegangen jedoch ohne Erfolg.
 
Wenn du TCHAR verwendest, was sehr zu empfehlen ist, dann musst du auch darauf achten, dass du deine String-Literale auch richtig schreibst. Die richtige Schreibweise ist: _T("Hello World!")
Was TCHAR und _T() machen ist ganz einfach, sie schauen ob dein Projekt Unicode ist oder nicht und setzen dann entsprechend wchar_t und L"" oder char und "" ein. Wenn du also immer konsequent TCHAR und _T() verwendest ist es vollkommen egal ob dein Projekt mit Unicode kompiliert wird oder nicht, es funktioniert in beiden Fällen.

Der Grund warum ich dir nicht direkt eine richtige und funktionierende Lösung gebe ist der, dass ich nicht weiß ob du nur zu faul zum Googlen bist, oder ob du wirklich alles versucht hast, bevor du dich hier gemeldet hast. In letzter Zeit gab es nämlich relativ viele von diesen "Ich will, dass ihr mir meinen Code schreibt, damit ich nichts tun muss" Threads.

Aber ich gehe mal davon aus, dass du verstehst was der von dir gepostete Code macht und dass du diesen nicht nur von irgendwo mit Copy/Paste kopiert hast.

Also, ich will dir dann mal helfen, ohne die Arbeit für dich zu machen, so dass du auch etwas lernst und nicht bei jedem kleinen Problem gleich hier nach der Lösung fragst.

Du bist scheinbar mit MSDN vertraut, das ist gut, denn wenn du für Windows programmierst ist das deine wichtigste Hilfe! Schau dir mal CreateFile genauer an. Unten bei den Remarks bei "Communications Resources" steht schon einmal eines deiner Probleme. Ich kann verstehen, dass du das nicht sofort gefunden hast, das ist wirklich sehr versteckt. Noch ein Hinweis zu dem Absatz: Der Backslash wird in einem String-Literal mit zwei Backslashes gebildet und die Syntax gilt auch für Ports kleiner als 10.

Ein weiteres Problem ist, dass du CloseHandle(); aufrufst, noch bevor du den Handle eigentlich schließen willst. Wenn du mit dem COM-Port etwas machen willst, dann darfst du ihn natürlich vorher nicht schließen!

Dann solltest du noch einmal überdenken, wie du von dem COM-Port liest. Wenn du den Port mit CreateFile aufmachst, dann musst du auch mit den entsprechenden Windows Funktionen lesen und schreiben. Du verwendest danach fopen und fgetc, was nicht genau das ist, was du machen solltest. Wenn du mit CreateFile etwas geöffnet hast, dann kannst du mit ReadFile und WriteFile lesen und schreiben.

Und wenn du mit allem fertig bist darfst du CloseHandle nicht vergessen, aber erst nachdem du ReadFile und WriteFile verwendet hast.

Mit diesen Informationen solltest du es eigentlich selbst hinbekommen!

Gruß
BlackMark
 
Zuletzt bearbeitet:
Danke für die Hilfe. Copy&Paste ist eh nicht da das Teil meiner Studienarbeit ist und die mich darüber eh ausquetschen. Hatte leider davor noch nie was mit dem COM Schnittstellen gemacht außer evt nen Microchip genommen und den programmiert aber halt mit spezifischen Funktionien. Muss leider jetzt erstmal weg. Werde mir deine Tipps aber mal anschauen und durcharbeiten. Wenn ich dann noch eine Frage hätte könnte ich dir ne pm schicken?
 
Wenn das deine Studienarbeit ist, dann solltest du wirklich darauf achten, den Code schön ordentlich und sauber zu schreiben. Das heißt TCHAR verwenden und wenn es C sein soll auch einen C-Compiler verwenden ( Wenn du Visual Studio hast musst du nur deine Source Dateien mit der Endung .c versehen, dann wird der C-Compiler verwendet ). Und natürlich kein Copy/Paste!

Du könntest mir eine PM schicken, aber wozu, wenn du hier einen eigenen Thread hast? Vielleicht haben andere Leute die gleichen Probleme und stolpern über diesen Thread, dann wäre es doch unfair, wenn du ihnen nicht alle Informationen, die zum Lösen des Problems nötig sind, gibst. Also falls du noch Fragen hast stell sie hier, damit auch andere etwas davon haben ;)

Gruß
BlackMark
 
sieht jetzt sehr gut aus vielen dank für die Hilfe :)
 
Zurück
Oben