使用串行端口线程进行 CPU 支持

CPU comsuption with Serial Port Thread

本文关键字:CPU 支持 线程 串行端口      更新时间:2023-10-16

我写了我的专业应用程序,我的串口线程有一个问题。我有 CPU 消耗。当我在我的项目中添加 SerialCtrl.h(来自项目 SerialCtrl http://www.codeproject.com/Articles/99375/CSerialIO-A-Useful-and-Simple-Serial-Communication(时,我的 CPU % 变得更加 100%,所以没有接近 40%。

我在ANSI 32位MFC MT中使用VS C++ 2012 Professional

串行控制.cpp

const unsigned short MAX_MESSAGE = 300;
IMPLEMENT_DYNCREATE(SerialThread,CWinThread)
    SerialThread::SerialThread() :m_serialIO(NULL)
{
}
SerialThread::~SerialThread()
{
    m_serialIO = NULL;
}

BOOL SerialThread::InitInstance()
{
    return TRUE;
}
int SerialThread::Run()
{
    // Check signal controlling and status to open serial communication.
    while(1)
    {
        while(m_serialIO->GetProcessActivateValue()==TRUE)
        {
            if ((serialCtrl().GetPortStatus()==FALSE)&&m_serialIO->GetPortActivateValue()==TRUE)
            {
                if(serialCtrl().OpenPort(m_serialIO->m_DCB,m_serialIO->m_strPortName)==TRUE)
                {
                    m_serialIO->OnEventOpen(TRUE);
                }
                else
                {
                    m_serialIO->OnEventOpen(FALSE);
                    m_serialIO->SetPortActivate(FALSE);
                }
            }
            else if (m_serialIO->GetPortActivateValue()==TRUE)
            {
                char message[MAX_MESSAGE]={0};
                unsigned int lenBuff = MAX_MESSAGE;
                unsigned long lenMessage;
                if(serialCtrl().Read(message,lenBuff,lenMessage)==TRUE)
                {
                    if(lenMessage>0)
                        m_serialIO->OnEventRead(message,lenMessage);
                }
                else
                {
                    m_serialIO->SetProcessActivate(FALSE);
                }
            }
            if (m_serialIO->GetSendActivateValue()==TRUE)
            {
                unsigned long nWritten;
                if(serialCtrl().Write(m_serialIO->m_sendBuffer,m_serialIO->m_sendSize,nWritten)==TRUE)
                {
                    m_serialIO->OnEventWrite(nWritten);
                }
                else
                {
                    m_serialIO->OnEventWrite(-1);
                }
                m_serialIO->SetSendActivate(FALSE);
            }
            if (m_serialIO->m_bClosePort==TRUE)
            {
                if (serialCtrl().ClosePort()==TRUE)
                {
                    m_serialIO->OnEventClose(TRUE);
                }
                else
                {
                    m_serialIO->OnEventClose(FALSE);
                }
                m_serialIO->m_bClosePort=FALSE;
            }
        }
        break;
    }
    return 0;
}
void SerialThread::ClosePort()
{
    serialCtrl().ClosePort();
}

我想这是串行线程运行的问题,但我没有找到如何解决它。(在性能和其他工具之后(你有什么想法吗?

谢谢

我看了一下你的代码,不幸的是问题来自你正在使用的库/项目。基本上,多合一线程只是循环,从不等待任何地方,这会导致 100% 的 CPU 消耗。

你能做什么 :

  • run() 方法的内部while循环末尾添加一个Sleep(1-10)。这种方法是最糟糕的,它只是修补了潜在的问题。
  • 使用另一个设计更好的库。
  • 制作适合您使用的自己的库。

一些建议制作自己的串行 com 包装器:

您需要了解的有关Windows上串行端口的所有信息都在这里:串行通信。

IO 线程应始终在某个位置等待。它可以在阻塞 IO 调用(如 ReadFile() (上,也可以在 Windows 可等待对象上。

如果可以,请使用重叠 IO,即使不使用异步调用也是如此。它将支持同时读取和写入,并使读取和写入可取消(干净(。

您只需要一个单独的线程即可读取。如果你想要一个完全异步的库,可以选择通过消息队列写入另一个。