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

近期消费了大多1上的时光在磨一个Bug,该Bug的表象如下: 

图片 1

图片 2

其一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,因此默认目前之拍卖方案中。 

相关文章