CSerialPort算是最经典的一个串口类(其实也是一种以源代码方式呈现VC 串口控件)了(作者PJ Naughter),很多人都在用它,利用CSerialPort串口类可以方便地创建多线程串口通信应用程序。
CSerialPort是基于多线程的,其工作流程如下:首先设置好串口参数,再开启串口监测工作线程,串口监测工作线程监测到串口接收到的数据、流控制事件或其它串口事件后,就以消息方式通知主程序,激发消息处理函数来进行数据处理,这是对接收数据而言的;发送数据可直接向串口发送。
以下内容对CSerialPort类快速入门非常有帮助,本站《VC串口通信资料集》中有还有关于CSerialPort类的函数详细注释。
CSerialPort算是最经典的一个串口类了,很多人都在用它,利用CSerialPort串口类可以方便地创建多线程串口通信应用程序。
CSerialPort是基于多线程的,其工作流程如下:首先设置好串口参数,再开启串口监测工作线程,串口监测工作线程监测到串口接收到的数据、流控制事件或其它串口事件后,就以消息方式通知主程序,激发消息处理函数来进行数据处理,这是对接收数据而言的;发送数据可直接向串口发送。
CSerialPort类定义的消息如下表:
| CSerialPort类定义的消息 |
|
消息名称
|
消息号
|
功能说明 |
| WM_COMM_BREAK_DETECTED |
WM_USER+1 |
检测到输入中断 |
| WM_COMM_CTS_DETECTED |
WM_USER+2 |
检测到CTS(清除发送)信号状态改变 |
| WM_COMM_DSR_DETECTED |
WM_USER+3 |
检测到DSR(数据设置准备就绪)信号状态改变 |
| WM_COMM_ERR_DETECTED |
WM_USER+4 |
发生线状态错误(包括CE_FRAME,CE_OVERRUN和CE_RXPARITY) |
| WM_COMM_RING_DETECTED |
WM_USER+5 |
检测到响钤指示信号 |
| WM_COMM_RLSD_DETECTED |
WM_USER+6 |
检测到RLSD(接收线信号)状态改变 |
| WM_COMM_RXCHAR |
WM_USER+7 |
接收到一个字符并已放入接收缓冲区 |
| WM_COMM_RXFLAG_DETECTED |
WM_USER+8 |
检测到接收到字符(该字符已放入接收缓冲区)事件 |
| WM_COMM_TXEMPTY_DETECTED |
WM_USER+9 |
检测到发送缓冲区最后一个字符已经被发送 |
CSerialPort类提供的几个常用函数
1、串口初始化函数InitPort
这个函数是用来初始化串口的,即设置串口的通信参数:需要打开的串口号、波特率、奇偶校验方式、数据位、停止位,这里还可以用来进行事件的设定。
- BOOL CSerialPort::InitPort(CWnd* pPortOwner,
- UINT portnr,
- UINT baud,
- char parity,
- UINT databits,
- UINT stopbits,
- DWORD dwCommEvents,
- UINT writebuffersize)
如果串口初始化成功,就返回TRUE,若串口被其它设备占用、不存在或存在其它故障,就返回FALSE,编程者可以在这儿提示串口操作是否成功。
如果在当前主窗口中调用这个函数,那么pPortOwner可用this指针表示。串口号在函数中做了限制,只能用1,2,3,和4个串口号,而事实上在编程时可能用到更多的串口号,可以通过注释掉本函数中的“assert(portnr > 0 && portnr < 5);” 语句取消对串口号的限制。
2、启动串口通信监测线程函数 StartMonitoring()
串口初始化成功后,就可以调用BOOL StartMonitoring()启动串口监测线程。线程启动成功,返回TRUE。
-
-
-
- BOOL CSerialPort::StartMonitoring()
- {
- if (!(m_Thread = AfxBeginThread(CommThread, this)))
- return FALSE;
- TRACE("Thread started\n");
- return TRUE;
- }
调用InitPort()和StartMonitoring()后,中口就被打开,各种串口状态和事件就可以被监测到。
3、暂停或停止监测线程函数 StopMonitoring()
该函数暂停或停止串口监测,要注意的是,调用该函数后,串口资源仍然被占用。
-
-
-
- BOOL CSerialPort::StopMonitoring()
- {
- TRACE("Thread suspended\n");
- m_Thread->SuspendThread();
- return TRUE;
- }
4、关闭串口函数 ClosePort()
该函数功能是关闭串口,释放串口资源。调用该函数后,如果要继续作用串口,还需要再调用InitPort()函数。
- void CSerialPort::ClosePort()
- {
- SetEvent(m_hShutdownEvent);
- }
5、通过串口发送字符写串口函数WriteToPort()
该函数完成串口功能,即向串口发送字符。此函数共有4种原型,使用起来就比较方便:
- void CSerialPort::WriteToPort(char* string)
- void CSerialPort::WriteToPort(char* string,int n)
- void CSerialPort::WriteToPort(LPCTSTR string)
- void CSerialPort::WriteToPort(LPCTSTR string,int n)
以上是CSerialPort类常用的函数,熟悉它们的使用后可以仔细去看看其它函数。对于上面介绍的函数,在对串口资源的使用上要记住以下三点:
1)打开串口调用 InitPort() 和 StartMonitoring() ;关闭串口用 StopMonitoring() 和 ClosePort() 。而且以上函数的调用顺序不能乱。
2) 通过串口发送字符调用函数 WriteToPort() 。
3) 接收串口收到的字符需要自己写 WM_COMM_RXCHAR 消息处理函数,需要手工添加消息映射。其它串口事件如CTS、DSR、RLSD等的处理也一样。 (责任编辑:admin) |