串行端口在调试中工作但不发布 c++ 代码块 windows

serial port works in debug but not release c++ code blocks windows

我有一个应用程序可以在 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;
}

这听起来像是一个部署问题 - 即 运行在构建环境中使用它似乎没问题,但是当你将它移动到 "outside" 环境时它不起作用 "stand-alone" .

您可以使用以下免费工具:dependencywalker。 运行 这在您的可执行文件上,它会告诉您 dlls/libraries 您需要与程序一起复制什么才能使其 运行 独立。

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

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

CreateFile 使用未终止的字符串调用。我建议使用 portName.c_str() 而不是 roll-your-own 字符串 portNumber.

为什么?

循环生成 portNumber 复制字符串中的字符,但省略终止 NULL。当 newed 时,调试模式礼貌地将 portNumber 清零的可能性非常大,因此 portNumber 会提前终止。发布模式将编译速度,不会执行未明确请求的内容,因此没有归零,也没有免费赠品 NULL。

为什么这在一个文件夹中有效而在另一个文件夹中无效可能只是愚蠢的倒霉(不幸运,因为彻底的崩溃会更容易检测到)或者它可能更险恶。无论如何,未终止的字符串需要修复。