CSerialPort串列埠操作

2021-09-02 15:22:02 字數 3690 閱讀 3675

最近要寫乙個串列埠程式,用mfc自帶com元件的效果很差(一次接收乙個緩衝區的資料,沒辦法像寫嵌入式程式那樣單位元組就能觸發中斷接收那樣),所以進行了一些研究,發現了乙個第三方串列埠類很強大,效果非常好。

程式設計環境:vs2008

建立乙個基於對話方塊的mfc應用程式,我在這裡是serialporttest,畫的介面如下:

serialport.hserialport.cpp兩個檔案複製到工程所在的資料夾中,而且新增到工程裡,並在mfc生成的對話方塊類的標頭檔案中包含#include "serialport.h"

在我的對話方塊類中(class cserialporttestdlg : public cdialogserialporttest.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...