Einstiegsprobleme mit USB



  • Hallo Forum,

    das Thema habe ich schon einmal im falschen Unterforum erstellt, daher kann es euch tatsächlich bekannt vorkommen.

    Ich habe ein C-Programm welches mit einem µC kommunizieren soll (Senden und Empfangen einiger Zeichenketten). Als Schnittstelle zwischen PC mit USB und µC mit UART dient ein FT2323RL.

    Im Internet habe ich schon gelesen das ich den USB-Port als ganz normalen COM-Port verstehen soll und das Programm wie eben bei diesen verwenden kann.

    Mittlerweile habe ich die Funktionen fopen, fread, fwrite zur Kommunikation gefunden.
    Ich möchte das mein Programm OS-Abhängig bleibt, also mit Funktionen aus <windows.h> oder <unistd.h> kann ich leider nicht viel anfangen.

    Welche Möglichkeiten habe ich nun um verschiedene Parameter bei der Kommunikation, wie die Baudrate, einzustellen?

    MfG
    Nod



  • Es ging voran, leider nicht besonders erfolgreich. Ich hoffe der Doppelpost sei mir verziehen.

    Hier mal mein bisheriger Code mit den entsprechenden Fehlermeldungen:

    #include <stdio.h>
    #include <stdlib.h>
    
    #define N 255
    
    int main()
    {
    	char Port[] = "Com3";
    	char command[] = "Help";
    	char answer[N];
    	int i = 0;
    
    	FILE *fPort;
    	fPort = fopen(Port, "r+");
    
    	if (fPort==NULL) perror ("Error opening file");
    	else
    	{
    		fwrite(command, sizeof(char), sizeof(command), fPort);
    
    		do
    		{
    			answer[i] = fgetc(fPort);
    			i++;
    		}	while (answer[i] != EOF);
    	}
    
    	printf("Answer:\n %s", answer);
    
    	fclose(fPort);
    	return EXIT_SUCCESS;	
    }
    

    Konsolenausgabe:

    Answer:
    Bitte drücken Sie eine Taste"

    #include <stdio.h>
    #include <stdlib.h>
    
    #define N 255
    
    int main()
    {
    	char Port[] = "Com3";
    	char command[] = "Help CR-LF";
    	char answer[N];
    	int hex = 0;
    	int i = 0;
    
    	int j, z;
    
    	FILE *fPort;
    	fPort = fopen(Port, "r+");
    
    	if (fPort==NULL) perror ("Error opening file");
    	else
    	{
    		fwrite(command, sizeof(char), sizeof(command), fPort);
    
    		//Zeitverschwende-Funktion
    		for(j = 0; j < 1000000; j++)
    		{
    			z = j*N;
    		}
    
    		do
    		{
    			answer[i] = fgetc(fPort);
    			i++;
    			hex = (answer[i]);
    			printf("%x = %c\t", hex, answer[i]);
    		}	while (answer[i] != EOF);
    	}
    
    	printf("\n\n ***************** \n\n");
    
    	for(i = 0; i<N; i++)
    	{
    		printf("%Lc", answer[i]);
    	}
    
    	printf("Answer:\n %s", answer);
    
    	printf("Test: %c", answer[5]);
    
    	fclose(fPort);
    	return EXIT_SUCCESS;	
    }
    

    Konsolenausgabe:
    Viele kryptische Zeichen

    #include <stdio.h>
    #include <stdlib.h>
    
    #define N 255
    
    int main()
    {
    	char Port[] = "Com3";
    	char command[] = "Help";
    	char answer[N];
    	int i = 0;
    
    	FILE *fPort;
    	fPort = fopen(Port, "w");
    
    	if (fPort==NULL) perror ("Error opening file");
    	else
    	{
    		fwrite(command, sizeof(char), sizeof(command), fPort);
    		printf("Written\n");
    	}
    
    	//Reopen for Read
    	fclose(fPort);	
    	printf("do Reopen\n");
    	fPort = fopen(Port, "r+");
    	printf("it is Reopen\n");
    
    	if (fPort==NULL) perror ("Error opening file");
    	else{
    		printf("in the else-fork\n");
    		do{
    			printf("wanting to get something...");			
    			answer[i] = fgetc(fPort);
    			printf("we get something...");
    			i++;
    		}	while (answer[i] != EOF);
    	}
    
    	printf("Answer:\n %s", answer);
    
    	fclose(fPort);
    	return EXIT_SUCCESS;	
    }
    

    Konsolenausgabe:
    blinkender Cursor; anscheinen kommt keine Antwort und das Programm will bis in alle Ewigkeit warten. Nach einfügen der printf's wird bis Zeile 33 ausgeführt.

    Ich hoffe mir kann jemand einen Hinweis auf meinen Fehler geben. Muss ich den FT232RL noch ein Kommando senden das er seine Eingabe weiter senden soll?



  • Zuerst mal: Ich habe mir den Code nicht gründlich durchgesehen.

    Dein Controller muss irgendwie wissen, dass der Befehl fertig übertragen wurde,
    Dazu dient i.A. CR-LF. Aber Das ist kein Text, sondern das sind zwei Zeichen: \r\n
    Die musst du schon noch mit übertragen.

    fwrite(fPort, "%s\r\n", command); // kann sein, dass \n reicht
    

    DAs nächst ist EOF . Das passt nicht in ein char. Aus diesem Grund gibt fgetc auch ein int zurück. Darum musst du die Rückgabe von fgetc erst in einem int zwischenspeichern.
    Allerdings wird von deinem Controller kaum ein EOF kommen, sondern eher auch \r\n (oder auch nur \n oder \r)
    Dann kannst du deine Antwort mit fgets lesen.

    fgets(answer, N, fPort);
    

    Stimmt denn die Baudrate? Hast du schon mal ein Terminalprogramm genommen um überhaupt die Verbindung zu testen?
    Für solche Zwecke ist Hterm ganz praktisch.

    Hast du mal geschaut ob es in dem Verzeichnis* von deinem Programm eine Datei com3 gibt? Dann hast du nämlich andere Probleme.

    *Welches Verzeichnis genau, hängt auch von deiner IDE ab.



  • Ich habe gerade erst auf das Unterforum geachtet. 🙄
    Du hattest bis jetzt immer von COM-Port gesprochen. Daher bin ich von Windows ausgegangen.

    Unter Linux heißen die seriellen Schnittstellen etwa /dev/ttyxx

    Aber schau mal bei http://www.mikrocontroller.net/articles/Ports_benutzen_(GCC)



  • Hallo Dirk,

    zu deinen Anregungen,
    - ich hatte schon fwrite mit \n getestet, das allein reicht nicht, aber \r\n werde ich ausprobieren.
    - Das EOF nicht in einen Char passt wusste ich noch nicht, dachte immer das wäre "0x04"
    - Baudrate sollte der FT232 bestimmen
    - mit HTerm ist das alles schon getestet und funktioniert da auch
    - deinen Link zum µC-Forum habe ich mir gestern Abend schon zu Gemüte geführt, das ist schon alles ganz schön Heavy und wird am Wochenende von mir auch durchgepflügt werden

    - das mit der "Datei" Com3 könnte tatsächlich noch ein Problem darstellen...
    EDIT: Nein, eher doch kein Problem. Ich hatte ausprobiert ob der Com-Port erkannt wird, indem ich per HTerm Connected habe, da kam mir eine passende Fehlermeldung zurück.

    Zur Konfusion wegen OS: COM ist natürlich die serielle Schnittstelle unter Windows, aber das Programm soll am Ende Plattformunabhängig sein, zuerst ist es aber wichtiger das es auf einen Windows-PC läuft. Im Linux-Subforum habe ich gepostet da ich privat Linux nutze und die Linux-Lösungen meistens eher zu Windows portierbar sind als andersrum...

    Wenn das Programm läuft kann ich das OS ja auch abfragen lassen und dementsprechend den Pfad setzen, und ob nun Com3 oder ttyS2 oder eine andere Schnittstelle, entweder wird das auch automatisch über eine Abfrage gemacht oder der Benutzer darf auswählen.



  • Das Makro EOF ist kein Zeichen sondern ein Fehlercode. (Zudem ist C nicht auf ASCII beschränkt)

    Das mit der Datei COM3 sollte auch nur ein Hinweis sein, ob du wirklich aus deinem Programm heraus die Schnittstelle geöffnet hast (ich weiß selber nicht ob z.B. der : dabei sein muss oder ob Groß-Kleinschreibung eine Rolle spielt)
    Das Hterm die Schnittstelle (und keine Datei) bedient ist klar.

    Da du aber auch im µC-Forum gefragt hast, denke ich dass du mit der dortigen Antwort besser bedient bist.



  • Das mit der Datei COM3 sollte auch nur ein Hinweis sein, ob du wirklich aus deinem Programm heraus die Schnittstelle geöffnet hast (ich weiß selber nicht ob z.B. der : dabei sein muss oder ob Groß-Kleinschreibung eine Rolle spielt)
    Das Hterm die Schnittstelle (und keine Datei) bedient ist klar.

    Ja, aber wenn mir HTerm die "Datei" Com3 blockiert kann ich doch eigentlich davon ausgehen das mein C-Programm auch auf die Schnittstelle zugreift, oder?

    Die Antwort aus dem µC-Forum führt leider nur zu einer sehr mächtigen Lib. Eine kleinere, schlankere Lösung die sich auch recht schnell verstehen lässt wäre mir persönlich lieber.


Anmelden zum Antworten