CSerialPort類錯誤排除


Run-Time Check Failure #3 - The variable 'comstat' is being used without being initialized.

CSerialPort類在Visual C++ .NET 應用時會出現意想不到的問題。以《Visual C++/Turobo C串口通信編程實踐》(龔建偉 熊光明 著)一書中第二章的SerialPortTest程序爲例,當在Visual C++ .NET下編寫後之後,debug之後,會出現編譯錯誤:“operator+="不明確,MSDN解釋“爲重載運算符定
義了多個可能的運算符。可能的解決方案:對一個或多個實際參數使用顯式轉換。”當將


LONG CSerialPortTestDlg::OnComm(WPARAM ch, LPARAM port)
{
m_strEditReceiveMsg +=ch;
UpdateData(FALSE); //將接收到的字符顯示在接收編輯框中
return 0;
}


中m_strEditReceiveMsg +=ch;改寫爲m_strEditReceiveMsg +=char(ch);後,debug順利通過了。其實這個還不是CSerialPort類的問題。m_strEditReceiveMsg+=ch;改寫爲m_strEditReceiveMsg +=char(ch) 是應該的,這樣更爲嚴謹,因爲在 OnComm(WPARAM ch, LPARAM port)函數中,ch 爲 WPARAM 型數據,WPARAM型數據適應型很強,char(ch)將ch強制轉換爲char型,更適合CString型,這應該算是VC.NET的進步。


    當將這個問題解決之後,編譯成功了。然後開始測試。向串口調試助手發送消息時一切正常。但從串口調試助手向SerialPortTest發送消息時,報錯了,說“comstat is being used without defining",在SerialPort.CPP中,可以找到comstat的定義:COMSTAT comstat; 但將光標指向comstat時右鍵轉到定義處或聲明處,卻均提示“未定義符號”,這便是CSerialPort類在VC.NET應用中的問題了。那該如何解決這個問題呢?在這,我們向大家提供兩種解決方案:


方案1: 改變項目配置屬性


    一種解決方案是改變基本運行時檢查(changing the runtime checks in project settings):在菜單Project->Project properties-> C/C++ -> Code generation-> Basic Runtime checks --> change to 'Default',在中文版中是:項目-〉屬性-〉配置屬性-〉C/C++代碼生成-〉基本運行時檢查-〉設置爲默認,當將基本運行時檢查改爲默認之後,編譯自然順利通過了,向串口調試助手發送消息正常了,再從串口調試助手向SerialPortTest發送消息時,也正常了。


方案2:改變comstat變量屬性


     另一種解決方案是將CSerialPort.CPP中的COMSTAT comstat;改爲static COMSTAT comstat;這樣改了之後,debug順利通過,然後調試,與串口調試助手相互發消息都OK了。爲什麼這樣就能解決呢?其實當你使用debug解決方案時,它的基本運行時檢查初始設置爲:兩者(/RTC1,等同於 /RTCsu),這個兩者是指:堆棧幀(/RTCs),未初始化的變量(/RTCu)。由於它要檢查未初始化的變量,所以將SerialPort.cpp中的COMSTAT comstat;改爲static COMSTAT comstat;就可以正常使用CSerialPort類了。
     以上是在debug下的解決方案,當在Release編譯狀態時,你會發現並不需要將COMSTAT comstat;改爲static COMSTAT comstat;就能編譯成功並且發送接收消息正常。其實,在Release下,它的基本運行時檢查初始設置已爲默認。這應該也算是第一種解決方案之內。
    而當你將它設置爲兩者(/RTC1,等同於 /RTCsu)時,不論是否將COMSTAT comstat;改爲static COMSTAT comstat;,編譯都不能通過,報錯““cl.exe”返回的結果有誤。",這個應該是屬於Release的問題了,另當別論了。
    CSerialPort類是一個用起來很方便的類,在Visual C++.NET應用時,遇到一些問題,上面是解決方案是否妥當,請大家也去試試,說不定有更好的解決方案。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章