7356|13

68

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

急急。。一个嵌入式的菜鸟问题。。。。 [复制链接]

 我是一个在校生,由于临时被拉到一个机器人项目组来,以前是学网络编程在这方面实在是没时间学,所以请大家帮帮忙啊,在编译的时候出现了这样的一个错误:

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:  在此添加控件通知处理程序代码
}

最新回复

嗯。。楼上的是对的。我自己也这样试出来了。。谢谢。。结贴了。。谢谢大家。。  详情 回复 发表于 2010-3-27 11:18
点赞 关注
 
 

回复
举报

77

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
哪位大哥帮帮忙。。学长催着紧。。谢谢啊。。。
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
帮帮忙啊。。。
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

4
 
引用 2 楼 aqxiebin 的回复:

源代码'如下(底下红色是引用的地方。。也是错误的地方出现的地方。黄色是定义句柄的地方。):
没看到在哪里调用啊
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

5
 
意思是HANDLE hFile不是一个static类型的变量
定义成static 或者自己写个串口类重新实现。应该很快的。

你应该是在线程中调用hFile了
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

6
 
没弄过,

帮顶下。
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

7
 
hFile 是CSerialPortDlg的成员么??怎么代码里面是全局的??
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

8
 
我是在这个函数中调用这个句柄。。(不好意思,这是抄书上代码的。。。)。。。然后在调用这个地方时,就会出现刚才那样的错误,(我刚才去上课了。。各位大大在帮忙看一下),6楼的大哥是想说,把它改为类成员,或者直接把他定义为static就可以吗??


函数名称: CSerialPortDlg::CommRecvTread
描    述: 串口接收线程
输入参数: LPVOID lparam: 线程参数,创建线程时传入
输出参数: 无
返    回: 0: 线程退出, 返回值没特殊含义
*********************************************************************************************************/
DWORD CSerialPortDlg::CommRecvTread(LPVOID lparam)
{
DWORD dwLength;
BOOL ret;
hFile=CreateFile(TEXT("PIO7:"),GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,0);
char *recvBuf = new char[1024];
CSerialPortDlg *pDlg = (CSerialPortDlg*)lparam;
BYTE ucIonum=7;
ret=::DeviceIoControl(hFile,IOCTL_GPO_SET_PIN_OUT,&ucIonum,1,NULL,0,NULL,NULL);/* 置GPO7为输出口  */
ret=::DeviceIoControl(hFile,IOCTL_GPO_SET_PIN,&ucIonum,1,NULL,0,NULL,NULL);/* 置GPO7为高电平    */
    ret=::DeviceIoControl(hFile,IOCTL_GPO_CLR_PIN,&ucIonum,1,NULL,0,NULL,NULL);/* 置GPO7为低电平    */

while(TRUE)
{                 /* 等待线程退出事件    */
  if (WaitForSingleObject(pDlg->m_ExitThreadEvent, 0) == WAIT_OBJECT_0)
   break;
  if (pDlg->m_hComm != INVALID_HANDLE_VALUE&&ret==TRUE)
  {                /* 从串口读取数据    */
   BOOL fReadState = ReadFile(pDlg->m_hComm, recvBuf, 1024, &dwLength, NULL);
   if(!fReadState)
   {
    //MessageBox(_T("无法从串口读取数据!"));
   }
   else
   {
    if(dwLength != 0)
     
    OnCommRecv(pDlg, recvBuf, dwLength);    /* 接收成功调用回调函数   */
   }
  }
}  
delete[] recvBuf;
return 0;
}
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

9
 
大家看一下我上面那样做是否对啊。。谢谢哦。。
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

10
 
引用 8 楼 aqxiebin 的回复:

大家看一下我上面那样做是否对啊。。谢谢哦。。
hFile 你放在头文件的类里面定义应该就可以了
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

11
 
hFile可以定义成CSerialPortDlg的成员变量。线程里调用pDlg->hFile即可,
注意CSerialPortDlg *pDlg = (CSerialPortDlg*)lparam;要写在调用前边
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

12
 
谢谢啊。。
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

13
 
error C2597: illegal reference to non-static member 'CSerialPortDlg::hFile

这句话表示你在静态函数里调用了非静态的变量。

你接收线程是'CSerialPortDlg的静态函数吧,那你把hFile改为CSerialPortDlg的静态成员变量。
注意静态成员变量在CPP文件要定义。
HANDLE CSerialPortDlg::hFile = INVALID_HANDLE_VALUE;
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

14
 
嗯。。楼上的是对的。我自己也这样试出来了。。谢谢。。结贴了。。谢谢大家。。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表