科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件RS-232-C端口实时监控软件的设计实现

RS-232-C端口实时监控软件的设计实现

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文介绍了在Microsoft Visual C++ 6.0环境下对RS-232-C串行端口进行编程,以及后台监控

作者:郎锐 来源:yesky 2007年11月16日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
(三) 侦听监视线程

  当成功的打开端口之后通过执行线程开启函数AfxBeginThread(COMReadThreadProc,NULL,THREAD_PRIORITY_NORMAL);开启了一个用于侦听端口的工作线程COMReadThreadProc。其具体处理过程
如下:

UINT COMReadThreadProc(LPVOID pParam)
{
……
file://设置读端口线程执行标志的标识
g_comthread.SetReadThreadKillFlag(FALSE);
while(1)
{
file://读取端口开启状态的标识
if(TRUE==g_comthread.GetCloseCOMFlag())
{
g_comthread.SetReadThreadKillFlag(TRUE);
return 0;//正常关闭
}
file://读端口操作
dwNeedRead=500;
file://从端口读取数据到缓存中
if(!ReadFile(g_hCom,buf,dwNeedRead,&dwActRead,NULL))
{
ClearCommError(g_hCom,&dwErrorMask,&comstat);
PurgeComm(g_hCom,PURGE_RXCLEAR);
continue;
}
file://读字符加入到全局缓冲
g_comreadbuf.Add(buf,dwActRead);
Sleep(1);
}
……
return 0;
}

  其中用到的g_comthread和g_comreadbuf分别是线程类CCOMThread和读端口类COMReadBuf的实例对象。这两个类里都用类CCriticalSection m_Lock;实现了临界区技术,用以保持线程间的同步。CCOMReadBuf类的两个函数GetOneByte(……)、Add(……)分别用于从端口读取一个字符和向缓冲区添加读取的字符。其主要实现代码如下:

BOOL CCOMReadBuf::GetOneByte(BYTE *cb)
{
m_Lock.Lock();
if(m_nHead==m_nTail)
{
m_Lock.Unlock();
return FALSE;//空
}
*cb=m_readbuf[m_nTail];
if(m_nTail < m_nBufSize-1)
m_nTail++;
else
m_nTail=0;
m_Lock.Unlock();
return TRUE;//空
}

void CCOMReadBuf::Add(BYTE buf[],int nBytes)
{
int nt,i;
m_Lock.Lock();
for(i=0;iBR> {
nt=(m_nHead-m_nTail);
if(nt<0)
nt+=m_nBufSize;
if(nt+1==m_nBufSize)
break;//缓冲区满
m_readbuf[m_nHead]=buf[i];
if(m_nHead < m_nBufSize-1)
m_nHead++;
else
m_nHead=0;
}
m_Lock.Unlock();
}
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章