求解答,串口编程问题!

gongqinxia1987 2010-10-27 08:32:00
小弟最近在做串口与PC通信的实验,参考周立功的《ARM&WinCE实验与实践》写的代码,可是编译不能通过,有一个错误。请问高手是什么原因?(红色字体出位错误地方。)
// SerialPortDlg.cpp : implementation file
//

#include "stdafx.h"
#include "SerialPort.h"
#include "SerialPortDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

DCB dcb;//串口参数结构体
HANDLE m_hComm;//串口操作句柄
HANDLE m_ExitThreadEvent;//串口接收线程退出事件
CString m_strRecDisp;//接收区显示字符
BOOL ClosePort(void);//关闭串口

//打开串口
BOOL OpenPort(LPCTSTR Port,int BaudRate,int DataBits,int StopBits,int Parity);
//串口接收线程
static DWORD __cdecl CommRecvTread(LPVOID lparam);
//串口接收数据成功回调函数
typedef void(CALLBACK *ONCOMMRECV)(CWnd *pWnd,char *buf,int bufle);
static void CALLBACK OnCommRecv(CWnd *pWnd,char *buf,int buflen);

/////////////////////////////////////////////////////////////////////////////
// CSerialPortDlg dialog

CSerialPortDlg::CSerialPortDlg(CWnd* pParent /*=NULL*/)
: CDialog(CSerialPortDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CSerialPortDlg)
m_strRecDisp = _T("");
m_strSendEdit = _T("");
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CSerialPortDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CSerialPortDlg)
DDX_Control(pDX, IDC_OPEN_COM, m_ButOpen);
DDX_Control(pDX, IDC_BAUD, m_ComboBaud);
DDX_Control(pDX, IDC_CLOSE_COM, m_ButClose);
DDX_Control(pDX, IDC_PARITY, m_ComboParity);
DDX_Control(pDX, IDC_STOP, m_ComboStop);
DDX_Control(pDX, IDC_DATA, m_ComboData);
DDX_Control(pDX, IDC_PORT, m_ComboPort);
DDX_Text(pDX, IDC_REC_DISP, m_strRecDisp);
DDX_Text(pDX, IDC_SEND_EDIT, m_strSendEdit);
//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CSerialPortDlg, CDialog)
//{{AFX_MSG_MAP(CSerialPortDlg)
ON_WM_DESTROY()
ON_BN_CLICKED(IDC_CLOSE_COM, OnCloseCom)
ON_BN_CLICKED(IDC_OPEN_COM, OnOpenCom)
ON_BN_CLICKED(IDC_SEND, OnSend)
ON_BN_CLICKED(IDC_CLEAR_SEND, OnClearSend)
ON_BN_CLICKED(IDC_CLEAR_REC, OnClearRec)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CSerialPortDlg message handlers

BOOL CSerialPortDlg::OnInitDialog()
{
CDialog::OnInitDialog();

// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon

CenterWindow(GetDesktopWindow()); // center to the hpc screen

// TODO: Add extra initialization here
m_ComboBaud.SetCurSel(5);
m_ComboData.SetCurSel(1);
m_ComboParity.SetCurSel(0);
m_ComboPort.SetCurSel(0);
m_ComboStop.SetCurSel(0);

m_ButClose.EnableWindow(FALSE);
m_hComm=INVALID_HANDLE_VALUE;
m_ExitThreadEvent=NULL;
m_strRecDisp=_T("");
UpdateData(FALSE);

return TRUE; // return TRUE unless you set the focus to a control
}



void CSerialPortDlg::OnDestroy()
{
CDialog::OnDestroy();

// TODO: Add your message handler code here
CDialog::OnDestroy();
if(m_ExitThreadEvent!=NULL)
{
SetEvent(m_ExitThreadEvent);
Sleep(1000);
CloseHandle(m_ExitThreadEvent);
m_ExitThreadEvent=NULL;
}
ClosePort();
}

BOOL CSerialPortDlg::OpenPort(LPCTSTR Port, int BaudRate, int DataBits, int StopBits, int Parity)
{
COMMTIMEOUTS CommTimeOuts;
//打开串口
m_hComm=CreateFile(_T("COM1:"),GENERIC_READ|GENERIC_WRITE,0,0,OPEN_EXISTING,0,0);
if(m_hComm==INVALID_HANDLE_VALUE)
{
MessageBox(_T("无法打开端口或端口已打开,请检查是否被占用!"));
return FALSE;
}
GetCommState(m_hComm,&dcb);//读串口的DCB
dcb.BaudRate=BaudRate;
dcb.ByteSize=DataBits;
dcb.Parity=Parity;
dcb.StopBits=StopBits;
dcb.fParity=FALSE; //禁止奇偶校验
dcb.fBinary=TRUE;
dcb.fDtrControl=0; //禁止流量控制
dcb.fRtsControl=0;
dcb.fOutX=0;
dcb.fInX=0;
dcb.fTXContinueOnXoff=0;
//设置状态参数
SetCommMask(m_hComm,EV_RXCHAR);//串口事件:接收到一个字符
SetupComm(m_hComm,16384,16384);//设置接收与发送的缓冲区大小
if(!SetCommState(m_hComm,&dcb))//设置串口的DCB
{
MessageBox(_T("无法按当前参数配置端口!"));
ClosePort();
return FALSE;
}
//设置超时参数
GetCommTimeouts(m_hComm,&CommTimeOuts);
CommTimeOuts.ReadIntervalTimeout=100; //接收字符间最大时间间隔
CommTimeOuts.ReadTotalTimeoutMultiplier=1;
CommTimeOuts.ReadTotalTimeoutConstant=100;//读取数据总超时常量
CommTimeOuts.WriteTotalTimeoutMultiplier=0;
CommTimeOuts.WriteTotalTimeoutConstant=0;
if(!SetCommTimeouts(m_hComm,&CommTimeOuts))
{
MessageBox(_T("无法设置超时参数!"));
ClosePort();
return FALSE;
}
PurgeComm(m_hComm,PURGE_TXCLEAR|PURGE_RXCLEAR);//清除接收、发送缓冲区
return TRUE;
}

void CSerialPortDlg::OnCloseCom()
{
// TODO: Add your control notification handler code here
if(m_ExitThreadEvent!=NULL)
{
SetEvent(m_ExitThreadEvent);
Sleep(1000);
CloseHandle(m_ExitThreadEvent);
m_ExitThreadEvent=NULL;
}
ClosePort();//关闭串口
}

const CString PortTbl[6]={_T("COM1:"),_T("COM2:"),_T("COM3:"),_T("COM4:"),_T("COM5:"),_T("COM6:")};
const DWORD BaudTbl[6]={4800,9600,19200,38400,57600,115200};
const DWORD DataBitTbl[2]={7,8};
const BYTE StopBitTbl[3]={ONESTOPBIT,ONESTOPBIT,TWOSTOPBITS};
const ParityTbl[4]={NOPARITY,ODDPARITY,EVENPARITY,MARKPARITY};
void CSerialPortDlg::OnOpenCom()
{
// TODO: Add your control notification handler code here
DWORD IDThread;
HANDLE hRecvThread; //接收线程句柄。
UpdateData(TRUE);

CString strPort=PortTbl[m_ComboBaud.GetCurSel()];//查表获取参数值

DWORD baud=BaudTbl[m_ComboBaud.GetCurSel()];
DWORD databit=DataBitTbl[m_ComboData.GetCurSel()];
BYTE stopbit=StopBitTbl[m_ComboStop.GetCurSel()];
BYTE parity=ParityTbl[m_ComboParity.GetCurSel()];

BOOL ret=OpenPort(strPort,baud,databit,stopbit,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("打开")+strPort+_T("成功"));
}

DWORD CSerialPortDlg::CommRecvTread(LPVOID lparam)
{
DWORD dwLength;
char *recvBuf=new char[1024];
CSerialPortDlg *pDlg=(CSerialPortDlg *)lparam;

while(TRUE)
{ //等待线程退出事件
if(WaitForSingleObject(pDlg->m_ExitThreadEvent,0)==WAIT_OBJECT_0)
break;
if(pDlg->m_hComm!=INVALID_HANDLE_VALUE)
{ //从串口读取数据
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;
}

void CALLBACK CSerialPortDlg::OnCommRecv(CWnd *pWnd, char *buf, int buflen)
{
CString tmp;
CSerialPortDlg* pDlg=(CSerialPortDlg *)pWnd;
CEdit *pRecvStrEdit=(CEdit *)pDlg->GetDlgItem(IDC_REC_DISP); //取得接收区控件指针
for(int i=0;i<buflen;i++,buf++)
{
tmp.Format(_T("%c"),*buf); //将字符转换为字符串
pDlg->m_strRecDisp+=tmp;
}
pRecvStrEdit->SetWindowText(pDlg->m_strRecDisp); //显示在窗口上
}

void CSerialPortDlg::OnSend()
{
// TODO: Add your control notification handler code here
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[i]=(char)m_strSendEdit.GetAt(i); //转换为单字节字符
WriteFile(m_hComm,psendbuf,len,&dwactlen,NULL); //从串口发送数据
delete[] psendbuf;
}

void CSerialPortDlg::OnClearSend()
{
// TODO: Add your control notification handler code here
m_strSendEdit=_T(""); //清除发送区的字符
UpdateData(FALSE);
}

void CSerialPortDlg::OnClearRec()
{
// TODO: Add your control notification handler code here
m_strRecDisp=_T("");
SetDlgItemText(IDC_REC_DISP,m_strRecDisp); //清除接收区的字符
}

BOOL CSerialPortDlg::ClosePort(void)
{
if(m_hComm!=INVALID_HANDLE_VALUE)
{
SetCommMask(m_hComm,0);
PurgeComm(m_hComm,PURGE_TXCLEAR|PURGE_RXCLEAR);//清除接收、发送缓存区。
CloseHandle(m_hComm); //关闭串口操作句柄。
m_hComm=INVALID_HANDLE_VALUE;
return TRUE;
}
return FALSE;
}
错误提示:
error C2664: 'CreateThread' : cannot convert parameter 3 from 'unsigned long (void *)' to 'unsigned long (__cdecl *)(void *)'

请问该怎样改?
...全文
71 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zgl7903 2010-10-27
  • 打赏
  • 举报
回复
在CSerialPortDlg头文件的类里声明
CSerialPortDlg:public XXXXX
{
……
static DWORD WINAPI CommRecvTread(LPVOID lparam);
}
gongqinxia1987 2010-10-27
  • 打赏
  • 举报
回复
大哥 static DWORD __stdcall CommRecvTread(LPVOID lparam);我试过了,还是出现同样的错误。
问题解决了我一定都会结贴的呀。
这不是鸭头 2010-10-27
  • 打赏
  • 举报
回复
楼主,你那结贴率不行啊。
这不是鸭头 2010-10-27
  • 打赏
  • 举报
回复
static DWORD __stdcall CommRecvTread(LPVOID lparam);

gongqinxia1987 2010-10-27
  • 打赏
  • 举报
回复
自己顶一下。大家帮忙看看呀。帮小弟解答一下

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧