logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[c++] C++ RS232: zawieszanie programu przy otwieraniu portu COM4 bez HyperTerminal

dalles86 02 Sty 2010 14:06 2735 11
REKLAMA
  • #1 7471887
    dalles86
    Poziom 12  
    Posty: 37
    Pomógł: 3
    Ocena: 8
    Napisałem program do obsłu RS232 na podstawie tego co znalazłem w necie. Żeby program działał i nie zawiesił się muszę wcześniej odpalić HyperTerminal i otworzyć port COM pozniej go zamykam i dopiero mogę uruchomić mój program. W przeciwnym razie przy próbie odczytu program się zawiesza.
    
    int rs232otworz(void)
    {
       //otwarcie portu COM4 z prawami RW
        hCom = CreateFile( TEXT("COM4"), GENERIC_READ | GENERIC_WRITE,
            0,    // exclusive access
            NULL, // default security attributes
            OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
       
        if (hCom == INVALID_HANDLE_VALUE)
        {
            printf("CreateFile failed with error %d.\n", GetLastError());
            return 1;
        }
           //pobranie aktualnych ustawien portu
        fSuccess = GetCommState(hCom, &dcb);
        if (!fSuccess)
        {
          printf ("GetCommState failed with error %d.\n", GetLastError());
          return 2;
        }
    
       //ustawienie naszej konfiguracji
       dcb.BaudRate = CBR_9600;     // predkosc transmisji
       dcb.ByteSize = 8;             // ilosc bitow danych
       dcb.Parity = NOPARITY;        // brak bitu parzystosci
       dcb.StopBits = ONESTOPBIT;    // dwa bity stopu
    
       fSuccess = SetCommState(hCom, &dcb);
       if (!fSuccess)
       {
          printf ("SetCommState failed with error %d.\n", GetLastError());
          return 3;
       }
       return 101;
    }


    
    int rs232wyslij(void)
    {
       //wyslanie 1 bajta przez RS
    
        fSuccess =  WriteFile( hCom, &paczka, 24, &RS_ile, 0);
        if (!fSuccess)
        {
          printf ("WriteFile failed with error %d.\n", GetLastError());
          return 4;
        }
        return 202;
    }


    
    int rs232odbierz(void)
    {
            fSuccess = ReadFile( hCom, &RS_bufodb, 24, &RS_ile, 0);
            if (!fSuccess)
            {
                printf ("ReadFile failed with error %d.\n", GetLastError());
                return 5;
            }
            return 555;
    }
    }
  • REKLAMA
  • REKLAMA
  • #3 7472658
    dalles86
    Poziom 12  
    Posty: 37
    Pomógł: 3
    Ocena: 8
    d.d napisał:
    Przed wyłączeniem programu musisz zamknąć uchwyt


    Kolega chyba nie zrozumiał.
    Po restarcie komputera jak uruchomię program to on się zawiesza, kiedy zaczyna czytać z bufora RS232.
    Jeśli włączę HyperTerminal otworzę port poznije go zamknę i wyłączę HyperTerminal to mój program już działa poprawnie i mogę go włanczać ile razy chcę (do następnego restartu komputera).

    Dodano po 3 [minuty]:

    Czyli wynika z tego że HyperTerminal wprowadza jakieś zmiany w konfiguracji portu które są niezbędne do prawidłowego działania mojego programu, tylko nie wiem jakie. Program testowałem na 2 systemach ale tylko na przejściówce USB/RS232.
  • #4 7472891
    d.d
    Poziom 20  
    Posty: 386
    Pomógł: 36
    Ocena: 18
    Właśnie przeszukałem źródła i znalazłem kod który kiedyś używałem(znaleziony w sieci) i wszystko mam tak samo jak ty i działa .
    Może coś ci blokuje dostęp do portu albo jakiś program otwiera port na starcie systemu .
    Odblokowałeś porty programem UserPort ?? .

    Skompilowałem twoje procedury pod Dev-C++ i działa poprawnie nawet na USB/RS232.
  • #5 7473224
    dalles86
    Poziom 12  
    Posty: 37
    Pomógł: 3
    Ocena: 8
    d.d napisał:

    Odblokowałeś porty programem UserPort ?? .


    Nic nie odblokowywałem.

    Ale najlepsze jest to że wysyła więc dostęp do portu jest tylko jak przechodzi do odbieranie to się zwiesza. Funkcja odbioru nie jest zbyt zawiła więc zawieszać ja może tylko ta linika:
    ReadFile( hCom, &RS_bufodb, 24, &RS_ile, 0);

    Może bufor odbioru (w strukturze dcb) automatycznie ma jakąś małą wartość i przy odbiorze następuje jego przepełnienie?

    Dodano po 2 [minuty]:

    Nie rozumie za bardzo działania obsługi portu RS232 wieć może to co piszę nie ma sensu.
  • REKLAMA
  • #6 7473297
    d.d
    Poziom 20  
    Posty: 386
    Pomógł: 36
    Ocena: 18
    Ja to na szybko zmontowałem tak i działa , sprawdź u siebie.
    
    #pragma hdrstop
    #include <windows.h>
    #include <stdio.h> 
    
    using namespace std;
    
       HANDLE hCom;   
       DCB dcb;       
       BOOL fSuccess;  
       BYTE RS_bufodb[25];    
       DWORD RS_ile;   
    
    int rs232otworz(void) 
    { 
       //otwarcie portu COM4 z prawami RW 
        hCom = CreateFile( TEXT("COM4"), GENERIC_READ | GENERIC_WRITE, 
            0,    // exclusive access 
            NULL, // default security attributes 
            OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 
        
        if (hCom == INVALID_HANDLE_VALUE) 
        { 
            printf("CreateFile failed with error %d.\n", GetLastError()); 
            return 1; 
        } 
           //pobranie aktualnych ustawien portu 
        fSuccess = GetCommState(hCom, &dcb); 
        if (!fSuccess) 
        { 
          printf ("GetCommState failed with error %d.\n", GetLastError()); 
          return 2; 
        } 
    
       //ustawienie naszej konfiguracji 
       dcb.BaudRate = CBR_9600;     // predkosc transmisji 
       dcb.ByteSize = 8;             // ilosc bitow danych 
       dcb.Parity = NOPARITY;        // brak bitu parzystosci 
       dcb.StopBits = ONESTOPBIT;    // dwa bity stopu 
    
       fSuccess = SetCommState(hCom, &dcb); 
       if (!fSuccess) 
       { 
          printf ("SetCommState failed with error %d.\n", GetLastError()); 
          return 3; 
       } 
       return 101; 
    }
    
    int rs232odbierz(void) 
    { 
            fSuccess = ReadFile( hCom, &RS_bufodb, 24, &RS_ile, 0); 
            if (!fSuccess) 
            { 
                printf ("ReadFile failed with error %d.\n", GetLastError()); 
                return 5; 
            } 
            return 555; 
    } 
    
    
    int main(int argc, char *argv[])
    {
        rs232otworz() ;
        
        while(1)
        {
        rs232odbierz() ;
          
          if(RS_ile>0) 
          {  
             printf("%s", RS_bufodb);   
          } 
             
         }
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    
  • #7 7473820
    ekomont
    Poziom 16  
    Posty: 121
    Pomógł: 14
    Ocena: 11
    hCommDev = CreateFile(lpFileName, GENERIC_READ |
    GENERIC_WRITE, 0, NULL,
    OPEN_EXISTING, 0, NULL);

    Tak powinna wyglądać ta funkcja w CPP...
  • #8 7474499
    dalles86
    Poziom 12  
    Posty: 37
    Pomógł: 3
    Ocena: 8
    Z tym kodem taki błąd mi wyskakuje:
    ReadFile failed with error 6
    Dziwi mnie to gdyż na 2 komputerach testuje i ma to samo na przejscówce i na wbudowanym porcie - systemy XP i WIN7.
    a Tobie to bez problemów działa??

    zmian funkcji CreateFile też nie pomogła.
  • REKLAMA
  • #9 7474697
    d.d
    Poziom 20  
    Posty: 386
    Pomógł: 36
    Ocena: 18
    Odblokuj porty programem UserPort .
  • #10 7475705
    dalles86
    Poziom 12  
    Posty: 37
    Pomógł: 3
    Ocena: 8
    d.d napisał:
    Odblokuj porty programem UserPort .

    nie pomogło

    No ale jak by był problem z dostępem do portu to chyba by się on nie otworzył, a tym bardziej nic by się nie dało z niego wysłać.
  • #11 7475935
    d.d
    Poziom 20  
    Posty: 386
    Pomógł: 36
    Ocena: 18
    dalles86 napisał:
    Z tym kodem taki błąd mi wyskakuje:
    ReadFile failed with error 6


    Właśnie sprawdziłem i błąd 6 oznacza (ERROR_INVALID_HANDLE) The handle is invalid. uchwyt jest nieważny/nieprawidłowy.

    Może ktoś inny będzie wiedział o co chodzi ja chwilowo nie mam pomysłu i czasu .
    Poszukaj w sieci innych kodów może uda ci się dojść do jest nie tak.
  • #12 7476881
    dalles86
    Poziom 12  
    Posty: 37
    Pomógł: 3
    Ocena: 8
    tak zgadza się bo przedtem mi taki błąd wyskakiwał, teraz mi porostu zwiesz program tak jak na początku

Podsumowanie tematu

LABEL_AI_GENERATED
Użytkownik napotkał problem z programem do obsługi portu RS232, który zawiesza się podczas próby odczytu z bufora, chyba że wcześniej otworzy port COM w HyperTerminal. Inni uczestnicy dyskusji sugerują, że problem może wynikać z nieprawidłowej konfiguracji portu lub zablokowanego dostępu do niego. Wskazano na możliwość, że HyperTerminal wprowadza zmiany w konfiguracji portu, które są niezbędne do prawidłowego działania programu. Użytkownik testował program na dwóch systemach operacyjnych (XP i WIN7) oraz na przejściówce USB/RS232. Pojawił się błąd 6 (ERROR_INVALID_HANDLE), co sugeruje, że uchwyt portu jest nieważny. Proponowane rozwiązania obejmują użycie programu UserPort do odblokowania portów.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA