I've searched for a good communication class for a while and could not find one.
That's when I decided to write my own and it should be one that's easy to use.
In the newgroups there are many questions about serial communication so I thought:
make it public! It's freeware. The only thing I expect from users is that they drop me a mail.
All modifications on this class are free, but please let me know if it solvers a bug
or adds some good features. Also comment your code and don't let me solve your bugs!
The class is not intended to use as a baseclass for modemcommunication but
more for driving hardware or reading hardware via the serial port.
From the classes included there is only one class important: CSerialPort.
The other classes are only there to illustrate the use of this class.
In your software you only need to create an instance of the CSerialPort class
and call InitPort.
BOOL CSerialPort::InitPort(CWnd* pPortOwner, // the owner (CWnd) of the port (receives message)
UINT portnr, // portnumber (1..4)
UINT baud, // baudrate
char parity, // parity
UINT databits, // databits
UINT stopbits, // stopbits
DWORD dwCommEvents, // EV_RXCHAR, EV_CTS etc
UINT writebuffersize) // size of the writebuffer
The dwCommEvents flag can be used for communication with the owner of this class.
The flags can be one of the following (or combined with |):
WM_COMM_BREAK_DETECTED A break was detected on input.
WM_COMM_CTS_DETECTED The CTS (clear-to-send) signal changed state.
WM_COMM_DSR_DETECTED The DSR (data-set-ready) signal changed state.
WM_COMM_ERR_DETECTED A line-status error occurred. Line-status errors are CE_FRAME, CE_OVERRUN, and CE_RXPARITY.
WM_COMM_RING_DETECTED A ring indicator was detected.
WM_COMM_RLSD_DETECTED The RLSD (receive-line-signal-detect) signal changed state.
WM_COMM_RXCHAR A character was received and placed in the input buffer.
WM_COMM_RXFLAG_DETECTED The event character was received and placed in the input
Accept the first parameter all parameters are optional. The standard values are:
portnr = 1
baud = 19200
parity = 'N'
databits = 8,
stopsbits = 1,
dwCommEvents = EV_RXCHAR | EV_CTS,
nBufferSize = 512);
So the follwing code is enough to make communication possible:
in the header of the owner:
in the code:
Then the tread that watches the port is started and all events on the port are send to
the owner. The receive a character the owner needs a messageentry in the messagemap:
and they must be handled:
LONG CCommtestDlg::OnCommunication(WPARAM ch, LPARAM port)
// do something with the received character
This is it for reading. Writing can be done with WriteChar or WriteToPort
[color="red"]DO I HAVE TO KILL ALL THREAD IN THE PARENT DIALOG BEFORE I START A THREAD TO MONITOR THE COMPORTS IN THE CHILD DIALOG ??
CAddItemDlg::CAddItemDlg(CWnd* pParent /*=NULL*/)
: CDialog(CAddItemDlg::IDD, pParent)
void CAddItemDlg::DoDataExchange(CDataExchange* pDX)
ON_MESSAGE(WM_COMM_RXCHAR, AddItemOnCommunication) //handler
// init the ports
if (m_Ports.InitPort(this, 1, 9600, 'N',8,1,EV_RXCHAR,512))
m_Ports.StartMonitoring(); //Start monitoring the comports, sameway i did in main class, but i stop it before i call this dialog
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
//CAddItemDlg message handlers
//event if BarCode scans, but the function never reacts or it reacts only once when the monitoring in the main dialog is never called.
LONG CAddItemDlg::AddItemOnCommunication(WPARAM ch, LPARAM port)
if (ch == 13)
(m_strReceived[port-1]).Empty(); //clear string
// if (exist==true) //show message box if articel is not found in database
// MessageBox("Verkaufsartikel schon in Datenbank.", "ALREADY EXISTS",MB_ICONWARNING | MB_OK);
if (!((ch == 13)||(ch == 10))) //keep m_strReceived clean from junk sign 10
m_strReceived[port-1] += (char)ch;