我做了一個MFC工程,其中包含多個按鈕彈出對話框。我把CSerialPort類在其中一個對話框里:
創建物件CSerialPort m_Port;
并加入串口資料接收回應函式afx_msg LONG OnCommunication(WPARAM ch, LPARAM port);
現在,我需要在另一個對話框里完成對串口的寫操作,使用的是m_Port.WriteToPort(strdata, strlen);可是總是出錯?請問前輩們是什么原因出錯?怎么入手解決?萬分感謝!
下圖為報錯情況:
uj5u.com熱心網友回復:
你要這樣看:類函式
{
類變數->函式( ) 實際上等于 this->類變數->函式();
}
你的第二個對話框并沒有對應的this指標。
下面是偽代碼
方法一:
class A
{
public:
m_port;
};
A g_DlgA;
B::Test
{
g_DlgA.m_port->WritePort();
}
方法二:
class A
{
private:
m_port;
public WritePort()
{
m_port.WritePort();
}
};
A g_DlgA;
B::Test
{
g_DlgA.WritePort();
}
uj5u.com熱心網友回復:
CSerialPort m_Port; //另外類里面用你是不是定義的全域的啊你描述的里面看不出問題 上代碼跟除錯資訊
uj5u.com熱心網友回復:
定義個對話框指標,然后傳對應的對話框指標進去,再呼叫指標呼叫m_port寫。另外,你為什么要把寫放到另外一個對話框里面去呢,有啥必要么。
uj5u.com熱心網友回復:
所有對串口的操作都放在一個對話框里不好吧,有通信、讀卡、定位、各種讀寫操作。你說的是二樓的方法嗎?
uj5u.com熱心網友回復:
感謝回復,我按你的方法一寫的,出現重定義的錯誤。
uj5u.com熱心網友回復:
是這樣的,我在對話框A中有一個函式On_ICJC();這個函式使用了CSerialPort類的一個寫串口函式WriteToPort,即

我想在對話框B完成同樣的寫串口操作,然后出現了問題中的錯誤。
uj5u.com熱心網友回復:
串口是否打開,在另一個對話框發送,就需要在另一個對話框打開串口,關閉之前的串口uj5u.com熱心網友回復:
問題補充,出問題的代碼為:m_hComm!=0;如下圖所示:
uj5u.com熱心網友回復:
重定義問題已解決,還是現在問題還是m_hComm!=0;的問題
uj5u.com熱心網友回復:
定義個對話框指標,然后傳對應的對話框指標進去,再呼叫指標呼叫m_port寫。
另外,你為什么要把寫放到另外一個對話框里面去呢,有啥必要么。
所有對串口的操作都放在一個對話框里不好吧,有通信、讀卡、定位、各種讀寫操作。你說的是二樓的方法嗎?
不是,就比如單檔案程式,你的view和doc指標物件都是定義在CMainFrame里面的是吧,如果你在不同的view里面要操作其他view的里面的變數怎么辦。你可以先獲主視窗的指標,通過主視窗的指標訪問你要操作的view指標,你在通過這個view指標操作你要操作的變數。
這里也是一樣,你是要在別的對話框操作你的m_port,那你就要訪問這個m_port吧,而這個m_port你定義在另外一個對話框里面,你把m_port對話框的句柄獲取了,然后通過這個句柄操作m_port變數在你這個對話框里面發送就可以了。
uj5u.com熱心網友回復:
串口還沒有打開uj5u.com熱心網友回復:
我那個只是偽代碼,只是舉個例子,你不能照搬的,我講詳細點吧如果你的A對話框是主對話框 (就是最先彈出的那個)
DlgA.cpp檔案============
DlgA *g_pDlg = NULL;
OnitDialog()
{
g_pDlg = this;
}
DlgA.h檔案=====================
extern DlgA *g_pDlg
DlgB.cpp====================
#include "DlgA.h"
Function
{
g_pDlg->m_port->WritePort();
}
uj5u.com熱心網友回復:
頭檔案如果是比較新VS編譯器要避免被重復包含
xx.h===============
#ifndef xxxxx_H
#define xxxxx_H
--
#endif
或者
#pragma once
uj5u.com熱心網友回復:
定義個對話框指標,然后傳對應的對話框指標進去,再呼叫指標呼叫m_port寫。
另外,你為什么要把寫放到另外一個對話框里面去呢,有啥必要么。
所有對串口的操作都放在一個對話框里不好吧,有通信、讀卡、定位、各種讀寫操作。你說的是二樓的方法嗎?
不是,就比如單檔案程式,你的view和doc指標物件都是定義在CMainFrame里面的是吧,如果你在不同的view里面要操作其他view的里面的變數怎么辦。你可以先獲主視窗的指標,通過主視窗的指標訪問你要操作的view指標,你在通過這個view指標操作你要操作的變數。
這里也是一樣,你是要在別的對話框操作你的m_port,那你就要訪問這個m_port吧,而這個m_port你定義在另外一個對話框里面,你把m_port對話框的句柄獲取了,然后通過這個句柄操作m_port變數在你這個對話框里面發送就可以了。
是的,我就是這么寫的,
CMainFrame *pmf;
pmf=new CMainFrame();
CString strsd;
strsd="24 49 43 4A 43 00 0C 00 00 00 00 2B";
char data[512];
int strlen = pmf->pSysSetdlg->Str2Hex(strsd, data);
pmf->pSysSetdlg->m_Port.WriteToPort(data, strlen);
結果是CSerialPort這個類報錯了
uj5u.com熱心網友回復:
串口還沒有打開
在對話框A中已經打開了
uj5u.com熱心網友回復:
我那個只是偽代碼,只是舉個例子,你不能照搬的,我講詳細點吧
如果你的A對話框是主對話框 (就是最先彈出的那個)
DlgA.cpp檔案============
DlgA *g_pDlg = NULL;
OnitDialog()
{
g_pDlg = this;
}
DlgA.h檔案=====================
extern DlgA *g_pDlg
DlgB.cpp====================
#include "DlgA.h"
Function
{
g_pDlg->m_port->WritePort();
}
是的,我明白您的意思了,現在可以呼叫m_port了,呼叫后出現斷言:

我是不是可以把這句斷言刪掉,因為很明顯,m_Comm我確實已經讓它出現了。
uj5u.com熱心網友回復:
我那個只是偽代碼,只是舉個例子,你不能照搬的,我講詳細點吧
如果你的A對話框是主對話框 (就是最先彈出的那個)
DlgA.cpp檔案============
DlgA *g_pDlg = NULL;
OnitDialog()
{
g_pDlg = this;
}
DlgA.h檔案=====================
extern DlgA *g_pDlg
DlgB.cpp====================
#include "DlgA.h"
Function
{
g_pDlg->m_port->WritePort();
}
是的,我明白您的意思了,現在可以呼叫m_port了,呼叫后出現斷言:
我是不是可以把這句斷言刪掉,因為很明顯,m_Comm我確實已經讓它出現了。
不可以,這句斷言是用來除錯的,幫你定位錯誤。
你這里出現斷言是因為m_Comm這個句柄為空指標,是因為是在寫串口之前沒有打開串口。
uj5u.com熱心網友回復:
你new的Mainfram 是不是你程式運行的那個Mainfram指標,你要用AfxGetMainWnd()得到。如果是兩個對話框直接用FindWindow得到串口視窗的句柄,然后fromhandle得到物件指標。
uj5u.com熱心網友回復:
使用this指標:在你的串口函式所在的對話框了定義一個public全域變數
CSerialPort m_Port;
在你的想要使用的對話框里:
CYourDlg *pDlg = (CYourDlg*)this->GetParent();//這個CYourDlg就是你的串口函式在的那個對話框;
然后使用時候pDlg ->m_Port.WriteToPort(...);
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/106619.html
