VC串口通信资料集 - VC串口通信技术网

CSerialPort串口类使用帮助

时间:2011-09-10 16:18来源:未知 作者:admin 点击:
------分隔线----------------------------

  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

  这个函数是用来初始化串口的,即设置串口的通信参数:需要打开的串口号、波特率、奇偶校验方式、数据位、停止位,这里还可以用来进行事件的设定。

 

  1. BOOL CSerialPort::InitPort(CWnd* pPortOwner,    // 所属窗口the owner (CWnd) of the port (receives message)  
  2.                            UINT  portnr,        // 串口号portnumber (1..4)  
  3.                            UINT  baud,          // 波特率baudrate  
  4.                            char  parity,        // 奇偶校验方式parity   
  5.                            UINT  databits,      // 数据位databits   
  6.                            UINT  stopbits,      // 停止位stopbits   
  7.                            DWORD dwCommEvents,  // EV_RXCHAR, EV_CTS etc 事件设置  
  8.                            UINT  writebuffersize)   // 设置发送缓冲区大小size to the writebuffer 
 

 

  

  如果串口初始化成功,就返回TRUE,若串口被其它设备占用、不存在或存在其它故障,就返回FALSE,编程者可以在这儿提示串口操作是否成功。

  如果在当前主窗口中调用这个函数,那么pPortOwner可用this指针表示。串口号在函数中做了限制,只能用1,2,3,和4个串口号,而事实上在编程时可能用到更多的串口号,可以通过注释掉本函数中的“assert(portnr > 0 && portnr < 5);” 语句取消对串口号的限制。

 

2、启动串口通信监测线程函数 StartMonitoring()

  串口初始化成功后,就可以调用BOOL StartMonitoring()启动串口监测线程。线程启动成功,返回TRUE。

 

  1. //  
  2. // start comm watching  
  3. //  
  4. BOOL CSerialPort::StartMonitoring()  
  5. {  
  6.     if (!(m_Thread = AfxBeginThread(CommThread, this)))  
  7.         return FALSE;  
  8.     TRACE("Thread started\n");  
  9.     return TRUE;      

 

  调用InitPort()和StartMonitoring()后,中口就被打开,各种串口状态和事件就可以被监测到。

 

3、暂停或停止监测线程函数 StopMonitoring()

  该函数暂停或停止串口监测,要注意的是,调用该函数后,串口资源仍然被占用。

 

  1. //  
  2. // Suspend the comm thread  
  3. //  
  4. BOOL CSerialPort::StopMonitoring()  
  5. {  
  6.     TRACE("Thread suspended\n");  
  7.     m_Thread->SuspendThread();   
  8.     return TRUE;      
  9. }  

 

4、关闭串口函数 ClosePort()

  该函数功能是关闭串口,释放串口资源。调用该函数后,如果要继续作用串口,还需要再调用InitPort()函数。

 

  1. void CSerialPort::ClosePort()  
  2. {  
  3.         SetEvent(m_hShutdownEvent);  

 

5、通过串口发送字符写串口函数WriteToPort()

  该函数完成串口功能,即向串口发送字符。此函数共有4种原型,使用起来就比较方便:

 

  1. void CSerialPort::WriteToPort(char* string)  
  2. void CSerialPort::WriteToPort(char* string,int n)  
  3. void CSerialPort::WriteToPort(LPCTSTR string)  
  4. void CSerialPort::WriteToPort(LPCTSTR string,int n) 

 

  以上是CSerialPort类常用的函数,熟悉它们的使用后可以仔细去看看其它函数。对于上面介绍的函数,在对串口资源的使用上要记住以下三点:

  1)打开串口调用 InitPort() 和 StartMonitoring() ;关闭串口用 StopMonitoring() 和 ClosePort() 。而且以上函数的调用顺序不能乱。

  2) 通过串口发送字符调用函数 WriteToPort() 。

  3) 接收串口收到的字符需要自己写 WM_COMM_RXCHAR 消息处理函数,需要手工添加消息映射。其它串口事件如CTS、DSR、RLSD等的处理也一样。

(责任编辑:admin)
顶一下
(11)
78.6%
踩一下
(3)
21.4%
------分隔线----------------------------
友情链接

男性增大

增大

崔情水

崔情

崔情香水女用药
友情链接 情药水肩粉苍蝇幻药
友情赞助: