Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 17
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    1,683

    c/c++ connessione seriale

    ciao a tutti!! sto provando a creare un programmino per connettersi ad una seriale per poi leggere i dati che manda
    ho seguito questo articolo: http://www.docenti.org/td/materiali/seriale_win32_2.htm
    mi da errore sulla riga: #include "stdafx.h"
    e dice: [C++ Error] Unit1.cpp(1): E2209 Unable to open include file 'stdafx.h'

    io come compilatore ho borland, ma se sapete farlo con altri compilatori, che magari hanno opzioni per creare parti di codice per me va bene lo stesso...

    io queste cose non le ho mai fatte, non so se magari non includo qualcosa o devo creare degli altri file, bo.. aiutatemi!! grazie

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Elimina quella riga ... non serve con il borland ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    1,683
    è vero!! infatti funziona!!
    mi son riuscito a connettere, ora continuo a leggere come fare per leggere un dato, se ho problemi chiedo qua
    grazie mille

  4. #4
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    1,683
    allora.. da quel che ho capito, quel che mi interessa a me per leggere da seriale son sostanzialmente due le cose nuove..
    il createfile, che ha funzionato e il readfile...
    io subito dopo l'apertura della porta ho messo
    codice:
    for(;; )
           {
                    char c;
                    DWORD NumberOfBytesRead;
                    Ok = ReadFile(myPortH,
                            &c,
                            1,
                            &NumberOfBytesRead,
                            NULL
                            );
    
                    if (NumberOfBytesRead > 0)
                            printf("%c", c);
    
                    int keydown = _kbhit();
                    if (keydown)
                            break;
            }
    mi da due errori:
    Undefined simbol Ok, che credo sia dovuta al fatto che non l'ho dichiarata.. però non so bene come, perchè nella documentazione ho capito che parametri bisogna inserire ma non che tipo di ritorno ha..

    e poi dice:
    call to undefined function _kbhit...

    in relatà le ultime 3 righe non le ho capite ma le ho messe per attenermi all'articolo
    anche perchè la funzione _kbhit non la conosco, io sapevo della funzione kbhit.. senza trattino davanti..
    ma nemmeno if (keydown).. non capisco che condizione sia.. cosa vuol dire che se keydown non è falso entra??

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    1,683
    ho letto un pò in giro.. la funzione _kbhit esiste ma non vedo che differenze ha con la kbhit, quindi ho tolto il trattino e infatti non da errore, ma per l'altro problema non capisco come fare.

  6. #6
    "Ok" basta che la definisci come BOOL.

    Prima di verificare se è stato letto un carattere, controlla che "Ok" sia TRUE altrimenti la ReadFile è fallita.

    Le ultime righe servono solo per verificare se è stato premuto un tasto ed uscire dal loop in caso affermativo, altrimenti non uscirebbe mai...

    HTH,

  7. #7
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    1,683
    ok, ora parte.. però non legge la seriale lo stesso..
    riporto il codice interamente così vi è più facile vedere l'errore:
    codice:
    #include "windows.h"
    #include "conio.h"
    #include "stdio.h"
    
    int main(int argc, char* argv[])
    {
           bool Ok;
           HANDLE myPortH= CreateFile(
                  "COM3",
                   GENERIC_READ | GENERIC_WRITE,
                   0,
                   0,
                   OPEN_EXISTING,
                   0,
                   0);
    
           if (myPortH == INVALID_HANDLE_VALUE)
           {
                 printf("error opening\n");
                 // error opening port; abort
                 getch();
                 return -1;
           }
           printf("COMM Open\n\n");
    
           for(;; )
           {
                    char c;
                    DWORD NumberOfBytesRead;
                    Ok = ReadFile(myPortH,
                            &c, // pointer to buffer that receives data
                            1, // number of bytes to read
                            &NumberOfBytesRead, // ptr. to n. of bytes read
                            NULL
                            );
    
                    if(Ok==FALSE){printf("error");}
    
                    if (NumberOfBytesRead > 0)
                            printf("%c", c);
    
                    int keydown = kbhit();
                    if (keydown)
                            break;
            }
    
           getch();
           CloseHandle(myPortH);
           return 0;
    }
    ho fatto il debug e il for non lo esegue infinite volte, gia alla prima volta arriva sulla riga del readfile e si ferma..

    poi subito sotto ho messo che se Ok è falsa stampa errore.. ho scritto bene??

    il problema ora è che se schiaccio i pulsanti della seriale dovrebbe stampare a video delle lettere, ma non lo fa, anche se la connessione è stata stabilita

  8. #8
    bool Ok;
    Meglio BOOL.


    il problema ora è che se schiaccio i pulsanti della seriale dovrebbe stampare a video delle lettere, ma non lo fa, anche se la connessione è stata stabilita
    A parte che non è chiaro cosa intendi con "i pulsanti della seriale", comunque, tutti gli altri parametri (tipo il baudrate) quando li imposti?

  9. #9
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    1,683
    giusto... mancan tutte quelle cose li... è che lo sto facendo pezzetto per volta, perchè questo programma è gia troppo alto rispetto alle mie conoscenze... leggo un pò, provo, e se non riesco chiedo qua..

    comunque i tasti della seriale intendo che questa mia seriale ha dei tasti/pulsanti che se premuti inviano delle lettere

  10. #10
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    1,683
    ecco!! ora che ho impostato tutto va un pelo meglio
    nel senso che, se eseguo il programma e premo i tasti della seriale vedo che sul programma stampa degli spazi... in realtà dovrebbe stampare delle lettere.. e poi non tutti i tasti vanno...
    che cosa può essere???
    metto il codice. anche se sta diventando un pò lungo..
    codice:
    #include "windows.h"
    #include "conio.h"
    #include "stdio.h"
    BOOL setComm(HANDLE hComm)
    {
        DCB dcb;
        BOOL res;
    
        FillMemory(&dcb, sizeof(dcb), 0);
        res = GetCommState(hComm, &dcb); // get current DCB
        if (!res)
            // Error in GetCommState
            return FALSE;
        printf("\nBaudRate %d ByteSize %d StopBits %d\n", dcb.BaudRate, dcb.ByteSize, dcb.StopBits);
        // Update DCB rate.
        dcb.ByteSize = 8;
        dcb.StopBits = ONESTOPBIT;
        dcb.BaudRate = CBR_9600;
        dcb.Parity =NOPARITY;// none
        dcb.fAbortOnError = 0; // no abort
    
        // Set new state.
        res = SetCommState(hComm, &dcb);
    
        // Error in SetCommState. Possibly a problem with the communications
        // port handle or a problem with the DCB structure itself.
        if (!res)
            return FALSE;
    
        DWORD err = GetLastError();
        if ( err)
             printf("\n ERROR % d\n", err);
    
        return TRUE;
    }
    int main(int argc, char* argv[])
    {
           bool Ok;
           HANDLE myPortH= CreateFile(
                  "COM3",
                   GENERIC_READ | GENERIC_WRITE,
                   0,
                   0,
                   OPEN_EXISTING,
                   0,
                   0);
    
           if (myPortH == INVALID_HANDLE_VALUE)
           {
                 printf("error opening\n");
                 // error opening port; abort
                 getch();
                 return -1;
           }
           else
           {
                    printf("COMM Open\n\n");
                    BOOL bResult;
                    bResult = setComm(myPortH);
                    for(;; )
                    {
                            char c;
                            DWORD NumberOfBytesRead;
                            Ok = ReadFile(myPortH,
                                    &c, // pointer to buffer that receives data
                                    1, // number of bytes to read
                                    &NumberOfBytesRead, // ptr. to n. of bytes read
                                    NULL
                                    );
    
                            if(Ok==FALSE){printf("error");}
    
                            if (NumberOfBytesRead > 0)
                            printf("%c", c);
    
                            int keydown = kbhit();
                            if (keydown)
                                    break;
                    }
    
                    getch();
                    CloseHandle(myPortH);
                    return 0;
           }
    }

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.