Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[c++] Błąd ERROR_INVALID_FUNCTION przy wywołaniu funkcji TransmitCommChar

Ostatnio zmodyfikowano 2018-02-22 18:20
Autor Wiadomość
marecki
Temat założony przez niniejszego użytkownika
[c++] Błąd ERROR_INVALID_FUNCTION przy wywołaniu funkcji TransmitCommChar
» 2018-02-16 22:23:13
Poniżej kod
C/C++
#include <iostream>
#include <windows.h>

using namespace std;

string kodyBledowSystemu( DWORD numer_bledu );
void kontrolaSukcesu( BOOL sukcesu );

HANDLE hPort;

int main()
{
   
   
    hPort = CreateFile( "COM4", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL ); // Proba otwarcia portu,
   
    if( hPort == INVALID_HANDLE_VALUE ) // Sprawdzenie czy uzyskalismy dostep do portu,
    {
        cout << "BRAK DOSTEPU DO PORTU" << endl;
    }
    else
    {
        cout << "UZYSKANO DOSTEP DO PORTU COM" << endl;
       
        BOOL sukces = 0; // Flaga czy osiagnieto sukces operacji,
       
        COMSTAT comStat;
        DWORD Errors = 0;
       
       
        sukces = ClearCommError( hPort, & Errors, & comStat ); // Pobranie aktualnych danych na temat stanu portu COM,
        kontrolaSukcesu( sukces );
        cout << "Bufor odbiorczy: " << comStat.cbInQue << endl;
        cout << "Bufor nadawczy: " << comStat.cbOutQue << endl;
       
        sukces = ClearCommError( hPort, & Errors, & comStat ); // Pobranie aktualnych danych na temat stanu portu COM,
        kontrolaSukcesu( sukces );
        sukces = TransmitCommChar( hPort, 'r' );
        Sleep( 1 );
        kontrolaSukcesu( sukces );
        cout << "Wysyl pojedynczego znaku :" << sukces << endl;
       
        sukces = ClearCommError( hPort, & Errors, & comStat ); // Pobranie aktualnych danych na temat stanu portu COM,
        cout << "Bufor odbiorczy: " << comStat.cbInQue << endl;
        cout << "Bufor nadawczy: " << comStat.cbOutQue << endl;
       
       
        kontrolaSukcesu( sukces );
    }
    return 0;
}


// #######################################################################################################################
string kodyBledowSystemu( DWORD numer_bledu )
{
    switch( numer_bledu )
    {
    case 1:
        return "ERROR_INVALID_FUNCTION";
    }
}


// #######################################################################################################################
void kontrolaSukcesu( BOOL sukces )
{
    // Jesli poprzednia operacja nie zakonczyla sie powodzeniem to..
    if( !sukces )
    {
        DWORD numer_bledu = GetLastError();
        string nazwa_bledu = kodyBledowSystemu( numer_bledu );
       
        if( nazwa_bledu == "NOWY BLAD" )
        {
            cout << endl;
            cout << "-----------------------------------------------" << endl;
            cout << "Nowy blad o numerze:   " << numer_bledu << endl;
            cout << "Dokonaj nowego wpisu bledu do pamieci!!!" << endl;
            cout << "--------------------THE END--------------------" << endl;
            system( "pause" );
            exit( 0 );
        }
        else
        {
            cout << endl;
            cout << "-----------------------------------------------" << endl;
            cout << "NUMER BLEDU:   " << numer_bledu << endl;
            cout << "NAZWA BLEDU:   " << nazwa_bledu << endl;
            cout << "--------------------THE END--------------------" << endl;
            system( "pause" );
            exit( 0 );
        }
    }
    else
    {
        cout << "Wszystko jest ok" << endl;
    }
}

Program wywala błąd ERROR_INVALID_FUNCTION i nie mam pojęcia z jakiego powodu. Uprzedzam pytanie dlaczego nie użyję funkcji WriteFile. Używam ale chciałem sprawdzić również działanie TransmitCommChar a ona nie działa.

Nie wiem czy jest jakiś błąd w parametrach otwarcia portu COM4 albo parametrów wysyłanej ramki.

Proszę o sugestię gdzie szukać błędu.

Port pracuje jako standardowy port szeregowy przez łącze Bluetooth. Nie wiem czy to może mieć wpływ.
P-169455
DejaVu
» 2018-02-22 18:20:09
https:/​/www.experts-exchange.com​/questions/20803035​/SERIAL-PORT-WORKS-ON-WIN-NT-AND-NOT-IN-WIN2K.html

Well, there was a printer driver installed on the win2k. After removing it, the problem was solved. It seems to me that this driver holds the serial driver exclusively and causes the win2k to reject all subsequent requests, yielding this ERROR_INVALID_FUNCTION code.

Poczytałbym MSDN-a na Twoim miejscu. Przykładowe linki:
- https://msdn.microsoft.com​/en-us/library/ff802693.aspx
- https://msdn.microsoft.com​/en-us/library/windows/desktop​/aa363473(v=vs.85).aspx
- https://msdn.microsoft.com​/en-us/library/windows/desktop​/ms679360(v=vs.85).aspx
- https://msdn.microsoft.com​/en-us/library/windows/desktop​/ms679351(v=vs.85).aspx
P-169573
« 1 »
  Strona 1 z 1