USB4all von Sprut mi c ansteuern



  • Hallo Leute,
    habe mir vor kurzem die USB4all Platine von Sprut aufgebaut. Diese findet man auf der Seite http://www.sprut.de/electronic/pic/projekte/usb4all/usb4all.htm

    Mit dem im download enthaltenen Test Programm funktioniert sie hervoragend.

    Nun möchte ich sie selber mit einem eigenen Programm in C ansteuern. Mein erstes Ziel ist es einen einfachen Servo Motor zu steuern. Hierfür habe ich mich für den CDC Modus endschieden da es mir leichter erscheint einen Com-Port als USB anzusteuern.

    Ich habe nur grundlegende Fahigkeiten in C. Die pdf Anleitung auf der Seite behandelt leider nur die Programmierung unter Delphie.

    Mein bisher geschriebenes Programm Funktioniert NICHT. Es läßt sich außführen und läuft auch bis zum Ende durch. Der Servo bewegt sich aber nicht. Das Grunsetzliche Programm zur ansteuerung des Com-Ports habe ich aus dieser Beschreibung http://www.robbayer.com/files/serial-win.pdf

    Ich benutze Dev-C++ unter Windows Xp. Hoffe einer von euch hat Zeit und Lust sich mit meinem Problem zu beschäftigen.

    Hier mein bisheriges Programm:

    #include <stdio.h>
    #include <stdlib.h>
    #include <windows.h>
    
    void Fehlermeldeung_Ausgeben(int Fehler);
    
    int main(int argc, char *argv[]) {
    
        HANDLE hSerial;
    
        hSerial = CreateFile("COM6",
                             GENERIC_READ | GENERIC_WRITE,
                             0,
                             0,
                             OPEN_EXISTING,
                             FILE_ATTRIBUTE_NORMAL,
                             0);
        if(hSerial==INVALID_HANDLE_VALUE) {
            if(GetLastError()==ERROR_FILE_NOT_FOUND) {
               Fehlermeldeung_Ausgeben(1);
               return 0;
            }
            Fehlermeldeung_Ausgeben(2);
            return 0;
        }
    
        DCB dcbSerialParams = {0};
        dcbSerialParams.DCBlength=sizeof(dcbSerialParams);
        if (!GetCommState(hSerial, &dcbSerialParams)) {
           Fehlermeldeung_Ausgeben(3);
           return 0;
        }
        dcbSerialParams.BaudRate=CBR_9600;
        dcbSerialParams.ByteSize=8;
        dcbSerialParams.StopBits=ONESTOPBIT;
        dcbSerialParams.Parity=NOPARITY;
        if(!SetCommState(hSerial, &dcbSerialParams)){
            Fehlermeldeung_Ausgeben(4);
            return 0;
        }
    
        COMMTIMEOUTS timeouts={0};
        timeouts.ReadIntervalTimeout=50;
        timeouts.ReadTotalTimeoutConstant=50;
        timeouts.ReadTotalTimeoutMultiplier=10;
        timeouts.WriteTotalTimeoutConstant=50;
        timeouts.WriteTotalTimeoutMultiplier=10;
        if(!SetCommTimeouts(hSerial, &timeouts)) {
            Fehlermeldeung_Ausgeben(5);
            return 0;
        }
    
        char szBuff[16+1] = {0};
        szBuff[0] = 0x64;
        szBuff[1] = 0x1;
        szBuff[2] = 0x1;
        DWORD dwBytesWrite = 16;
        if(!WriteFile(hSerial, szBuff, 16, &dwBytesWrite, NULL)){
            Fehlermeldeung_Ausgeben(6);
        }
        char szBuff3[16+1] = {0};
        DWORD dwBytesRead3 = 16;
        if(!WriteFile(hSerial, szBuff3, 16, &dwBytesRead3, NULL)){
            Fehlermeldeung_Ausgeben(7);
        }
        char szBuff1[16+1] = {0};
        szBuff[0] = 0x64;
        szBuff[1] = 0x2;
        szBuff[2] = 0x30;
        szBuff[3] = 0x32;
        szBuff[4] = 0x32;
        szBuff[5] = 0x32;
        szBuff[6] = 0x32;
        szBuff[7] = 0x32;
        szBuff[8] = 0x32;
        DWORD dwBytesWrite1 = 16;
        if(!WriteFile(hSerial, szBuff1, 16, &dwBytesWrite1, NULL)){
            Fehlermeldeung_Ausgeben(6);
        }
        char szBuff4[16+1] = {0};
        DWORD dwBytesRead4 = 16;
        if(!WriteFile(hSerial, szBuff4, 16, &dwBytesRead4, NULL)){
            Fehlermeldeung_Ausgeben(7);
        }
    
        system("PAUSE");	
        return 0;
    }
    
    void Fehlermeldeung_Ausgeben(int Fehler) {
        switch(Fehler) {
            case 1 : printf("Fehler: Der Port ist nicht vorhanden\n");
                     break;
            case 2 : printf("Fehler: Ein Unbekanter Fehler ist aufgetreten\n");
                     break;
            case 3 : printf("Fehler: Es konnten keine Werte fur den Port ermittelt werden\n");
                     break;
            case 4 : printf("Fehler: Dem Port konnten keine Werte zugewisen werden\n");
                     break;
            case 5 : printf("Fehler: Timeout Fehler aufgetreten\n");
                     break;
            case 6 : printf("Fehler: Es konnten keine Daten geschrieben werden\n");
                     break;
            case 7 : printf("Fehler: Es konnten keine Daten gelesen werden\n");
                     break;
        }
        system("PAUSE");     
    }
    


  • Du definierst ein Array szBuff1 und sendest es auch, allerdings füllst du dazwischen ein Array szBuff

    char szBuff1[16+1] = {0};     // hier mit 1
        szBuff[0] = 0x64;           // hier ohne 1
        szBuff[1] = 0x2;
        szBuff[2] = 0x30;
        szBuff[3] = 0x32;
        szBuff[4] = 0x32;
        szBuff[5] = 0x32;
        szBuff[6] = 0x32;
        szBuff[7] = 0x32;
        szBuff[8] = 0x32;
        DWORD dwBytesWrite1 = 16;
        if(!WriteFile(hSerial, szBuff1, 16, &dwBytesWrite1, NULL)){ // hier wieder mit 1
    


  • Danke hab den Fehler behoben Funktioniert leider immer noch nicht



  • Sorry,
    habe gerade gesehen das ich im Falschen Bereich gepostet habe. Da meine Frage nicht zum Standart C gehört. Wenn möglich bitte in den richtigen Bereich verschieben.



  • Weil mir noch ein paar Fehler aufgefallen sind, hier nochmal der geänderte Code. Funktioniert leider immer noch nicht.

    #include <stdio.h>
    #include <stdlib.h>
    #include <windows.h>
    
    void Fehlermeldeung_Ausgeben(int Fehler);
    
    int main(int argc, char *argv[]) {
    
        HANDLE hSerial;
    
        hSerial = CreateFile("COM6",
                             GENERIC_READ | GENERIC_WRITE,
                             0,
                             0,
                             OPEN_EXISTING,
                             FILE_ATTRIBUTE_NORMAL,
                             0);
        if(hSerial==INVALID_HANDLE_VALUE) {
            if(GetLastError()==ERROR_FILE_NOT_FOUND) {
               Fehlermeldeung_Ausgeben(1);
               return 0;
            }
            Fehlermeldeung_Ausgeben(2);
            return 0;
        }
    
        DCB dcbSerialParams = {0};
        dcbSerialParams.DCBlength=sizeof(dcbSerialParams);
        if (!GetCommState(hSerial, &dcbSerialParams)) {
           Fehlermeldeung_Ausgeben(3);
           return 0;
        }
        dcbSerialParams.BaudRate=CBR_9600;
        dcbSerialParams.ByteSize=8;
        dcbSerialParams.StopBits=ONESTOPBIT;
        dcbSerialParams.Parity=NOPARITY;
        if(!SetCommState(hSerial, &dcbSerialParams)){
            Fehlermeldeung_Ausgeben(4);
            return 0;
        }
    
        COMMTIMEOUTS timeouts={0};
        timeouts.ReadIntervalTimeout=50;
        timeouts.ReadTotalTimeoutConstant=50;
        timeouts.ReadTotalTimeoutMultiplier=10;
        timeouts.WriteTotalTimeoutConstant=50;
        timeouts.WriteTotalTimeoutMultiplier=10;
        if(!SetCommTimeouts(hSerial, &timeouts)) {
            Fehlermeldeung_Ausgeben(5);
            return 0;
        }
    
        char szBuff[16+1] = {0};
        szBuff[0] = 0x64;
        szBuff[1] = 0x1;
        szBuff[2] = 0x1;
        DWORD dwBytesWrite = 16;
        if(!WriteFile(hSerial, szBuff, 16, &dwBytesWrite, NULL)){
            Fehlermeldeung_Ausgeben(6);
        }
        char szBuff3[16+1] = {0};
        DWORD dwBytesRead3 = 16;
        if(!ReadFile(hSerial, szBuff3, 16, &dwBytesRead3, NULL)){
            Fehlermeldeung_Ausgeben(7);
        }
        char szBuff1[16+1] = {0};
        szBuff1[0] = 0x64;
        szBuff1[1] = 0x2;
        szBuff1[2] = 0x30;
        szBuff1[3] = 0x32;
        szBuff1[4] = 0x32;
        szBuff1[5] = 0x32;
        szBuff1[6] = 0x32;
        szBuff1[7] = 0x32;
        szBuff1[8] = 0x32;
        DWORD dwBytesWrite1 = 16;
        if(!WriteFile(hSerial, szBuff1, 16, &dwBytesWrite1, NULL)){
            Fehlermeldeung_Ausgeben(6);
        }
        char szBuff4[16+1] = {0};
        DWORD dwBytesRead4 = 16;
        if(!ReadFile(hSerial, szBuff4, 16, &dwBytesRead4, NULL)){
            Fehlermeldeung_Ausgeben(7);
        }
    
        system("PAUSE");	
        return 0;
    }
    
    void Fehlermeldeung_Ausgeben(int Fehler) {
        switch(Fehler) {
            case 1 : printf("Fehler: Der Port ist nicht vorhanden\n");
                     break;
            case 2 : printf("Fehler: Ein Unbekanter Fehler ist aufgetreten\n");
                     break;
            case 3 : printf("Fehler: Es konnten keine Werte fur den Port ermittelt werden\n");
                     break;
            case 4 : printf("Fehler: Dem Port konnten keine Werte zugewisen werden\n");
                     break;
            case 5 : printf("Fehler: Timeout Fehler aufgetreten\n");
                     break;
            case 6 : printf("Fehler: Es konnten keine Daten geschrieben werden\n");
                     break;
            case 7 : printf("Fehler: Es konnten keine Daten gelesen werden\n");
                     break;
        }
        system("PAUSE");     
    }
    


  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C (C89 und C99) in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Benutze Realterm oder ein anderes Terminalprogramm um zu testen ob der Servo funktioniert. Dazu könntest du dein Programm in eine Datei statt an den COM-Port schreiben lassen und dann Realterm sagen, er soll den Inhalt der Datei an den COM-Port schicken.



  • Hast Du mal geschaut, ob im Programmverzeichnis eine Datei "COM6" erstellt wird? 🙂



  • CreateFile("COM6", ...
    

    wie waere es mit

    CreateFile("\\\\.\\COM6"
    


  • Die Datei "COM6" wird tatsächlich nicht erstellt. Auch die Änderung von Knivil hat das Problem nicht behobe



  • So habe es hinbekommen. Die Werte musten als normale Zahlen in einen String geschrieben und jeweils durch ein "-" getrennt werden.

    Danke für eure Hilfe


Anmelden zum Antworten