记一次调试串口设备Bug的涉

前不久费了大半1龙之年华以磨一个Bug,该Bug的表象如下: 

是Bug还特地新鲜,在开发电脑中任提示,在终端用户那里每次用软件的时节都报这个。仔细思忖了转以来以源码中初增长的成效,没察觉产生什么特别强烈的问题。于是,根据字面意思的掌握是“运行时误”,所以一律开始解决这个题材之思绪是将有所应用程序的运转时拷贝至应用程序目录。尝试了以后,依然报是深。分析可能跟运行时的动态链接库没有关联。于是,调整解决问题的笔触,考虑以工程中新长的代码进行分割。部分片的测试新增长的代码到底那里出题目,排查到结尾是是函数内部生了要命。异常函数的代码如下:

void CleanSerialPort()
{
    if(g_hEvent != NULL)
    {
        CloseHandle(g_hEvent);
        g_hEvent = NULL;
    }

    if(g_SerialPort.IsOpen())
    {
        COMMPROP properties;
        memset(&properties, 0, sizeof(properties));
        g_SerialPort.GetProperties();
        g_SerialPort.ClearWriteBuffer();
        g_SerialPort.ClearReadBuffer();
        g_SerialPort.Flush();
        g_SerialPort.CancelIo();
        g_SerialPort.Close();
    }
}

相同开始精心读了几乎整代码,没发现发什么异常的地方。在是时节,只能通过一点一点调节编译器来最后确定问题在那边。调试编译器的不二法门较传统,是由此MessageBox消息来实现。最终一定到g_SerialPort的Close函数。该函数的原型如下: 

void CSerialPort::Close()
{
    if(IsOpen())
    {
        CloseHandle(m_hComm);
        m_hComm = INVALID_HANDLE_VALUE;
    }
}

细心读了几方方面面,依然没察觉题目在那边。但是,又反复琢磨了一段时间之后,把这题目想掌握了。当把串口数据线拔出之后,串口设施已经在操作系统中无有,这个时候却还要去强行关闭串口设备,此时当会时有发生特别,不产生很才是休正规的情状。于是,考虑在即时同格外段代码的外界加一个try…catch…,果不其然,成功破获到充分,异常代码的值为0x05,代表的意思为ERROR_ACCESS_DENIED,表示拒绝访问。目前操作系统中已经不设有拖欠串口设备,因此驳回访问是健康的状态。最终之代码如下:   

void CleanSerialPort()
{
    try
    {
        if(g_hEvent != NULL)
        {
            CloseHandle(g_hEvent);
            g_hEvent = NULL;
        }

        if(g_SerialPort.IsOpen())
        {
            COMMPROP properties;
            memset(&properties, 0, sizeof(properties));
            g_SerialPort.GetProperties();
            g_SerialPort.ClearWriteBuffer();
            g_SerialPort.ClearReadBuffer();
            g_SerialPort.Flush();
            g_SerialPort.CancelIo();
            g_SerialPort.Close();
        }
    }
    catch(CSerialException &e)
    {
        ATLTRACE("Unexpected CSerialPort exception, Error:%u\n", e.m_dwError);
        UNREFERENCED_PARAMETER(e);
    }
}

破获到者深后,在匪关门应用程序的情下,不影响更初始化串口设备,而应用程序也非报一初步的Runtime
error,因此默认目前底处理方案中。 

相关文章