这是一个数据采集的程序,代码是:
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做以后不行,是不是我放的位置不对???
请高手帮我看看
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做以后不行,是不是我放的位置不对???
请高手帮我看看
{
// TODO: Add your message handler code here and/or call default
// CTestDlg::Acquisition();
nIDEvent=1;
CDialog::OnTimer(nIDEvent);
}
这是Ontimer的函数
{
bufWrite[0]= i;
}设置断点,跟踪看一下,i的值。估计Ox01是十六进制的,到i时自动转化为十进制。
还有可以在OnTimer()中触发事件,最好写上
if(1 == nIDEvent)
{触发事件}
{
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里加入采集的相关操作
1. SetTimer设置定时器
2.OnTimer响应计时器消息
3.窗口函数链表中必须关联OnTimer响应函数,以便消息派发到OnTimer中
unsigned long bytes_returned=0;
memset(bufWrite, 0, 4); 由于后面又使用了memset清空,那行
bufWrite[0]= i;
应该就没有实际用处了吧?,楼主仔细地跟踪一下吧,或者以代码的形式贴代码上来,并加上一些注释,方便大家理解
我这样做也不行:
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);
}