Dziwne zachowanie RS ?

0

Witam.

Mam dość nietypowy problem. Mianowicie podłączyłem pod laptopa Arduino(mikrokontroler). Napisałem aplikacje odbierającą dane przez RS korzystając z WinApi. Wszystko działało pięknie(łączyłem się z urzadzeniem, odbierałem dane, przetwarzałem je) dopóki nie wpadłem na pomysł, że umieszczę nasłuch portu i implementację danych w osobnych wątkach. Zapętliłem przez przypadek oba wątki, zawiesiłem laptopa i bum. Po restarcie maszyny funkcja SetCommSet zwraca błąd 87. Czym to może być spowodowane ? Próbowałem różnych sztuczek, odłączałem zasilanie na kilka minut, czyściłem błędy, zmieniałem kompilator i nic się nie zmienia.

Oto mój listing funkcji odpowiedzialnej za utworzenie połączenia:

rs::rs()
{
    string Numer="\\\\.\\COM10";

        hNumPort=CreateFileA(Numer.c_str(),GENERIC_WRITE |GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
        dw=GetLastError();
          if(!dw)
          {
                 cout<<"Create File: "<<"done"<<endl;
          }
          else
          {
                cout<<"Create File: false"<<endl;
          };
          dcb.DCBlength = sizeof(dcb);
          dcb.BaudRate= CBR_9600;
          dcb.fParity= FALSE;
          dcb.Parity= NOPARITY;
          dcb.StopBits= ONESTOPBIT;
          dcb.ByteSize= 8;

          dcb.fDtrControl= DTR_CONTROL_DISABLE;
          dcb.fRtsControl= DTR_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;
          //********************************************************************
          SetCommMask(hNumPort,0x0002);
          dw=GetLastError();
          if(!dw){
            cout<<"SetCommMask: "<<" done"<<endl;
          }
          else
          {
              cout<<"SetCommMask: "<<"false"<<endl;
          };

          SetCommState(hNumPort, &dcb);
          dw=GetLastError();
          if(!dw){
            cout<<"SetCommState: "<<" done"<<endl;
            }
          else
          {
              cout<<"SetCommState: "<<"false :  "<<dw<<endl;
          };
          cout<<"----------------------------------------------------"<<endl;
        buffor=0;
}
0

87 to chyba INVALID_PARAMETER, sprobuj wiec dla samego testu z innymi flagami, np. samo GEN_READ - moze cos coś juz używa w tle z write'm?
sprawdz tez, czy faktycznie nadal w systemie masz COM10? moze zmienil mu sie numer..
i na wszelki totalnie wypadek, sprawdz czy inne programy go widza i sa w stanie z niego poprawnie skorzystac, taki np. hyperterminal.. zawsze jest szansa ze Ci sie z powodu jakiej paskudnej nietypowej drogi pomiędzy pinami - sfajczyl.. na COM to cięzko, na LPT bardzo łatwo, ale kto wie:/

0

Jestem teraz na uczelni, jak wrócę to przetestuje to co mi podałeś.
COM10 nadal istnieje i działa, sprawdzałem programem podobnym do hyperterminal.

edytka:
niestety nic nie pomogło. przeinstalowałem sterowniki i ciągle to samo :O

1 użytkowników online, w tym zalogowanych: 0, gości: 1