| | |
Need to know how to configure serial communication to update baudrate, databits, etc
Please support our C++ advertiser: Intel Parallel Studio Home
Thread Solved |
•
•
Join Date: Aug 2009
Posts: 10
Reputation:
Solved Threads: 0
Need to know how to configure serial communication to update baudrate, databits, etc
0
#1 Aug 25th, 2009
Hi, i am using visual studio 2008, C++ MFC to do my program. I am doing serial communication. I have a GUI C++ program. At the beginning, i will ask user to choose the com port then connect it. After that, i will need to let the user change the baudrate, databit, parity, stopbit and flowcontrol, then update the serial configuration. I would like to know how can i edit my serial.cpp, serial .h and main gui file in order to change the setting. Sorry that i've posted so many thread about this serial communication. I am new to C++ and need to rush a program out. This is only the first part. I still need to do a scipt for my program. The scipt will be like hyper terminal. Need to figure that out too. Hope that all of you can help me. Thanks alot alot alot.
Serial.cpp
-------------
Serial.cpp
-------------
C++ Syntax (Toggle Plain Text)
// Serial.cpp: implementation of the CSerial class. // ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "Serial.h" CSerial::CSerial() { memset(&m_OverlappedRead, 0, sizeof(OVERLAPPED)); memset(&m_OverlappedWrite, 0, sizeof(OVERLAPPED)); m_hIDComDev = NULL; m_bOpened = FALSE; } CSerial::~CSerial() { Close(); } BOOL CSerial::Open(int nPort, int nBaud) { if(m_bOpened) return TRUE; char szPort[15]; char szComParams[50]; DCB dcb; wsprintf((LPTSTR)szPort, (LPTSTR)L"COM%d", nPort ); m_hIDComDev = CreateFile((LPWSTR)szPort, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL ); if(m_hIDComDev == INVALID_HANDLE_VALUE) return FALSE; memset(&m_OverlappedRead, 0, sizeof(OVERLAPPED)); memset(&m_OverlappedWrite, 0, sizeof(OVERLAPPED)); dcb.DCBlength = sizeof(DCB); GetCommState(m_hIDComDev, &dcb); if(GetCommState(m_hIDComDev, &dcb)) { dcb.BaudRate = nBaud; dcb.ByteSize = 8; dcb.Parity = NOPARITY; dcb.StopBits = ONESTOPBIT; dcb.fBinary = TRUE; dcb.fParity = TRUE; } else return FALSE; COMMTIMEOUTS CommTimeOuts; CommTimeOuts.ReadIntervalTimeout = MAXDWORD; CommTimeOuts.ReadTotalTimeoutMultiplier = 0; CommTimeOuts.ReadTotalTimeoutConstant = 0; CommTimeOuts.WriteTotalTimeoutMultiplier = 0; CommTimeOuts.WriteTotalTimeoutConstant = 5000; SetCommTimeouts( m_hIDComDev, &CommTimeOuts ); wsprintf((LPWSTR)szComParams, (LPWSTR)"COM%d:%d,8,None,1,Hardware", nPort, nBaud ); m_OverlappedRead.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL ); m_OverlappedWrite.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL ); //dcb.DCBlength = sizeof(DCB); /*GetCommState(m_hIDComDev, &dcb); dcb.BaudRate = nBaud; dcb.ByteSize = 8; unsigned char ucSet; ucSet = (unsigned char) ((FC_RTSCTS & FC_DTRDSR) != 0); ucSet = (unsigned char) ((FC_RTSCTS & FC_RTSCTS) != 0); ucSet = (unsigned char) ((FC_RTSCTS & FC_XONXOFF) != 0);*/ /*if (!BuildCommDCB((LPCTSTR)"9600,n,8,1", &dcb)) return FALSE; else return TRUE;*/ if(!SetCommState(m_hIDComDev, &dcb) || !SetupComm(m_hIDComDev, 10000, 10000) || m_OverlappedRead.hEvent == NULL || m_OverlappedWrite.hEvent == NULL) { DWORD dwError = GetLastError(); if(m_OverlappedRead.hEvent != NULL) CloseHandle(m_OverlappedRead.hEvent); if(m_OverlappedWrite.hEvent != NULL) CloseHandle(m_OverlappedWrite.hEvent); CloseHandle(m_hIDComDev); return FALSE; } m_bOpened = TRUE; return(m_bOpened); } BOOL CSerial::Close( void ) { if( !m_bOpened || m_hIDComDev == NULL ) return( TRUE ); if( m_OverlappedRead.hEvent != NULL ) CloseHandle( m_OverlappedRead.hEvent ); if( m_OverlappedWrite.hEvent != NULL ) CloseHandle( m_OverlappedWrite.hEvent ); CloseHandle( m_hIDComDev ); m_bOpened = FALSE; m_hIDComDev = NULL; return( TRUE ); } BOOL CSerial::WriteCommByte( unsigned char ucByte ) { BOOL bWriteStat; DWORD dwBytesWritten; bWriteStat = WriteFile( m_hIDComDev, (LPSTR) &ucByte, 1, &dwBytesWritten, &m_OverlappedWrite ); if( !bWriteStat && ( GetLastError() == ERROR_IO_PENDING ) ){ if( WaitForSingleObject( m_OverlappedWrite.hEvent, 1000 ) ) dwBytesWritten = 0; else{ GetOverlappedResult( m_hIDComDev, &m_OverlappedWrite, &dwBytesWritten, FALSE ); m_OverlappedWrite.Offset += dwBytesWritten; } } return( TRUE ); } int CSerial::SendData( const char *buffer, int size ) { if( !m_bOpened || m_hIDComDev == NULL ) return( 0 ); DWORD dwBytesWritten = 0; int i; for( i=0; i<size; i++ ){ WriteCommByte( buffer[i] ); dwBytesWritten++; } return( (int) dwBytesWritten ); } int CSerial::ReadDataWaiting( void ) { if( !m_bOpened || m_hIDComDev == NULL ) return( 0 ); DWORD dwErrorFlags; COMSTAT ComStat; ClearCommError( m_hIDComDev, &dwErrorFlags, &ComStat ); return( (int) ComStat.cbInQue ); } int CSerial::ReadData( void *buffer, int limit ) { if( !m_bOpened || m_hIDComDev == NULL ) return( 0 ); BOOL bReadStatus; DWORD dwBytesRead, dwErrorFlags; COMSTAT ComStat; ClearCommError( m_hIDComDev, &dwErrorFlags, &ComStat ); if( !ComStat.cbInQue ) return( 0 ); dwBytesRead = (DWORD) ComStat.cbInQue; if( limit < (int) dwBytesRead ) dwBytesRead = (DWORD) limit; bReadStatus = ReadFile( m_hIDComDev, buffer, dwBytesRead, &dwBytesRead, &m_OverlappedRead ); if( !bReadStatus ){ if( GetLastError() == ERROR_IO_PENDING ){ WaitForSingleObject( m_OverlappedRead.hEvent, 2000 ); return( (int) dwBytesRead ); } return( 0 ); } return( (int) dwBytesRead ); } Serial.h ------------- // Serial.h: interface for the CSerial class. // ////////////////////////////////////////////////////////////////////// #ifndef __SERIAL_H__ #define __SERIAL_H__ #define FC_DTRDSR 0x01 #define FC_RTSCTS 0x02 #define FC_XONXOFF 0x04 #define ASCII_BEL 0x07 #define ASCII_BS 0x08 #define ASCII_LF 0x0A #define ASCII_CR 0x0D #define ASCII_XON 0x11 #define ASCII_XOFF 0x13 class CSerial { public: CSerial(); ~CSerial(); BOOL Open(int nPort = 1, int nBaud = 9600); BOOL Close(void); int ReadData(void *, int ); int SendData(const char *, int ); int ReadDataWaiting( void ); BOOL IsOpened( void ){ return( m_bOpened ); } protected: BOOL WriteCommByte( unsigned char ); HANDLE m_hIDComDev; OVERLAPPED m_OverlappedRead, m_OverlappedWrite; BOOL m_bOpened; }; #endif
Last edited by John A; Aug 26th, 2009 at 12:38 am. Reason: added code tags
![]() |
Similar Threads
- Help for serial communication code (C++)
- serial communication RS 232 (C)
- Serial communication using DEV CPP IDE 4.9.9.2 (C)
- Serial Communication in .net (VB.NET)
- WIN32 serial communication 'C' code (C)
- Linker Error (C++)
- Serial communication (Visual Basic 4 / 5 / 6)
- Problem in developing an Serial Communication Interface (Visual Basic 4 / 5 / 6)
Other Threads in the C++ Forum
- Previous Thread: Help for serial communication code
- Next Thread: C++ String Split
| Thread Tools | Search this Thread |
add api array arrays beginner binary bitmap c++ c/c++ calculator char class classes code compile compiler console conversion count data delete desktop directshow dll download dynamic encryption error file forms fstream function functions game getline google graph gui homeworkhelper iamthwee ifstream input int integer java lib library linkedlist linker linux loop looping loops map math matrix memory microsoft multidimensional newbie news node number output parameter pointer problem program programming project proxy python random read recursion recursive return string strings struct studio template templates test text text-file tree unix url variable vector video visual visualstudio win32 windows winsock word wordfrequency wxwidgets





