Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

winapi + rs232 + terminal?

Graziu 20 Jul 2008 17:21 7441 27
  • #1
    Graziu
    Level 11  
    Witam.. mam problem dot komunikacji z telefonem poprzez rs232.
    podsluchalem ruch podczas laczenia z telefonem za pomoca hyperterminal..
    jednak wynik jest zupelnie rozny od uzyskanego przeze mnie... ;|

    wiadomo, ze z modemem (telefonem) komunikujemy sie za pomoca komend AT.
    czyli wysylam np:

    AT

    otrzymuje

    OK

    i zaczyna sie problem.. ;/
    mam wrazenie ze wysylam znaki AT w zupelnie inny sposob niz wysyla to hyperterminal..

    ps. programuje w builder c++. ale wystarczy mi pomoc w c,c++,pascal itd..

    kod z ksiazki (transmit):

    
    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #include <stdio.h>
    #pragma hdrstop
    
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    
    
        HANDLE   hCommDev;         // identyfikator portu
        LPCTSTR  lpFileName;       // przechowuje nazwę portu
        DCB      dcb;              // struktura kontroli portu szeregowego
    
    
    int __fastcall TForm1::Close_Comm(HANDLE hCommDev)
    {
        CloseHandle(hCommDev);
        return TRUE;
    }
    
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Button5Click(TObject *Sender)
    {
    Close_Comm(hCommDev);
         Application->Terminate();
            
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button4Click(TObject *Sender)
    {
    
            lpFileName = "COM3";
    
    
        hCommDev = CreateFile(lpFileName, GENERIC_READ | GENERIC_WRITE,
                              0, NULL, OPEN_EXISTING, 0, NULL);
    
        if (hCommDev != INVALID_HANDLE_VALUE)   // sprawdza, czy port jest
                                                // otwarty prawidłowo
          {
            dcb.DCBlength = sizeof(dcb);
            GetCommState(hCommDev, &dcb);
    
                 dcb.BaudRate=CBR_19200;
    
              dcb.Parity = ODDPARITY;           // ustawienie parzystości
              dcb.StopBits = ONESTOPBIT;        // bity stopu
              dcb.ByteSize = 7;                 // bity danych
    
            //-przykładowe ustawienia flag sterujących DCB-
              dcb.fParity = TRUE;              // sprawdzanie parzystości
              dcb.fDtrControl = DTR_CONTROL_DISABLE;  
                                                    
              dcb.fRtsControl = RTS_CONTROL_DISABLE; 
                                                    
              dcb.fOutxCtsFlow = FALSE;
              dcb.fOutxDsrFlow = FALSE;
              dcb.fDsrSensitivity = FALSE;
              dcb.fAbortOnError = FALSE;
              dcb.fOutX = FALSE;
              dcb.fInX = FALSE;
              dcb.fErrorChar = FALSE;
              dcb.fNull = FALSE;
    
            SetCommState(hCommDev, &dcb);
    
          }
          else
            {
             switch ((int)hCommDev)
               {
                case IE_BADID:
                  MessageBox(NULL, "Niewłaściwa nazwa portu lub port jest" 
                             " aktywny.", "Błąd !", MB_OK);
                break;
               };
             }
    
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
        if (hCommDev > 0)
          TransmitCommChar(hCommDev, 'A');
          else
            MessageBox(NULL, "Port nie został otwarty do transmisji.",
                        "Błąd !", MB_OK);
            
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
        if (hCommDev > 0)
          TransmitCommChar(hCommDev, 'T');
          else
            MessageBox(NULL, "Port nie został otwarty do transmisji.",
                        "Błąd !", MB_OK);
    
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button3Click(TObject *Sender)
    {
        if (hCommDev > 0)
          TransmitCommChar(hCommDev, char(13));
          else
            MessageBox(NULL, "Port nie został otwarty do transmisji.",
                        "Błąd !", MB_OK);
    
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button6Click(TObject *Sender)
    {
         if (hCommDev > 0)
          TransmitCommChar(hCommDev, char(10));
          else
            MessageBox(NULL, "Port nie został otwarty do transmisji.",
                        "Błąd !", MB_OK);
    }
    //---------------------------------------------------------------------------
    
    

    w unit.h dodane biblioteki:

    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    #include <Buttons.hpp>
    #include <ComCtrls.hpp>
    #include <Dialogs.hpp>
    #include <ExtCtrls.hpp>

    a w sekcji private: int __fastcall TForm1::Close_Comm(HANDLE hCommDev);




    w ten sposob transmituje literke po literce..
    probowalem tez calosciowo..

    
    #define cbOutQueue 64          //rozmiar bufora danych wyjściowych
    #define cbInQueue  64          //rozmiar bufora danych wejściowych
    
    
        LPCTSTR query = "AT";   // przykładowe zapytanie
        char    Buffer_O[cbOutQueue]; // bufor danych wyjściowych
        char    Buffer_I[cbInQueue];  // bufor danych wejściowych
        DWORD   Number_Bytes_Read; // Number Bytes to Read - liczba bajtów  
                                   // do czytania
        HANDLE  hCommDev;          // identyfikator portu
        LPCTSTR lpFileName;        // wskaźnik do nazwy portu
        DCB     dcb;               // struktura kontroli portu szeregowego
        DWORD   fdwEvtMask;    // informacja o aktualnym stanie transmisji
        COMSTAT Stat;          // dodatkowa informacja o zasobach portu
        DWORD   Errors;        // reprezentuje typ ewentualnego błędu
    
    



    
    int __fastcall Write_Comm(HANDLE hCommDev, LPCVOID lpBuffer,
                              DWORD nNumberOfBytesToWrite)
    {
       DWORD NumberOfBytesWritten;
    	
       EscapeCommFunction(hCommDev, SETRTS);
    
       if (WriteFile(hCommDev, lpBuffer, 
           nNumberOfBytesToWrite, &NumberOfBytesWritten, NULL) > 0)
         {
           WaitCommEvent(hCommDev, &fdwEvtMask, NULL);
    
           EscapeCommFunction(hCommDev, CLRRTS);
    
           return TRUE;
    
          }
          else
            return FALSE;
    }
    


    
    void __fastcall TForm1::ConnectClick(TObject *Sender)
    {
    
    lpFileName="COM3";
    hCommDev = CreateFile(lpFileName, GENERIC_READ | GENERIC_WRITE,
                              0, NULL, OPEN_EXISTING, 0, NULL);
    
        if (hCommDev != INVALID_HANDLE_VALUE)   // sprawdza, czy port jest otwarty prawidłowo
          {
          SetupComm(hCommDev, cbInQueue, cbOutQueue);
    
            dcb.DCBlength = sizeof(dcb);    // aktualny rozmia struktury DCB
            GetCommState(hCommDev, &dcb);
                 dcb.BaudRate=atol(("CBR_"+Form1->speed->Text).c_str());   // wybór prędkości transmisji
    
    
            //--parametry komunikacyjne-------
              dcb.Parity = NOPARITY;            // ustawienie parzystości
              dcb.StopBits = ONESTOPBIT;         // bity stopu
              dcb.ByteSize = 8;                  // bity danych
    
            //--przykładowe ustawienia znaczników sterujących DCB----
              dcb.fParity = TRUE;               // sprawdzanie parzystości
              dcb.fDtrControl = DTR_CONTROL_ENABLE; // sygnał DTR stale
                                                    // aktywny
              dcb.fRtsControl = RTS_CONTROL_DISABLE;// RTS - stan 
                                                    // nieaktywny
              dcb.fOutxCtsFlow = FALSE;
              dcb.fOutxDsrFlow = FALSE;
              dcb.fDsrSensitivity = FALSE;
              dcb.fAbortOnError = FALSE;
              dcb.fOutX = FALSE;
              dcb.fInX = FALSE;
              dcb.fErrorChar = FALSE;
              dcb.fNull = FALSE;
    
            SetCommState(hCommDev, &dcb);
            GetCommMask(hCommDev, &fdwEvtMask);
            SetCommMask(hCommDev, EV_TXEMPTY);
    
    
          }
          else
            {
             switch ((int)hCommDev)
               {
                case IE_BADID:
                  MessageBox(NULL, "Niewłaściwa nazwa portu lub port jest aktywny.", "Błąd", MB_OK);
                break;
               };
             }
    
    
    
    
    
    
    
    
      //FILE *pstream;        // wskaźnik do pliku
      if (hCommDev > 0)   // powtórnie sprawdza czy port jest otwarty
        {
          strcpy(Buffer_O, query);
          Write_Comm(hCommDev, Buffer_O, strlen(Buffer_O));
        }
     }
    



    ---------
    moze ktos pomoze? dopiero zaczynam zabawy z winapi, wiec.. prosze o wyrozumialosc.. z obsluga com tez.. ;p wlasnie wydrukowalem 140 stron i zabieram sie do lektury.. jednak.. za kazda pomoc bede wdzieczny! :D

    zadna z podanych wyzej wersji nie dziala niestety.. ;|



    ========
    edit
    ========

    czy moze ktos lopatologicznie wytlumaczyc mi na czym polega parzystosc bitowa, bity stopu itd? :) bo srednio to rozumiem i korzystam z gotowych konfiguracji :)


    dodam, iz program ma komunikowac sie z telefonem (com, usb, irda, bt).. na szczescie wszystkie te moduly instaluja sie autiomatycznie na porrcie COM :) i sa z jego poziomu dostepne.
  • #3
    Graziu
    Level 11  
    ja wlasnie nasluchuje co wysyla moj program ;|

    hyper terminal wysyla co literke, tak jakby echo odbija urzadzenie odbija literke.. po wcisnieciu entera char(13)
    wysyla znak entera i dostaje odpowiedz..
    czyli:
    request: A
    anserw: A

    request: T
    anserw: T

    request: .
    anserw: .
    anserw: ..OK..


    natomiast przy moim programie.. roznymi sposobami dostaje:

    request: AT.



    i to na tyle ;)

    korzystam z Free Serial Port Monitor.. :)
    analizowac nie ma za wiele co :)
    to sa ksiazkowe przyklady, ew lekko zmodyfikowane lub przyklady ktore juz byly na forum.. ;|

    niestety.. modem nie odpowiada mojemu programowi jak hyperterminalowi :(


    //EDIT

    wlaczylem RTS na on..
    pozmienialem jeszcze jakies bajerki i dziala ;]
    hmm.. ok. teraz kombinowac i ubrac to w jakies latwe i przyjemne dla mnie funkcje :)

    czy ktos zna powod dla ktorego nie dzialalo?

    i.. moze skoro juz pisze na forum ktos w prosty sposob wytlumaczy mi na czym polega RTS itd?
  • #4
    radekr
    Level 16  
    Powód w zasadzie sam znalazłeś: Flow Control (kontrola przepływu) - urządzenie odbiorcze kontroluje ilośc danych jakie są do niego przysyłane. W RS232 są 2 "rodzaje" flow control:
    1. sprzętowe - dodatkowe linie sygnałowe RTS, CTS - poczytaj o działaniu RS232,
    2. programowe XON, XOFF - znaki specjalnie przesyłane po liniach Rx/Tx
    3. oraz brak kontroli przepływu.
    Zapewne twój telefon wymaga sprzętowego flow control, dlatego nie działało bez jego włączenia.
  • #5
    Graziu
    Level 11  
    hmm.. wlasnie zaglebiam sie w lekturze dosc obszernej ksiazeczki (pobranej zreszta z tego forum:P)

    jak bede mial jeszcze jakies problemy, bede pisal tutaj.
    (bo beda dotyczyly tylko i wylacznie tego zagadnienia)
  • #6
    Fyszo
    Level 37  
    Dzisiaj praktycznie nie ma sprzętu ze sprzętową kontrolą przepływu, wszystko zawiera już mikrokontrolery co Xon/Xoff obsłużą i każdy oszczędza na kablach.
  • #7
    Graziu
    Level 11  
    hmm.. aktualnie korzystam pod irda. (u mnie zainstalowana pod COM3)
    jednak...
    wysylanie do portu (telefonu) dziala idealnie..
    natomiast odbior? aplikacja przywiesza sie, trzeba baaardzo dlugo czekac na odp.
    po podsluchu zauwazylem bardzo duzo "paczek"(?) DOWN typu FALSE.. czyli tak jakby read sie nie powiodlo ;|
    czasami musze baaardzo dlugo czekac, lub nawet to czekanie na odp nie pomaga.

    hyperterminal nie ma takich problemow. zauwazylem jednak, ze on jakby czesciej ustawia parametry dcb?

    nie wiem ;|
    pomocy :)

    laczenie:
    lpFileName="COM3";
    hCommDev = CreateFile(lpFileName, GENERIC_READ | GENERIC_WRITE,
                              0, NULL, OPEN_EXISTING, 0, NULL);
    
        if (hCommDev != INVALID_HANDLE_VALUE)   // sprawdza, czy port jest otwarty prawidłowo
          {
          SetupComm(hCommDev, cbInQueue, cbOutQueue);
    
            dcb.DCBlength = sizeof(dcb);    // aktualny rozmia struktury DCB
            GetCommState(hCommDev, &dcb);
                 dcb.BaudRate=atol(("CBR_"+Form1->speed->Text).c_str());   // wybór prędkości transmisji
    
    
            //--parametry komunikacyjne-------
              dcb.Parity = NOPARITY;            // ustawienie parzystości
              dcb.StopBits = ONESTOPBIT;         // bity stopu
              dcb.ByteSize = 8;                  // bity danych
    
            //--przykładowe ustawienia znaczników sterujących DCB----
              dcb.fParity = FALSE;               // sprawdzanie parzystości
              dcb.fDtrControl = DTR_CONTROL_HANDSHAKE; // sygnał DTR stale
                                                    // aktywny
              dcb.fRtsControl = RTS_CONTROL_HANDSHAKE;// RTS - stan
                                                    // aktywny
              dcb.fOutxCtsFlow = FALSE;
              dcb.fOutxDsrFlow = FALSE;
              dcb.fDsrSensitivity = FALSE;
              dcb.fAbortOnError = FALSE;
              dcb.fOutX = FALSE;
              dcb.fInX = FALSE;
              dcb.fErrorChar = FALSE;
              dcb.fNull = FALSE;
    
            SetCommState(hCommDev, &dcb);
            //GetCommMask(hCommDev, &fdwEvtMask);
            //SetCommMask(hCommDev, EV_TXEMPTY);
    
    
          }
          else
            {
             switch ((int)hCommDev)
               {
                case IE_BADID:
                  MessageBox(NULL, "Niewłaściwa nazwa portu lub port jest aktywny.", "Błąd", MB_OK);
                break;
               };
             }
    
    

    (HANDSHAKE.. obojetnie czy mam enabled czy handshake jest to samo ;| proowalem handshake na rts a enable na dtr - bez zmian)

    tak wysylam: (pobrane od kogos)
    int __fastcall TForm1::WriteUart(unsigned char *buf, int len)
    {
    DWORD dwNumBytesWritten;
    WriteFile (hCommDev, // Port handle
    buf, // Pointer to the data to write
    len, // Number of bytes to write
    &dwNumBytesWritten, // Pointer to the number of bytes written
    NULL); // Must be NULL
    if(dwNumBytesWritten > 0)
    return 1; //Transmission was success
    else return 0; //Error transmitting?
    }


    a tak odbieram: (pobrane od kogos)
    int __fastcall TForm1::ReadUart(unsigned char *buf, int len)
    {
    BOOL ret;
    unsigned long retlen;
    
    ret = ReadFile(hCommDev, // handle of file to read
    buf, // pointer to buffer that receives data
    len, // number of bytes to read
    &retlen, // pointer to number of bytes read
    NULL // pointer to structure for data
    );
    if(retlen > 0) //If we have data
    return (int) retlen; //return the length
    
    else return 0; //else no data has been read
    }


    blad lezy gdzies w odbiorze.. ;/

    zmienna globalna: unsigned char EOL[]={0x0D};

    przyklad:

    WriteUart("AT",2);
    WriteUart(EOL,1);

    (zostaje wyslane do portu)

    char odp[200];
    ReadUart(odp,20);

    (i tu program dostaje zwieche)..

    z tego co widze, program wysyla zapytanie i sygnal ze czeka na odpowiedz.. ale.. odpowiedz przychodzi dopiero PO wylaczeniu programu.. mianowicie:

    uruchamiam program
    ustawiam parametry polaczenia
    wysylam komende AT
    (komenda zostaje przeslana)

    program sie zwiesza.. lub b.dlugoo czeka..

    wylaczam program..
    do programu nasluchujacego port przychodzi nagle odpowiedz OK

    AT
    OK


    ;|
    wie ktos moze co zle zrobilem?

    Dodano po 4 [godziny] 22 [minuty]:



    odkrylem gdzie +/- lezy problem..
    program ZAWSZE zawiesza sie podczas odczytu ReadFile w timerze.. czyli ze np co 50ms powtarza odczyt i analizuje dane ktore dostarczono. ;|

    Dodano po 1 [godziny] 57 [minuty]:

    wie ktos dlaczego?
    i jak to zrobic, aby program nasluchiwal odpowiedz z portu od momentu w ktorym user wysle zapytanie az do momentu uzyskania odpowiedzi?
  • #10
    Graziu
    Level 11  
    wtedy umiescic to w osobnym watku? czy w timerze ktory bedzie caly czas nasluchiwal WaitCommEvent?
    bo nie wiem co dokladniej mialoby mi to dac.
    czy prace w petli, czy tez zapobiec blednemu dzialaniu przy odbieraniu?
  • #12
    Graziu
    Level 11  
    oo. :) to ze delphi mi nie przeszkadza - znam troche.. zreszta.. to jest obiektowy pascal podobny do bcb ;p
    thx :) zabieram sie do czytania. :)
  • #13
    JmL(TM)
    Level 24  
    Pisalem kiedys programik, ktory zarzadzal telefonem siemens ME45 [wgrywanie grafiki, synchronizacja czasu, zmiana ustawien itp]. Nie widzialem nigdzie jaki model telefonu Ty chcesz obslugiwac... poczytaj na jakich ustawieniach przebiega transmisja danych bo u ciebie jest:

    dcb.Parity = ODDPARITY;           // ustawienie parzystości
    dcb.StopBits = ONESTOPBIT;        // bity stopu
    dcb.ByteSize = 7;                 // bity danych


    a z tego co mi wiadomo wiekszosc telefonow dziala na:

    19200,8,1,NOPARITY


    Poza tym poszukaj opisu komend AT w sieci (jest tego sporo).
  • #14
    Graziu
    Level 11  
    ja chce zarzadzac SE. k700 i innymi.
    problem jest taki, ze mam noparity, onebitstop,bytesize na 7 lub na 8. probowalem wszystkich kombinacji..

    Dodano po 1 [minuty]:

    co do komend AT.. napisalem program ;p tylko ze korzystal z ActiveXperts ComPort.. wersja 30dniowa ;p po tym czasie juz sie nie laczy.. dlatego chcialem napisac wlasne funkcje laczace sie.. ;/
  • #15
    JmL(TM)
    Level 24  
    A nie szybciej zatem wykupic licencje dla ActiveXperts ComPort? Tak mialbys juz gotowy dzialajacy program... :D

    PS: Przeszukiwales juz elektrode? :roll:
  • #16
    Graziu
    Level 11  
    tak.. i to chyba wszystko przeczytalem ;p

    kupic??! omg.. sorka ale wole miec te "120 $" czy euro w kieszeni ;p chyba zrozumiale..
  • #18
    willyvmm
    Level 30  
    Jak nie przeszkadza ci Delphi to polecam Lazarus'a + gotowe komponenty do coma (za free oczywiście)
  • #19
    Graziu
    Level 11  
    delphi nie przeszkadza, ale jednak program juz mam pod builder c++.. wiec.. nie mam zbytnio ochoty przerabiac dosc delikatnego kodu (dosc obszernego) na delphi.. a jakims konwerterom nie ufam ;p

    a czy te komponenty dzialac beda pod builderem? :D

    wlasnie czytam ksiazeczke, i juz wiem co to jest parity i cala reszta :) przez czesc teoretyczna przebrnalem jakos ;) teraz moge myslec:)

    Dodano po 30 [sekundy]:

    ps. co do uarpa, zapoznam sie z nim :) thx JmL
  • #20
    Graziu
    Level 11  
    aktualnie nie mam czasu aby sie dalej zaglebic.. ale.. w najblizszym czasie powinienem ruszyc z zadaniem :)
    wtedy wrzuce to kodzik i rozwiazanie ;]
  • Helpful post
    #21
    JmL(TM)
    Level 24  
    :arrow: Graziu: Wlasnie skonczylem pisanie programu do aktualizacji firmware do mojego alarmu GSM, ktory korzysta z bootloader'a i odczytuje dane wlasnie z RS232 i zapisuje je we flashu MCU. Napisane w czystym WinAPI i na watkach. Wykorzystalem oczywiscie biblioteke, ktora tobie polecilem 8) i wszystko smiga jak powinno!

    winapi + rs232 + terminal?

    PS. przyklad uzycia biblioteki UART:
    SetupUart("COM1", 19200, 8, 1, NOPARITY);
    
    ReadUart(UART_data, UART_BUFFER_SIZE);
    WriteUart(UART_data, lstrlen(UART_data));


    I po problemie! :D
  • #22
    Graziu
    Level 11  
    dzieki :) jako ze mam chwile, moge sie zabrac do roboty :D
    ps. mozesz wyjasnic bardziej dzialanie programu? ;>
  • #23
    JmL(TM)
    Level 24  
    Wytlumaczyc dzialanie programu? :cunning: Moj program generalnie nie ma wiele wspolnego z twoim... no moze poza tym, ze rowniez wykorzystuje komunikacje przez RS232 8). Napisz lepiej co ty chcesz osiognac. Co konkretnie program ma robic i do czego chcesz go wykorzystywac?
  • #24
    larkow
    Level 10  
    Nie koniecznie na temat, ale na wstępie proponuję:

    1. przećwiczenie komunikacji rs via przykładowo emulator com'ów com0com
    2. przetestowanie działającego programu np. na zwykłym modemie, który z zasady działa
    3. próba dogadania się z telefonem

    przejście w twoim przypadku od razu do punktu 3 sprawia, że tak naprawdę do końca nie wiadomo gdzie jest problem (soft, telefon)
  • #25
    madteus
    Level 11  
    Trzeba troche odświerzyć ten wątek bo się przykurzył :)
    Czy wie ktoś jak odczytać ze systemu dostępne wolne porty COM?
  • #26
    JmL(TM)
    Level 24  
    madteus wrote:
    Czy wie ktoś jak odczytać ze systemu dostępne wolne porty COM?


    Robisz petle od 1 do 8 i zwyczajnie probujesz otworzyc port po porcie i jesli masz dostep do niego to jest wolny wiec zamykasz i dodajesz do listy a jesli nie masz dostepu to znaczy, ze juz jakas inna aplikacja z niego korzysta...

    proste? :boss:
  • #27
    Szymon Tarnowski
    Level 27  
    JmL(TM) wrote:
    Robisz petle od 1 do 8 i zwyczajnie probujesz otworzyc port po porcie i jesli masz dostep do niego to jest wolny wiec zamykasz i dodajesz do listy a jesli nie masz dostepu to znaczy, ze juz jakas inna aplikacja z niego korzysta...
    A co jak zainstalujesz sobie np BlueSolei który domyślnie instaluje 16 portów wirtualnych? Potem podpinasz przejściówkę USB-rs232 i nagle jej numer to COM20. Jeśli już to warto przeskanować numery od 1 do chociaż 30, bo można się lekko ździwić.
    Wydaje mi się że przy pomocy tego samego API którym się poszukuje np urządzeń HID można by poszukać urządzeń portu szeregowego, przypuszczam, że odpowiedni GUID urządzenia tego typu jakoś dałoby się znaleźć.
  • #28
    JmL(TM)
    Level 24  
    Szymon w zasadzie masz racje i Windows dopuszcza numeracje portow COM od 1..256 a LPT tylko 1..3 :D No ale czy petla bedzie od 1..8 czy od 1..xx w kodzie nie ma juz wiekszego problemu ze miana 8)

    Pozdrawiam!