您现在的位置是: 软件 > 开发者网络 > 程序方舟 > 开发专栏 > Visual C++开发 > 正文
·速成电脑精英(包分配)白领高薪一族从这里开始



-Java套接字编程(下)
-MediaStudio Pro 6.5教程
-三款卸载软件最新试用
-基于Visual C++的Winsock API研究

多线程技术在VC++串口通信程序中的应用研究
2001-11-14· ·陆尔东 邓利平··yesky

上一页  1 2 3  


  4 程序关键代码的实现

  程序专门建立了一个串口通信类,下面给出关键成员函数的核心代码。

BOOL InitComm file://串口初始化,这里只给出关键步骤的代码,下同
{
 HANDLE m_hComm;
 COMMTIMEOUTS m_CommTimeouts;
 m_hComm = CreateFile("COM1", file://在这里只使用串口1
  GENERIC_READ | GENERIC_WRITE, file://打开类型为可读写
  0, file://以独占模式打开串口
  NULL, file://不设置安全属性
  OPEN_EXISTING,
  FILE_FLAG_OVERLAPPED, file://重叠I/O方式
  0);
 if (m_hComm == INVALID_HANDLE_VALUE) file://打开不成功
  {return FALSE;}
 m_CommTimeouts.ReadIntervalTimeout = 1000;
 file://进行超时设置,读者应根据自己的实际需要设置
 m_CommTimeouts.ReadTotalTimeoutMultiplier = 500;
 m_CommTimeouts.ReadTotalTimeoutConstant = 5000;
 m_CommTimeouts.WriteTotalTimeoutMultiplier = 500;
 m_CommTimeouts.WriteTotalTimeoutConstant = 5000;
 if (!SetCommTimeouts(m_hComm, &m_CommTimeouts))
  {CloseHandle(m_hComm);
   return FALSE;}
 PurgeComm(m_hComm, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT); file://清缓冲
 return TRUE;
}

以上是专门针对COM1的初始化,如果要利用同一函数对不同串口初始化,则要在初始化前先进入代码临界区,以保证在某一时刻只进行一个串口的初始化。

  在串口初始化成功后,就可以建立监控线程处理串口通信事件。下面是该线程的关键代码。

UINT CommThread(LPVOID pParam) file://用于监控串口的工作者线程
{
 BOOL bResult = FALSE;
 if (m_hComm) file://查看端口是否打开,这里m_hComm同上,作者在这里做了简化
  PurgeComm(m_hComm, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT |    PURGE_TXABORT);
  for (;;) file://只要线程运行,就处于监视端口行为的无限循环
  {
   bResult = WaitCommEvent(m_hComm, &Event, &m_ov);
   file://m_ov是OVERLAPPED类型的成员变量
   if (!bResult)
    { file://进行出错处理}
   else
   {
    Event = WaitForMultipleObjects(4, m_hEvent, FALSE, INFINITE);
    file://无限等待设定的事件发生,数组m_hEvent根据需要定义了须响应的接收,发送,关闭端口事件和OVERLAPPED类型的hEvent事件
    switch (Event)
    { file://读写事件的响应处理过程,在此略}
    }
    return 0;
 }

这样监控主程序就可以使用AfxBeginThread()函数来产生CommThread串口监控线程。如果要实现对所有端口的同时监控,可以分别对端口建立监控线程。

  5 小结

  作为一个机房监控系统的组成部分,本串口通信程序在VC++6.0下编译通过,在使用windows 98/NT的局域网里运行良好。


上一页  1 2 3  

【责任编辑:方舟】
【发表评论】【关闭窗口】
■ 相关内容
 MFC中自由使用自定义消息
 VC++对话框的任意扩展
 添加系统图象列表到列表控件
 也谈制作系统托盘程序
 用VC++制作实时教学工程
 固定无线接入启动在即
 VC编程实现IE风格的界面
 VC编程制作系统托盘程序
 Visual C++6.0开发灰度位图处理
 VC中利用ADO共同实现数据库的操作
 在VC++中获取Agent角色的动作列表
感谢 访问天极网,如果您觉得该文章涉及版权问题,请看这里!