|
我是一个在校生,由于临时被拉到一个机器人项目组来,以前是学网络编程在这方面实在是没时间学,所以请大家帮帮忙啊,在编译的时候出现了这样的一个错误:
error C2597: illegal reference to non-static member 'CSerialPortDlg::hFile
源代码'如下(底下红色是引用的地方。。也是错误的地方出现的地方。黄色是定义句柄的地方。):
// SerialPortDlg.cpp : 实现文件
//
#include "stdafx.h"
#include "SerialPort.h"
#include "SerialPortDlg.h"
#include "gpio.h"
HANDLE hFile=INVALID_HANDLE_VALUE;
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CSerialPortDlg 对话框
CSerialPortDlg::CSerialPortDlg(CWnd* pParent /*=NULL*/)
: CDialog(CSerialPortDlg::IDD, pParent)
, m_strRecDisp(_T(""))
, m_strSendEdit(_T(""))
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CSerialPortDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_REC_DISP, m_strRecDisp);
DDX_Text(pDX, IDC_SEND_EDIT, m_strSendEdit);
DDX_Control(pDX, IDC_OPEN_COM, m_ButOpen);
DDX_Control(pDX, IDC_CLOSE_COM, m_ButClose);
}
BEGIN_MESSAGE_MAP(CSerialPortDlg, CDialog)
#if defined(_DEVICE_RESOLUTION_AWARE) && !defined(WIN32_PLATFORM_WFSP)
ON_WM_SIZE()
#endif
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDC_OPEN_COM, &CSerialPortDlg::OnBnClickedOpenCom)
ON_BN_CLICKED(IDC_CLOSE_COM, &CSerialPortDlg::OnCloseCom)
ON_BN_CLICKED(IDC_CLEAR_SEND, &CSerialPortDlg::OnClearSend)
ON_BN_CLICKED(IDC_CLEAR_REC, &CSerialPortDlg::OnClearRec)
ON_BN_CLICKED(IDC_SEND, &CSerialPortDlg::OnSend)
ON_EN_CHANGE(IDC_REC_DISP, &CSerialPortDlg::OnEnChangeRecDisp)
END_MESSAGE_MAP()
// CSerialPortDlg 消息处理程序
BOOL CSerialPortDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
// TODO: 在此添加额外的初始化代码
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
#if defined(_DEVICE_RESOLUTION_AWARE) && !defined(WIN32_PLATFORM_WFSP)
void CSerialPortDlg::OnSize(UINT /*nType*/, int /*cx*/, int /*cy*/)
{
if (AfxIsDRAEnabled())
{
DRA::RelayoutDialog(
AfxGetResourceHandle(),
this->m_hWnd,
DRA::GetDisplayMode() != DRA::Portrait ?
MAKEINTRESOURCE(IDD_SERIALPORT_DIALOG_WIDE) :
MAKEINTRESOURCE(IDD_SERIALPORT_DIALOG));
}
}
#endif
/*********************************************************************************************************
函数名称: CSerialPortDlg::OpenPort
描 述: 打开串口
输入参数: LPCTSTR Port: 串口名,如"COM0:","COM1:"
int BaudRate: 波特率
int DataBits: 数据位, 取值为7或8
int StopBits: 停止位
int Parity : 奇偶校验位
输出参数: 无
返 回: FALSE: 失败; TRUE: 成功
*********************************************************************************************************/
BOOL CSerialPortDlg::OpenPort(LPCTSTR Port, int BaudRate, int DataBits, int StopBits, int Parity)
{。。。。(代码太长了。省略一点)}
/*********************************************************************************************************
函数名称: CSerialPortDlg::OnOpenCom
描 述: "打开端口" 按键单击事件代码
输入参数: 无
输出参数: 无
返 回: 无
*********************************************************************************************************/
void CSerialPortDlg::OnBnClickedOpenCom()
{
// TODO: 在此添加控件通知处理程序代码
//串口参数输入对话框
DWORD IDThread;
HANDLE hRecvThread; /* 接收线程句柄 */
UpdateData(TRUE);
CSet dlgParams;
if (dlgParams.DoModal() == IDOK)
{
/*
*设置串口名
*/
BOOL ret = OpenPort(dlgParams.strPort, dlgParams.baud, dlgParams.databit, dlgParams.stopbit, dlgParams.parity); /* 打开串口 */
if (ret == FALSE)
return;
m_ExitThreadEvent = CreateEvent(NULL, TRUE, FALSE, NULL); /* 创建串口接收线程退出事件 */
/*
*创建串口接收线程
*/
hRecvThread = CreateThread(0, 0, CommRecvTread, this, 0, &IDThread);
if (hRecvThread == NULL)
{
MessageBox(_T("创建接收线程失败!"));
return;
}
CloseHandle(hRecvThread);
m_ButOpen.EnableWindow(FALSE); /* 打开端口按键禁止 */
m_ButClose.EnableWindow(TRUE); /* 关闭端口按键使能 */
MessageBox(_T("打开成功!"));
}
}
/*********************************************************************************************************
函数名称: CSerialPortDlg::OnSend
描 述: "关闭端口" 按键单击事件代码
输入参数: 无
输出参数: 无
返 回: 无
*********************************************************************************************************/
void CSerialPortDlg::OnCloseCom()
{
// TODO: 在此添加控件通知处理程序代码
if (m_ExitThreadEvent != NULL)
{
SetEvent(m_ExitThreadEvent); /* 通知线程退出 */
Sleep(1000);
CloseHandle(m_ExitThreadEvent);
m_ExitThreadEvent = NULL;
}
m_ButOpen.EnableWindow(TRUE); /* 打开端口按键禁止 */
m_ButClose.EnableWindow(FALSE); /* 关闭端口按键使能 */
ClosePort();
}
/*********************************************************************************************************
函数名称: CSerialPortDlg::OnClearSend
描 述: "清除发送缓冲区" 按键单击事件代码
输入参数: 无
输出参数: 无
返 回: 无
*********************************************************************************************************/
void CSerialPortDlg::OnClearSend()
{
// TODO: 在此添加控件通知处理程序代码
m_strSendEdit = _T(""); /* 清除发送区的字符 */
UpdateData(FALSE);
}
/*********************************************************************************************************
函数名称: CSerialPortDlg::OnClearRec
描 述: "清除接收缓冲区" 按键单击事件代码
输入参数: 无
输出参数: 无
返 回: 无
*********************************************************************************************************/
void CSerialPortDlg::OnClearRec()
{
m_strRecDisp = _T("");
SetDlgItemText(IDC_REC_DISP,m_strRecDisp); /* 清除接收区的字符 */
}
/*********************************************************************************************************
函数名称: CSerialPortDlg::OnSend
描 述: "发送" 按键单击事件代码
输入参数: 无
输出参数: 无
返 回: 无
*********************************************************************************************************/
void CSerialPortDlg::OnSend()
{
DWORD dwactlen;
if (m_hComm == INVALID_HANDLE_VALUE)
{
MessageBox(_T("串口未打开!"));
return;
}
UpdateData(TRUE);
int len = m_strSendEdit.GetLength(); /* 取得输入字符串长度 */
char *psendbuf = new char[len];
for(int i = 0; i < len;i++)
psendbuf = (char)m_strSendEdit.GetAt(i); /* 转换为单字节字符 */
WriteFile(m_hComm, psendbuf, len, &dwactlen, NULL); /* 从串口发送数据 */
delete[] psendbuf;
}
void CSerialPortDlg::OnEnChangeRecDisp()
{
// TODO: 如果该控件是 RICHEDIT 控件,则它将不会
// 发送该通知,除非重写 CDialog::OnInitDialog()
// 函数并调用 CRichEditCtrl().SetEventMask(),
// 同时将 ENM_CHANGE 标志“或”运算到掩码中。
// TODO: 在此添加控件通知处理程序代码
}
|
|