ComPorts über 9?



  • Hallo ich habe folgendes Problem.
    Ich möcht in einer Schleife nach der Reihe die ComPorts von 20 - 1 ansprechen.
    Von 10 -1 stellt das kein Problem dar.
    Leider habe ich noch keine Lösung gefunden.
    Um von die Ports von 20 -1 anzusprechen.

    Hier der Code:

    String ^str;
    DCB dcb;
    HANDLE hCom;
    BOOL fSuccess;
    clock_t start;

    int wert;
    wert =10;
    com=L"COM10";

    while(wert !=0)
    {

    hCom = CreateFile(com,
    GENERIC_READ | GENERIC_WRITE,
    0,
    NULL,
    OPEN_EXISTING,
    0,
    0);
    if (hCom == INVALID_HANDLE_VALUE)
    // error opening port; abort

    fSuccess = GetCommState(hCom, &dcb);

    str = wert.ToString();
    label3->Text = "ComPort: "+str+" ";
    label3->Refresh();

    wert--;
    //Hier wird der Wert um 6 erhöht um auf den nächsten Port zuzugreifen//
    //Leider funktioniert das nur von 10 bis 1//
    com=com+6;

    dcb.fDtrControl = DTR_CONTROL_ENABLE;
    dcb.fRtsControl = RTS_CONTROL_ENABLE;

    unsigned long geschrieben;
    unsigned char zeichen = 0;

    int sekunden = *zeit * CLOCKS_PER_SEC;

    start = clock();
    while( clock() < start + sekunden)
    {
    zeichen++;
    zeichen %= 255;
    WriteFile(hCom,&zeichen,1,&geschrieben,0);
    }

    fSuccess = SetCommState(hCom, &dcb);

    CloseHandle(hCom);
    hCom = NULL;

    label3->Text = "Test Beendet";
    label3->Refresh();
    }



  • http://support.microsoft.com/kb/115831/en-us

    PS: Warum mischt Du native und managed Code? Macht doch gar keinen Sinn!
    Verwende doch System::IO::Ports::SerialPort !



  • Dankeschön.

    Aber mein Haupt Problem ist die Ports in einer Schleife von 20 bis runter auf 1 Anzusprechen. Was mit den Ports von 10 bis 1 kein Problem ist.
    Da reichts es com=com+6; in jeder Schleife auszuführen.
    Aber wie mache ich das von 20 runter.



  • C++/CLI:

    for(int i=20; i>=; i--)
    {
      String ^comPort = String::Format("\\\\.\\COM{0}", i);
      // ...
    }
    

    C:

    char comPort[30];
    for(int i=20; i>=; i--)
    {
      sprintf(comPort, "\\\\.\\COM%d", i);
      // ...
    }
    


  • Hallo,

    jetzt bekomme ich die Folgende Fehlermeldung:

    'CreateFileW': Konvertierung des Parameters 1 von 'System::String ^' in 'LPCWSTR' nicht möglich



  • Ich sag ja: Es führt nur zu Probleme, wenn Du C++/CLI und C/C++ mischt, ohne dass Du weisst, was Du tust!!!

    Nimm entweder C/C++ und dann folgendes

    TCHAR comPort[30]; 
    for(int i=20; i>=; i--) 
    { 
      _tsprintf(comPort, _T("\\\\.\\COM%d"), i); 
      // ... 
    }
    

    oder nimm die SerialPort Klasse.



  • Danke für deine Hilfe.
    Eigentlich wollte ich es mir einfach machen und alten Code wieder verwenden.
    Nehm jetzt doch die CLI.



  • Erstes Problem gelöst.
    Dafür jetzt ein anderes.
    Ich brauche in meiner Schleife eine Wartefunktion die,
    die Schleife erst nach einer gewissen Zeit wieder ausführt.
    Ich habe es mit Sleep() probiert.
    Doch dann bleibt der Rechner stehen.

    clock_t start;
    String ^str;
    int wert;
    wert =1;
    int i;
    i=1;

    while(wert!=21)
    {
    String ^comPort = String::Format(".\\COM{0}", i);

    this->serialPort1->PortName = comPort;
    this->serialPort1->DtrEnable = true;
    this->serialPort1->RtsEnable = true;
    i++;

    str = wert.ToString();

    label3->Text = "ComPort: "+str+" ";
    label3->Refresh();

    int sekunden = *zeit * CLOCKS_PER_SEC;

    start = clock();
    while( clock() < start + sekunden)
    {

    }

    wert++;

    }



  • guude,

    Jochen Kalmbach schrieb:

    http://support.microsoft.com/kb/115831/en-us

    PS: Warum mischt Du native und managed Code? Macht doch gar keinen Sinn!
    Verwende doch System::IO::Ports::SerialPort !

    ist es mit diesem namespace auch moeglich auf usb ports zu zugreifen?

    gruss,
    buk



  • Guck Dir den System::Threading::Timer oder die anderen zwei Timers an (findest du wenn Du in Google "msdn timer .net" eingibst.
    Simon



  • buk schrieb:

    ist es mit diesem namespace auch moeglich auf usb ports zu zugreifen?

    wenn dahinter ein serial <> usb converter ist schon.
    Simon



  • guude,

    theta schrieb:

    wenn dahinter ein serial <> usb converter ist schon.
    Simon

    leider nicht. ich habe hier ein stueck code eines mfc projektes in dem mit CreateFile ein handle erzeugt wird, das dann der methode DeviceIoControl uebergeben wird um mit dem usb port des druckers zu kommunizieren und daten zu lesen bzw zu schreiben.

    ich weiss nur nicht wie ich das nun in einem c++/cli projekt einbinden soll/muss.

    regards,
    buk



  • In C++/CLI kannst Du es einfach "reinkopieren" und es geht sofort 😉
    Das ist ja gerade der Vorteil von C++/CLI!



  • danke, und ich muss nichts mehr includen? weil, wenn ich das in c# programmieren wollte muesste ich doch die kernel32.dll importieren, wie hier[1] beschrieben, oder?

    regards,
    buk

    [1] http://pinvoke.net/default.aspx/kernel32/CreateFile.html



  • Nein. Es reicht, wenn Du

    #include <windows.h>
    

    machst. Nötigenfalls noch die LIBs dazulinken...



  • vielen dank!


Anmelden zum Antworten