簡體   English   中英

串行端口可在調試中工作,但不能釋放c ++代碼塊窗口

[英]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;
}

CreateFile用未終止的字符串調用。 我建議使用portName.c_str()代替自己的字符串portNumber

為什么?

生成portNumber的循環會復制字符串中的字符,但會保留終止NULL。 很有可能調試模式在new時禮貌地將portNumber為零,以便portNumber預先終止。 發布模式將針對速度進行編譯,並且不會執行未明確請求的操作,因此不會清零,也不會出現免費贈品NULL。

為什么在一個文件夾而不是另一個文件夾中使用它,可能只是愚蠢的運氣(不幸運,因為完全崩潰很容易檢測到),或者可能更危險。 無論如何,未終止的字符串都需要修復。

聽起來像是部署問題-即在構建環境中運行此程序似乎還可以,但是當您將其“移出”環境之外時,它就不能“獨立運行”。

您可以使用免費工具,例如: dependencywalker 在可執行文件上運行此文件,它將告訴您需要復制哪些dll /庫以及程序以使其獨立運行。

這可能有點粗糙,但是如果沒有看到整個項目環境,就很難說出問題所在。

在某些構建環境中(例如MS Visual Studio),您可以告訴它在可執行文件中包含所有依賴項(使其變得很大)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM