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

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

作者:gz1X   来源:中国黑客联盟  日期:2007-09-11 15:22:54

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);//发送数据

}

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MFC(Microsoft Foundation Classes)是一种用于Windows操作系统的库,能够简化Windows应用程序的开发。在MFC串口通信是通过SerialPort来实现的。 SerialPort封装了与串口设备进行通信的功能,包括打开和关闭串口、发送和接收数据等操作。通过SerialPort,开发者可以方便地进行串口通信的编程。 首先,我们需要创建一个SerialPort对象,并指定要操作的串口编号或串口名称。然后,可以通过Open方法打开串口,设定波特率、数据位、停止位和校验位等串口参数。接下来,就可以使用Write方法发送数据到串口,或使用Read方法从串口接收数据。 在进行串口通信时,我们可以使用事件驱动的方式,以确保及时响应串口收发数据。SerialPort提供了异步读取数据的功能,即当串口有数据到达时会触发一个数据接收事件,我们可以在事件处理函数处理接收到的数据。 另外,为了避免界面冻结或阻塞现象,我们可以将串口通信的操作放在独立的线程执行。通过在新线程创建SerialPort对象,并在该线程监听串口事件和处理数据,可以保证串口通信的稳定性。 总而言之,MFC的SerialPort提供了方便、高效的串口通信功能,开发者可以利用该轻松地实现与串口设备的数据交互。无论是控制硬件设备、采集传感器数据还是与外部设备通信,都可以通过SerialPort来完成。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值