这是一个数据采集的程序,代码是:
BOOL CTestDlg::Acquisition()
{
DWORD dwNumDevices = 0;
SI_DEVICE_STRING devStr;
SI_STATUS status = SI_GetNumDevices(&dwNumDevices);

if (status == SI_SUCCESS)
{
for (DWORD d = 0; d < dwNumDevices; d++)
{
status = SI_GetProductString(d, devStr, SI_RETURN_SERIAL_NUMBER);
if (SI_Open(d,&m_hUSBDevice)==SI_SUCCESS)
{
BYTE bufWrite[MAX_PACKET_SIZE_WRITE];
BYTE bufRead[MAX_PACKET_SIZE_READ];
//                                   Settimer(1,300000,NULL);
for (int i=0x01;i<0x1a;i++)
{
bufWrite[0]= i;
unsigned long bytes_returned=0; memset(bufWrite, 0, 4);

if (DeviceWrite(bufWrite,4,&bytes_returned,1000))
{
memset(bufRead, 0, 800);     
if (DeviceRead(bufRead,800,&bytes_returned,10000))
{
      DWORD edtIDs[50] = { IDC_EDIT_FileName01,IDC_EDIT_FileName02,IDC_EDIT_FileName03,IDC_EDIT_FileName04,
 IDC_EDIT_FileName05,IDC_EDIT_FileName06,IDC_EDIT_FileName07,IDC_EDIT_FileName08,
 IDC_EDIT_FileName09,IDC_EDIT_FileName10,IDC_EDIT_FileName11,IDC_EDIT_FileName12,
 IDC_EDIT_FileName13,IDC_EDIT_FileName14,IDC_EDIT_FileName15,IDC_EDIT_FileName16,
 IDC_EDIT_FileName17,IDC_EDIT_FileName18,IDC_EDIT_FileName19,IDC_EDIT_FileName20,
 IDC_EDIT_FileName21,IDC_EDIT_FileName22,IDC_EDIT_FileName23,IDC_EDIT_FileName24,
 IDC_EDIT_FileName25,IDC_EDIT_FileName26,IDC_EDIT_FileName27,IDC_EDIT_FileName28,
 IDC_EDIT_FileName29,IDC_EDIT_FileName30,IDC_EDIT_FileName31,IDC_EDIT_FileName32,
   IDC_EDIT_FileName33,IDC_EDIT_FileName34,IDC_EDIT_FileName35,IDC_EDIT_FileName36,
 IDC_EDIT_FileName37,IDC_EDIT_FileName38,IDC_EDIT_FileName39,IDC_EDIT_FileName40,
 IDC_EDIT_FileName41,IDC_EDIT_FileName42,IDC_EDIT_FileName43,IDC_EDIT_FileName44,
 IDC_EDIT_FileName45,IDC_EDIT_FileName46,IDC_EDIT_FileName47,IDC_EDIT_FileName48,
 IDC_EDIT_FileName49,IDC_EDIT_FileName50 };//
     CString fileName[50];
     int m = 0;
    for (m=0;m<50;m++)
{
    GetDlgItemText(edtIDs[m],fileName[m]);
}

    CFile file;                                        //把数据分别存入两个文件中
  BYTE Aboard[400];
BYTE Bboard[400];
                            int n;
     for( n=0;n<800;n++)
{
        if (n<320)
{
Aboard[n]=bufRead[n];
}
     if ((n>319)&&(n<660))
{   
Bboard[n-320]=bufRead[n];
    }
    if ((n>659)&&(n<700))
{   
                                    Aboard[n-340]=bufRead[n];
}
    if ((n>699)&&(n<720))

        Bboard[n-360]=bufRead[n];
}
     if ((n>719)&&(n<740))
{   
Aboard[n-360]=bufRead[n];
}
     if ((n>739)&&(n<760))
{   
Bboard[n-380]=bufRead[n];
}
     if ((n>759)&&(n<780))
{   
Aboard[n-380]=bufRead[n];
}
if ((n>779)&&(n<800))
{   
Bboard[n-400]=bufRead[n];
}
}//for
if(file.Open(fileName[2*i-2]+ L".txt",CFile::modeWrite|CFile::modeCreate)) 
{
file.Seek(0,CFile::end);
file.Write(Aboard,400);    
file.Close();
}
if(file.Open(fileName[2*i-1]+ L".txt",CFile::modeWrite|CFile::modeCreate| CFile::shareDenyNone)) 
{
file.Seek(0,CFile::end);
file.Write(Bboard,400);    
file.Close();
}
}//if }//if
}//for }//if
}//for
}//if
else
{
return FALSE;
}

return TRUE;
}//封装读的函数
BOOL CTestDlg::DeviceRead(BYTE* buffer, DWORD dwSize, DWORD* lpdwBytesRead, DWORD dwTimeout)
{
DWORD tmpReadTO, tmpWriteTO;
SI_STATUS status = SI_SUCCESS; // Save timeout values.
SI_GetTimeouts(&tmpReadTO, &tmpWriteTO); // Set a timeout for the read
SI_SetTimeouts(dwTimeout, 0); // Read the data
status = SI_Read(m_hUSBDevice, buffer, dwSize, lpdwBytesRead);

// Restore timeouts
SI_SetTimeouts(tmpReadTO, tmpWriteTO); return (status == SI_SUCCESS);
}//封装写的函数
BOOL CTestDlg::DeviceWrite(BYTE* buffer, DWORD dwSize, DWORD* lpdwBytesWritten, DWORD dwTimeout)
{
DWORD tmpReadTO, tmpWriteTO;
SI_STATUS status = SI_SUCCESS; // Save timeout values.
SI_GetTimeouts(&tmpReadTO, &tmpWriteTO); // Set a timeout for the write
SI_SetTimeouts(0, dwTimeout); // Write the data
status = SI_Write(m_hUSBDevice, buffer, dwSize, lpdwBytesWritten); // Restore timeouts
SI_SetTimeouts(tmpReadTO, tmpWriteTO); return (status == SI_SUCCESS);
}
这其中当for (int i=0x01;i<0x1a;i++)
{
bufWrite[0]= i;改成for (int i=0x01;i<0x1a;i++)
{
bufWrite[0]= 0x01;时就可以采集数据了,要是不改的话就采集不了数据,这是怎么回事呢???还有就是我想for (int i=0x01;i<0x1a;i++)这个循环每几分钟循环一次,我用了settimer和ontimer做以后不行,是不是我放的位置不对???
请高手帮我看看

解决方案 »

  1.   

    void CTestDlg::OnTimer(UINT nIDEvent) 
    {
    // TODO: Add your message handler code here and/or call default
    // CTestDlg::Acquisition();
    nIDEvent=1;
    CDialog::OnTimer(nIDEvent);

    }
    这是Ontimer的函数
      

  2.   

    可以在for (int i=0x01;i <0x1a;i++) 

    bufWrite[0]= i;
    }设置断点,跟踪看一下,i的值。估计Ox01是十六进制的,到i时自动转化为十进制。
    还有可以在OnTimer()中触发事件,最好写上
    if(1 == nIDEvent)
    {触发事件}
      

  3.   

    这其中当for (int i=0x01;i <0x1a;i++) 

    bufWrite[0]= i;改成for (int i=0x01;i <0x1a;i++) 

    bufWrite[0]= 0x01;时就可以采集数据了,要是不改的话就采集不了数据,这是怎么回事呢???还有就是我想for (int i=0x01;i <0x1a;i++)这个循环每几分钟循环一次,我用了settimer和ontimer做以后不行,是不是我放的位置不对??? 首先 详细的解释下你这段要表达的意思 有点不知所云
    用SetTimer和OnTimer 是应该在需要采集的地方添加SetTimer(1,500,NULL)其中这个500是500ms代表定时器间隔 然后在OnTimer里加入采集的相关操作
      

  4.   

    OnTimer(UINT nIDEvent) 有没有做消息映射?
      

  5.   

    lz的描述真乱使用定时器要满足一下条件
    1. SetTimer设置定时器
    2.OnTimer响应计时器消息
    3.窗口函数链表中必须关联OnTimer响应函数,以便消息派发到OnTimer中
      

  6.   

    楼主要以代码的形式贴出来,要不,乱的看起来会少活一年啊,太费劲了for的前三行中:bufWrite[0]= i; 
    unsigned long bytes_returned=0; 
    memset(bufWrite, 0, 4); 由于后面又使用了memset清空,那行
    bufWrite[0]= i;
    应该就没有实际用处了吧?,楼主仔细地跟踪一下吧,或者以代码的形式贴代码上来,并加上一些注释,方便大家理解
      

  7.   

    我改过了,但是怎么让for循环每隔几分钟循环一次呢
    我这样做也不行:
    BOOL CTestDlg::Acquisition()
    {
    SetTimer(1,60000,NULL); return TRUE;
    }void CTestDlg::OnTimer(UINT nIDEvent) 
    {
    // TODO: Add your message handler code here and/or call default
    if (nIDEvent=1)
    {
    DWORD dwNumDevices = 0;
    SI_DEVICE_STRING devStr;
    SI_STATUS status = SI_GetNumDevices(&dwNumDevices);

    if (status == SI_SUCCESS)
    {
    for (DWORD d = 0; d < dwNumDevices; d++)
    {
    status = SI_GetProductString(d, devStr, SI_RETURN_SERIAL_NUMBER);
    if (SI_Open(d,&m_hUSBDevice)==SI_SUCCESS)
    {
    BYTE bufWrite[MAX_PACKET_SIZE_WRITE];
    BYTE bufRead[MAX_PACKET_SIZE_READ]; for (int i=0x01;i<0x1a;i++)
    {

    unsigned long bytes_returned=0;

    memset(bufWrite, 0, 4);
    bufWrite[0]= i;
    if (DeviceWrite(bufWrite,4,&bytes_returned,1000))

    {
    memset(bufRead,0,800);     
    if (DeviceRead(bufRead,800,&bytes_returned,10000))
    {
          DWORD edtIDs[50] = { IDC_EDIT_FileName01,IDC_EDIT_FileName02,IDC_EDIT_FileName03,IDC_EDIT_FileName04,
     IDC_EDIT_FileName05,IDC_EDIT_FileName06,IDC_EDIT_FileName07,IDC_EDIT_FileName08,
     IDC_EDIT_FileName09,IDC_EDIT_FileName10,IDC_EDIT_FileName11,IDC_EDIT_FileName12,
     IDC_EDIT_FileName13,IDC_EDIT_FileName14,IDC_EDIT_FileName15,IDC_EDIT_FileName16,
     IDC_EDIT_FileName17,IDC_EDIT_FileName18,IDC_EDIT_FileName19,IDC_EDIT_FileName20,
     IDC_EDIT_FileName21,IDC_EDIT_FileName22,IDC_EDIT_FileName23,IDC_EDIT_FileName24,
     IDC_EDIT_FileName25,IDC_EDIT_FileName26,IDC_EDIT_FileName27,IDC_EDIT_FileName28,
     IDC_EDIT_FileName29,IDC_EDIT_FileName30,IDC_EDIT_FileName31,IDC_EDIT_FileName32,
       IDC_EDIT_FileName33,IDC_EDIT_FileName34,IDC_EDIT_FileName35,IDC_EDIT_FileName36,
     IDC_EDIT_FileName37,IDC_EDIT_FileName38,IDC_EDIT_FileName39,IDC_EDIT_FileName40,
     IDC_EDIT_FileName41,IDC_EDIT_FileName42,IDC_EDIT_FileName43,IDC_EDIT_FileName44,
     IDC_EDIT_FileName45,IDC_EDIT_FileName46,IDC_EDIT_FileName47,IDC_EDIT_FileName48,
     IDC_EDIT_FileName49,IDC_EDIT_FileName50 };//
         CString fileName[50];
         int m = 0;
        for (m=0;m<50;m++)
    {
        GetDlgItemText(edtIDs[m],fileName[m]);
    }

        CFile file;                                        //把数据分别存入两个文件中
      BYTE Aboard[400];
    BYTE Bboard[400];
                                int n;
         for( n=0;n<800;n++)
    {
            if (n<320)
    {
    Aboard[n]=bufRead[n];
    }
         if ((n>319)&&(n<660))
    {   
    Bboard[n-320]=bufRead[n];
        }
        if ((n>659)&&(n<700))
    {   
                                        Aboard[n-340]=bufRead[n];
    }
        if ((n>699)&&(n<720))

            Bboard[n-360]=bufRead[n];
    }
         if ((n>719)&&(n<740))
    {   
    Aboard[n-360]=bufRead[n];
    }
         if ((n>739)&&(n<760))
    {   
    Bboard[n-380]=bufRead[n];
    }
         if ((n>759)&&(n<780))
    {   
    Aboard[n-380]=bufRead[n];
    }
    if ((n>779)&&(n<800))
    {   
    Bboard[n-400]=bufRead[n];
    }
    }//for
    if(file.Open(fileName[2*i-2]+ L".txt",CFile::modeWrite|CFile::modeCreate)) 
    {
    file.Seek(0,CFile::end);
    file.Write(Aboard,400);    
    file.Close();
    }
    if(file.Open(fileName[2*i-1]+ L".txt",CFile::modeWrite|CFile::modeCreate| CFile::shareDenyNone)) 
    {
    file.Seek(0,CFile::end);
    file.Write(Bboard,400);    
    file.Close();
    }
    }//if }//if
    }//for }//if
    }//for
    }//if
    }
    /* else
    {
    return FALSE;
    }
    */
    // return TRUE;
    CDialog::OnTimer(nIDEvent);

    }
      

  8.   

    但是程序到SetTimer(1,60000,NULL)这就不动了