Spritutu

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

http://www.codeguru.com/cpp/i-n/network/serialcommunications/article.php/c2483/A-communication-class-for-serial-port.htm

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 solves a bug or adds some good features. Also comment your code and don't let me solve your bugs!

Target:

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.

Usage:

In your software you only need to create an instance of the CSerialPort class and call InitPort.

// the owner (CWnd) of the port (receives message) 
BOOL CSerialPort::InitPort(CWnd* pPortOwner,  
                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 buffer.

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:

CSerialPort m_Serial;

in the code:

 m_Serial.InitPort(this);
 m_Serial.StartMonitoring();

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:

BEGIN_MESSAGE_MAP(CCommtestDlg, CDialog)
 //{{AFX_MSG_MAP(CCommtestDlg) 
ON_MESSAGE(WM_COMM_RXCHAR, OnCommunication) 
ON_MESSAGE(WM_COMM_CTS_DETECTED, OnCTSDetected)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

and they must be handled:

LONG CCommtestDlg::OnCommunication(WPARAM ch, LPARAM port)
{     // do something with the received character 
      return 0;
}

This is it for reading. Writing can be done with WriteChar or WriteToPort

 

posted on 2014-05-01 16:39  Spritutu  阅读(215)  评论(0)    收藏  举报