串口编程中SerialPort类介绍以及应用

SerialPort类的源代码已经放在下面,SerialPort类是由Remon Spekreijse提供的免费串口类。

CSerialPort支持线连接的串口编程,而且是基于多线程的,工作流程:

 

1.设置串口参数。

函数原型:

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 to the writebuffer

2.串口监测线程。

BOOL CSerialPort::StartMonitoring()                 

BOOL CSerialPort::RestartMonitoring()

BOOL CSerialPort::StopMonitoring()

void CSerialPort::WriteChar(CSerialPort* port)

void CSerialPort::ReceiveChar(CSerialPort* port, COMSTAT comstat)

void CSerialPort::WriteToPort(char* string)


3.监测线程接收事件信息,再进行消息处理即可。

SerialPort类的应用

基于对话框的串口程序开发:

1.将SerialPort类添加进工程;

2.进行消息的映射;

(注意:在SerialPort类的头文件中的:

#define WM_COMM_RXCHAR WM_USER+7

需要手动进行映射)

在工程的主对话框头文件中,格式如下:

afx_msg LONG OnComm(WPARAM ch,LPARAM port);

在工程的主对话框的CPP文件中,格式如下:

BEGIN_MESSAGE_MAP(CMy20040889SerialPortTestDlg, CDialog)

//{{AFX_MSG_MAP(CMy20040889SerialPortTestDlg)

ON_MESSAGE(WM_COMM_RXCHAR,OnComm)

...

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

然后在CPP中添加消息处理函数,本例中为OnComm。

例如:

LONG CTestDlg::OnComm(WPARAM ch, LPARAM port)

{

m_strEditReceiveMsg += ch;

UpdateData(FALSE);

return 0;

}

//m_strEditReceiveMsg 为EDIT控件(接收框)的变量。

//下面的m_strEditSendMsg同样处理。

3.实现串口的初始化,打开/关闭串口按钮的响应函数,最后是发送信息按钮的函数实现。

void CTestDlg::OnButtonOpen()

{

int nPort=m_ctrlComboComPort.GetCurSel()+1;

if(m_SerialPort.InitPort(this, nPort, 9600,'N',8,1,EV_RXFLAG | EV_RXCHAR,512))

{

m_SerialPort.StartMonitoring();

m_bSerialPortOpened=TRUE;

}

else

{

AfxMessageBox("没有发现此串口或被占用");

m_bSerialPortOpened=FALSE;

}

GetDlgItem(IDC_BUTTON_OPEN)->EnableWindow(!m_bSerialPortOpened);

GetDlgItem(IDC_BUTTON_CLOSE)->EnableWindow(m_bSerialPortOpened);

}

void CTestDlg::OnButtonClose()

{

m_SerialPort.ClosePort();

m_bSerialPortOpened=FALSE;

GetDlgItem(IDC_BUTTON_OPEN)->EnableWindow(!m_bSerialPortOpened);

GetDlgItem(IDC_BUTTON_CLOSE)->EnableWindow(m_bSerialPortOpened);

}

void CTestDlg::OnButtonSend()

{

if(!m_bSerialPortOpened) return; UpdateData(TRUE); //读入编辑框中的数据

m_SerialPort.WriteToPort((LPCTSTR)m_strEditSendMsg);//发送数据

}




 

 


 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值