串口工作在调试但不释放c ++代码块窗口

时间:2015-08-13 04:12:08

标签: c++ windows winapi serial-port

我有一个应用程序,它可以在CodeBlocks调试器下正常运行,也可以在项目的bin子目录下运行。如果将版本复制到其他任何位置,则无法识别或打开系统上的串行端口。看起来我必须遗漏一些简单的东西或者它没有链接到.lib文件。

我在程序启动时使用函数从com1到com20检查系统上的现有端口。在项目目录下,它可以连接到微控制器设备,通信工作正常。我使用此函数检查每个端口号是否存在。

//determine if a serial port does or does not exist
bool getComPortList(std::string portName)
{
    bool test;
    char* portNumber = new char[portName.length() + 1];
    for (unsigned int n = 0; n < portName.length(); n++)
    {
        portNumber[n] = portName[n];
    }
    HANDLE testSerial;
    testSerial = CreateFile(portNumber, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, NULL, NULL);
    if (testSerial == INVALID_HANDLE_VALUE)
    {
        test = false;
    }
    else
    {
        test = true;
    }
    CloseHandle(testSerial);
    delete[] portNumber;
    return test;
}

2 个答案:

答案 0 :(得分:1)

使用未终止的字符串调用

CreateFile。我建议使用portName.c_str()代替自己滚动的字符串portNumber

为什么呢?

生成portNumber的循环复制字符串中的字符,但省略了终止NULL。赔率非常好,调试模式在portNumber时礼貌地归零new,因此portNumber预先终止。发布模式将针对速度进行编译,并且不会执行未明确请求的内容,因此不会出现归零,也不会出现免费虚假。

为什么这个工作在一个文件夹中,而不是另一个文件夹可能只是愚蠢的愚蠢(不幸运,因为直接崩溃将更容易检测)或者它可能是更邪恶的东西。无论如何,未终止的字符串需要修复。

答案 1 :(得分:0)

这听起来像是一个部署问题 - 即在构建环境中运行此问题似乎没问题,但是当您将其移到“环境之外”时,它“无法独立运行”。

您可以使用免费工具,例如:dependencywalker。在您的可执行文件上运行它,它将告诉您需要与程序一起复制哪些dll /库以使其独立运行。

可能有点粗糙,但如果没有看到整个项目环境,很难说出问题所在。

在某些构建环境(如MS visual studio)中,您可以告诉它在可执行文件中包含所有依赖项(使其非常大)。

相关问题