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

Jak poprawić odczyt danych z portu COM w C++? Użycie funkcji ReadFile

statsms 13 Kwi 2005 18:29 2172 7
REKLAMA
  • #1 1402372
    statsms
    Poziom 11  
    Posty: 58
    Witam.
    Mam problem z odczytem danych z portu com.
    Uzywam takich funkcji:

    static BOOL ReadData(HANDLE port,LPBYTE buffer,DWORD size,BOOL blocking);

    static BOOL ReadData(HANDLE port,LPBYTE buffer,DWORD size,BOOL blocking)
    {
    DWORD read = 0;
    int x;

    if (ReadFile(port,buffer,size,&read,NULL))
    {
    if (read!=size)
    {
    char xx[100];
    wsprintf(xx,"Size mismatch %d %d",buffer[0],buffer[1]);
    MessageBox(NULL,xx,"Error",MB_ICONEXCLAMATION|MB_OK);
    }
    return (read == size);
    }
    else
    {
    switch (x=GetLastError())
    {
    case ERROR_IO_PENDING:
    if (blocking)
    {
    while (!GetOverlappedResult(port,&Rov,&read,TRUE)) // wait until read completes!
    {
    if(GetLastError() != ERROR_IO_INCOMPLETE) // "incomplete" is normal result if not finished
    {
    MessageBox(NULL,"Something went wrong when calling Windows to read from comport.","Message",MB_ICONEXCLAMATION|MB_OK);
    break; // an error occurred, try to recover
    }
    }
    return (read == size);
    }
    else
    {
    // CancelIo(comPort);
    return FALSE;
    }

    default:
    // CancelIo(comPort);
    return FALSE;
    }
    }
    }

    Jak teraz ustawic zmienne do ReadData(), jakie typy itd.

    DARO
    admin(_at_)statsms.net
  • REKLAMA
  • #2 1407722
    statsms
    Poziom 11  
    Posty: 58
    Strasznie mi na tym zalezy, a na pewno wprawny programista nie bedzie mial z tym wiekszych problemow.

    DARO
    admin(_at_)statsms.net
  • REKLAMA
  • #3 1409003
    elektryk
    Poziom 42  
    Posty: 11029
    Pomógł: 439
    Ocena: 241
    Sory, ale nie rozumiem problemu, załączyłeś kod źródłowy i nie wiadomo o co chodzi.
  • REKLAMA
  • #4 1413839
    statsms
    Poziom 11  
    Posty: 58
    Witam.
    Chce wywolac funkcje ReadData(), ale nie wiem jakie typy zmiennych ustawic do niej.

    LPBYTE buffer;
    ReadData(comPort, &bufor, "128", TRUE)
    wywala bledy

    DARO
    admin(_at_)statsms.net
  • #5 1433131
    statsms
    Poziom 11  
    Posty: 58
    Czy to jest az tak trudne do zrobienia?

    DARO
  • REKLAMA
  • #6 1435227
    _myszon
    Poziom 15  
    Posty: 119
    Pomógł: 13
    Ocena: 18
    jak dla mnie to sama funkcja readFile odczytuje ci zawartość portu COM. Musisz jedynie poprzedzic ja wywolaniem funkcji CreateFile. Jesli chodzi o dokladne parametry wywolan tych funkcji to odsylam do WIN32 SDK Reference Help.
  • #7 1436268
    statsms
    Poziom 11  
    Posty: 58
    Witam.
    Oczywiscie, nie o takie rzeczy mi chodzi, a widze, ze niektorym zalezy na nabijanie pkt za niepotrzebne posty.
    Interesuje mnie dokladne typy parametrow dla funkcji ReadData() ktora wykorzystuje funkcje ReadFile(). Jej struktura jest przedstawiona w pierwszym poscie.

    DARO
  • #8 1437271
    _myszon
    Poziom 15  
    Posty: 119
    Pomógł: 13
    Ocena: 18
    statsms napisał:

    LPBYTE buffer;
    ReadData(comPort, &bufor, "128", TRUE)
    wywala bledy


    Rozumiem ze zamiast &bufor miało być buffer. A poza tym to 128 zapodaj bez znaków " ".
    Może dlatego wywala ci że jest niezgodność typów danych w wywołaniu z typami podanymi w deklaracji.

    A tak poza tym to pragnę zauważyć iż na forum jestem od mniej niż 7 dni wiec punkty i tak nie są mi naliczane więc nie zależało mi przy odpowiadaniu na tym aby sobie statystyki polepszyc. Ale z takim podejściem to za dużo na forum pomocy nie uzyskasz.

Podsumowanie tematu

✨ Dyskusja dotyczy problemów z odczytem danych z portu COM w języku C++ przy użyciu funkcji ReadFile oraz własnej funkcji ReadData. Autor pyta o poprawne typy parametrów dla funkcji ReadData, która przyjmuje uchwyt portu, wskaźnik do bufora, rozmiar danych do odczytu oraz flagę blokowania. Wskazuje na błędy kompilacji przy nieprawidłowym przekazywaniu argumentów, np. użyciu łańcucha znaków zamiast liczby całkowitej dla rozmiaru bufora. W odpowiedziach podkreślono konieczność wcześniejszego otwarcia portu COM funkcją CreateFile oraz poprawne dopasowanie typów argumentów, np. LPBYTE dla bufora i DWORD dla rozmiaru. Zwrócono uwagę, że rozmiar powinien być przekazywany jako liczba całkowita bez cudzysłowów. Dyskusja nie zawiera gotowego kodu rozwiązującego problem, ale wskazuje na podstawowe błędy typów i konieczność stosowania dokumentacji Win32 SDK dla funkcji systemowych.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA