我要写做一个反复读取串口的程序,设置定时器SetTimer(NULL,1,2000, (TIMERPROC)myTimerProc);;然后写了定时器的一个回调函数在回调函数里用另一个类的方法读串口(异步)怎么不能通过编译,无法解析声明函数static LRESULT CALLBACK myTimerProc(HWND hwnd, UINT message, UINT iTimerID, DWORD dwTime)
定义LRESULT  CALLBACK CComm::myTimerProc(HWND hwnd, UINT message, UINT iTimerID, DWORD dwTime)
 
   {
   
    int i=100;
//ss.GetData(Data,&i);
    return TRUE;   }
写串口的函数
bool CSerialPort::GetData(BYTE *pData, int *length)
{
OVERLAPPED m_osRead;
memset(&m_osRead,0,sizeof(OVERLAPPED));
m_osRead.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL); COMSTAT ComStat;
DWORD dwErrorFlags;

//char str[100];
//memset(str,0,100);
DWORD dwBytesRead=*length;//读取的字节数
BOOL bReadStat; ClearCommError(m_hComm,&dwErrorFlags,&ComStat);
dwBytesRead=min(dwBytesRead, (DWORD)ComStat.cbInQue);
bReadStat=ReadFile(m_hComm,pData,
dwBytesRead,&dwBytesRead,&m_osRead);
if(!bReadStat)
{
if(GetLastError()==ERROR_IO_PENDING)
    //GetLastError()函数返回ERROR_IO_PENDING,表明串口正在进行读操作
{
WaitForSingleObject(m_osRead.hEvent,2000);
    //使用WaitForSingleObject函数等待,直到读操作完成或延时已达到2秒钟
    //当串口读操作进行完毕后,m_osRead的hEvent事件会变为有信号
}
}  PurgeComm(m_hComm, PURGE_TXABORT|
PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
return false;
}

解决方案 »

  1.   

    TIMERPROC 应该是这个样子的吧
    VOID CALLBACK TimerProc(
      HWND hwnd,         // handle to window
      UINT uMsg,         // WM_TIMER message
      UINT_PTR idEvent,  // timer identifier
      DWORD dwTime       // current system time
    );
      

  2.   

    你这里是编译错误,找不到myTimerProc,你贴出GetData函数的代码干什么?
    写清楚你的myTimerProc函数是如何定义的,包括头文件和cpp,都在哪个文件中写的,文件是怎么相互包含的。
      

  3.   

    并且调试的时候UINT_PTR handle=SetTimer(NULL,1,3000,(TIMERPROC)myTimerProc);根本就没进入回调函数
      

  4.   

    myTimerProc得定义成静态的