最近要寫乙個串列埠程式,用mfc自帶com元件的效果很差(一次接收乙個緩衝區的資料,沒辦法像寫嵌入式程式那樣單位元組就能觸發中斷接收那樣),所以進行了一些研究,發現了乙個第三方串列埠類很強大,效果非常好。
程式設計環境:vs2008
建立乙個基於對話方塊的mfc應用程式,我在這裡是serialporttest
,畫的介面如下:
將serialport.h
和serialport.cpp
兩個檔案複製到工程所在的資料夾中,而且新增到工程裡,並在mfc生成的對話方塊類的標頭檔案中包含#include "serialport.h"
在我的對話方塊類中(class cserialporttestdlg : public cdialog
在serialporttest.h標頭檔案中) 新增串列埠字元接收訊息wm_comm_rxchar
(串列埠接收緩衝區內有乙個字元)的響應函式宣告:
public:
//******************************************
afx_msg long oncommunication(wparam ch, lparam port);//串列埠接收處理函式
//******************************************
然後再在serialporttest.cpp中進行wm_comm_rxchar
訊息對映:
begin_message_map(cserialporttestdlg, cdialog)
·········
//******************************************
on_message(wm_comm_rxchar, oncommunication)
//串列埠接收處理函式
//******************************************
·········
end_message_map()
最後在serialporttest.cpp對串列埠接收響應函式進行實現:
long cserialporttestdlg::oncommunication(wparam ch, lparam port)
其實就是開啟串列埠和關閉串列埠
首先class cserialporttestdlg : public cdialog
類加入乙個public
的成員變數m_com
:
cserialport m_com;//串列埠類
在對對話方塊的「開啟串列埠」的cbutton
控制項新增單擊訊息處理函式在裡面實現開啟和關閉串列埠的功能
void cserialporttestdlg::onbnclickedbtnopen()
else
//串列埠已經關閉
else
}
}
至於串列埠的傳送可以呼叫cserialport
類 中的類成員函式:
void writetoport(char* string);
void writetoport(char* string,int n); // add by mrlong 2007-12-25
void writetoport(lpctstr string); // add by mrlong 2007-12-25
void writetoport(byte* buffer, int n);// add by mrlong
具體我是這樣用的:
//m_string_send_ascii 是我cedit控制項繫結的cstring的乙個成員變數,用於獲取傳送資料
char* sendbuf;
intlength = m_string_send_ascii.getlength();
sendbuf = m_string_send_ascii.getbuffer(length);
m_com.writetoport( sendbuf ); //傳送資料
m_string_send_ascii.releasebuffer();
使用這個串列埠類會遇到這個問題
run-time check failure #3 - the variable
'comstat' is being used without being initialized
下面是我蒐集到的解決方法,屢試不爽(基本用方案1)
一種解決方案是改變基本執行時檢查(changing the runtime checks in project settings):在選單project->project properties-> c/c++ -> code generation-> basic runtime checks –> change to 『default』,在中文版中是:專案-〉屬性-〉配置屬性-〉c/c++**生成-〉基本執行時檢查-〉設定為預設,當將基本執行時檢查改為預設之後,編譯自然順利通過了,向串列埠除錯助手傳送訊息正常了,再從串列埠除錯助手向serialporttest傳送訊息時,也正常了。
另一種解決方案是將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的問題了,另當別論了。
新增**:memset(&comstat, 0, sizeof(comstat)); //vc6不用這句也可以用,2008就要加
c SerialPort串列埠通訊
1 引入using集 using system.io.ports 2 定義全域性變數 serialport serialport new serialport 3 可以設定下拉列表 combobox 在窗體的load事件中讀取電腦上的com口 foreach string serial name i...
C SerialPort串列埠通訊資料異常
本篇文章只適合剛開始學習c net,並使用串列埠通訊的同學借鑑。筆者也是在寫c 與arduino串列埠進行通訊的時候收到的資料異常,翻閱了其他csdn博主對串列埠通訊的建議,最好就是使用執行緒對接收的資料進行處理。廢話不多說,下面展示執行緒方法和原方法。使用執行緒的方法 定義 private del...
基於MFC的串列埠類CSerialPort的使用
基於mfc的串列埠類cserialport的使用 1 在dlg.件中新增標頭檔案 include cserialport.h 2 在dlg.件中定義串列埠類 public cserialport m serialport 定義串列埠類3 在dlg.件中定義串列埠類的實現函式 afx msg long...