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
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;
}