這兩天整理以往項目代碼,正好朋友有個win平臺下串口項目需求,不過他對win下面的開發IDE平臺和MFC架構都沒有概念,於是就開貼對部分demo做了手把手的備註。
朋友使用的時候碰到了一些問題,這裏梳理一下。也因爲MSDN裏面沒有對VC++下面的CMSCOMM(或者新版本叫IMSCOMM)做出說明,這樣有一份可用的相對正確的參考就很重要。
1)部分源碼是在VC6下面的,用VS2010可以直接兼容打開低版本的工作環境文件.DSW,並且導入老版本的控件。在這種情況下,沿用原來的代碼,是OK的,可以調試通過;
2)不過如果在VS2010的環境下,按照教程一步一步的做,添加完MSCOMM控件後,會發現原來的部分方法/函數報錯。這是因爲,在默認生成的頭文件中,方法的引用名稱有了變化;如果直接COPY代碼過來就沒法編譯了。這裏舉幾個常用的方法,做一下對應 -
m_ComPort.put_CommPort(1); // 選擇串口號
VS m_ComPort.SetCommPort(1);
m_ComPort.put_InBufferSize(1024); //接收緩衝區
VS m_ComPort.SetInBufferSize(1024);
m_ComPort.put_OutBufferSize(1024); //發送緩衝區
VS m_ComPort.SetOutBufferSize(1024);
m_ComPort.put_InputLen(0); //設置當前接收區數據長度爲0,表示全部讀取
VS m_ComPort.SetInputLen(0);
m_ComPort.put_InputMode(1); //以二進制方式讀寫數據
VS m_ComPort.SetInputMode(1);
m_ComPort.put_RThreshold(1);//接收緩衝區有大於等於1個字符時,將引發接收數據的OnCommMscomm事件
VS m_ComPort.SetRThreshold(1);
m_ComPort.put_SThreshold(1);
VS m_ComPort.SetSThreshold(1);
m_ComPort.put_Settings(_T("9600,n,8,1")); //設置波特率等參數
VS m_ComPort.SetSettings("9600,n,8,1");
m_ComPort.get_PortOpen() //檢查串口是否打開
VS m_ComPort.GetPortOpen()
m_ComPort.put_PortOpen(TRUE); //打開串口
VS m_ComPort.SetPortOpen(TRUE);
m_ComPort.put_OutBufferCount(0);
VS m_ComPort.SetOutBufferCount(0);
3)對於部分“綠色版本”的IDE平臺,如VC2010,可能裏面並沒有集成MSCOMM控件,那麼要額外的註冊,這種情況下,要麼裝兩個IDE,回到VC6下面導入控件完畢,再用VS2010來兼容打開,要麼直接註冊控件,並在VS2010下的代碼裏面注意變更寫法。都可以。
4)對於沒有用到的屬性/方法,直接把相關代碼剔除就好了,比如,你只用到了發送數據,那麼與接收相關的設置就不必寫了(當然,寫了也沒倒扣分),以免因爲疏忽發生不好領會的運行時錯誤。
當然,這個控件顯然微軟後面沒有很花心思,導入後並沒有附帶的直接生成類,要手動添加,手動在頭文件中聲明,並手動定義變量,手動創建類對象。(話說,這麼麻煩,比直接用第三方的類庫,也只稍微強一點點了,就是比較有信心,這個畢竟是微軟自己發佈的)