Avatar billede jackonlinux Nybegynder
21. december 2001 - 10:25 Der er 1 kommentar og
2 løsninger

Kommunikation -med ...Haster !!

Jeg er ved at lave et lille program i MFC til at undersøge streng-værdier.

Dog har jeg ikke kunnet finde info omkring, hvor der findes en klasse, som man kan benytte seriel kommunikation. Det jeg har behov for er enten at polle eller interrupt styret at læse en værdi fra UART\'en.

Har vi en klasse der kan det ????

//Jackonlinux
Avatar billede chries Nybegynder
21. december 2001 - 10:40 #1
Du kan bruge CreateFile til at få adgang til COM porte, her er lidt upklip af kode at kigge i... håber ikke det fucker up (szPort = \"COM1\" ):

class Serial_IO : public CFrameBuffer
{
public:
    CString GetConnectionStr();
    void ClearBuffer();
    int ReadData( void *pBuffer, int nLimit );
    int SendData( const unsigned char *pBuffer, int nSize );

    void Close();
    bool Open( char szPort[], DWORD nBaud, DWORD nData, DWORD nParity, DWORD nStop );
   
    void SetHWnd( HWND hWnd );
    HWND GetWindow();

    Serial_IO( HWND hWnd, int nBufferSize = 128 );
   
    virtual ~Serial_IO();

private:
    bool m_bPortOpen;
    HWND m_hWnd;
    HANDLE m_hIDComDev;
    CString m_szConnectionStr;
};


bool Serial_IO::Open(char szPort [ ], DWORD nBaud, DWORD nData, DWORD nParity, DWORD nStop)
{
    // if  port open, close port
    m_szConnectionStr = \"Not connected\";

    if( m_bPortOpen )
    {
        Close();
    }

    DCB dcb;

    // open port
    m_hIDComDev = CreateFile( szPort, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL /*| FILE_FLAG_OVERLAPPED*/, NULL );
   
    // return false if creation failed
    if( m_hIDComDev == NULL )
    {
        return false;
    }

    // read call blocks until data, write returns after a timeout of 5 secs or when data was written to port
    COMMTIMEOUTS CommTimeOuts;
    CommTimeOuts.ReadIntervalTimeout = MAXDWORD;
    CommTimeOuts.ReadTotalTimeoutMultiplier = 0;
    CommTimeOuts.ReadTotalTimeoutConstant = 0;
    CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
    CommTimeOuts.WriteTotalTimeoutConstant = 5000;
    SetCommTimeouts( m_hIDComDev, &CommTimeOuts );

    // setup port structure
    dcb.DCBlength    = sizeof( DCB );
    GetCommState( m_hIDComDev, &dcb );
    dcb.BaudRate    = nBaud;
    dcb.ByteSize    = (unsigned char)nData;
    dcb.Parity        = (unsigned char)nParity;
    dcb.StopBits    = (unsigned char)nStop;
    dcb.ErrorChar    = (unsigned char)0xFF;

    // setup port and set recieve/send buffers to 65k each
    if( !SetCommState( m_hIDComDev, &dcb ) ||!SetupComm( m_hIDComDev, 0x8000, 0x8000 ) )
    {
        // if failed return false
        CloseHandle( m_hIDComDev );
        return false;
    }

    m_szConnectionStr = szPort;

    // port is open
    m_bPortOpen = true;

    return m_bPortOpen;
}

void Serial_IO::Close()
{
    // if port open and device valid
    if( (m_bPortOpen) && (m_hIDComDev != NULL) )
    {
        // close device
        CloseHandle( m_hIDComDev );
       
        // port closed
        m_bPortOpen = false;
        m_hIDComDev = NULL;
    }
}

int Serial_IO::SendData( const unsigned char *pBuffer, int nSize )
{
    BOOL bWriteStat;
    DWORD dwBytesWritten = 0;

    // if port open and device valid
    if( (m_bPortOpen) && (m_hIDComDev != NULL) )
    {
        // write data to port
        bWriteStat = WriteFile( m_hIDComDev, pBuffer, nSize, &dwBytesWritten, NULL );

        // if successful
        if( !bWriteStat )
        {
            // tell failure
            AfxMessageBox( \"Failed to send data to serial port\" );
            ASSERT( NULL );
        }
    }

    // return bytes written to port
    return (int)dwBytesWritten;
}

int Serial_IO::ReadData( void *pBuffer, int nLimit )
{
    BOOL bReadStatus;
    DWORD dwBytesRead = 0, dwErrorFlags;
    COMSTAT ComStat;

    // if port open and device valid
    if( (m_bPortOpen) && (m_hIDComDev != NULL) )
    {    // clear any comm errors and get bytes in IN cue
        ClearCommError( m_hIDComDev, &dwErrorFlags, &ComStat );
       
        // bytes in IN cue
        dwBytesRead = (DWORD) ComStat.cbInQue;

        // if more bytes in que than space in buffer supplied, limit reading to max buffer space
        if( nLimit < (int)dwBytesRead ) dwBytesRead = (DWORD)nLimit;

        // read into buffer
        bReadStatus = ReadFile( m_hIDComDev, pBuffer, dwBytesRead, &dwBytesRead, NULL );

        // if successful
        if( !bReadStatus )
        {
            // tell failure
            AfxMessageBox( \"Failed to read data from serial port\" );
            ASSERT( NULL );
        }
    }

    // return bytes read
    return (int)dwBytesRead;
}


Avatar billede jpk Nybegynder
21. december 2001 - 11:00 #2
Avatar billede jackonlinux Nybegynder
26. december 2001 - 02:33 #3
Kanon med CodeGuru -til at bygge videre på klassen..
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester