发表于:2003-05-25 00:11:00
楼主
我在使用PCI9118DG的过程中又遇到了问题。这是我的程序片断。思路是这样的,采样频率为100k,double buffer设为10000,当存贮点数达到1000000时,换文件名存,同时用DChart显示。可实际采集时出现奇怪现象,就是如果无信号或是信号恒定,则存储显示没有问题,可一旦信号发生变化,显示没问题,可存贮的数据就会掉点。不知道怎么搞得。而且更奇怪的是掉点的dat文件大小和没有掉点的文件大小一样。比如正常的话一个存贮1000000个点的dat文件为1.91M,可掉点的文件大小也为1.91M,可就是转化后点数少了。真是奇怪。
//数据采集及显示线程
UINT CDemo2Dlg::TempThread(LPVOID lpVOID)
{
FILE *streamout=NULL;
BOOLEAN HalfReady;
BOOLEAN fstop;
int n=1;
U32 count=0;
int realnumber;
unsigned long totalnumber=0;
F64* buf1=new F64[data_size/2];
F64* buf2=new F64[data_size/2];
CString num;
CString szFile;
CString findDir;
BOOL bFind=FALSE;
CString m_tempName;
CString m_newFilename;
CDemo2Dlg* dlg=(CDemo2Dlg*) lpVOID;
if (bTofile) //是否存储数据
{
findDir=szDir;
findDir+="*.*";
CFileFind ff;
BOOL res=ff.FindFile(findDir);
while (res)
{
res=ff.FindNextFile();
if ((ff.IsDirectory ())&&(!ff.IsDots())) //是否存在Data目录
if (ff.GetFileName()==m_Filename)
{
bFind=TRUE;
AfxMessageBox("该目录已存在,请输入其他文件名或检查Data目录下的文件!",MB_OK);
ff.Close ();
dlg->m_Start .EnableWindow (TRUE);
dlg->KillTimer (0);
return 1;
}
}
ff.Close();
szDir+=m_Filename;
if (!bFind) //不存在就创建一个采集数据目录
CreateDirectory(szDir,NULL);//当前采集数据所存放目录
szDir+="\\";
m_tempName=m_Filename;
m_newFilename=m_tempName;
m_newFilename+=".dat";
szFile+=szDir;
szFile+=m_newFilename; //把dat文件存在data目录下
if ((streamout=fopen(szFile,"w+t"))==NULL)
{
AfxMessageBox("File error!",MB_OK);
}
fwrite(&AdRange, sizeof(U16),1,streamout); //记录采集卡量程
fwrite(&(dlg->ChanType),sizeof(U16),1,streamout); //记录采集类型
}
if ((err=AI_ContReadChannel(card, 0,AdRange, ai_buf, data_size, (F64)sample_rate, ASYNCH_OP)) != NoError)
{
printf("AI_ContReadChannel error=%d", err);
return -1;
}
data_size /= 2;
while (!clear_op)
{
do {
AI_AsyncDblBufferHalfReady(card, &HalfReady, &fstop);
} while (!HalfReady);
AI_AsyncDblBufferTransfer(card, ai_buf);
if (bTofile)//同时显示并存储
{
if (count<=1000000)
{
//AI_AsyncDblBufferTransfer(card, ai_buf);
AI_ContVScale(0,AdRange,ai_buf,buf1,data_size); //数据转化
for (int i=0;i<data_size;i++)
{
buf2[i]=(buf1[i]+0.173)/0.0143; //转换公式
}
dlg->m_Chart.PlotCharts(&ArrayToVar(buf2, data_size),1, BoolToVar(false));
realnumber=fwrite(ai_buf, sizeof(U16),data_size,streamout);
count+=realnumber;
}
else
{
fclose(streamout); //关闭上一个文件
m_newFilename=m_tempName;
num.Format("%d",n); //文件序号
n++;
m_newFilename+=num;
m_newFilename+=".dat"; //下一个文件名为PCI9118n.dat;
szFile.Empty ();
szFile+=szDir;
szFile+=m_newFilename;
count=0;
if ((streamout=fopen(szFile,"w+t"))==NULL)//打开下一个文件
{
AfxMessageBox("File error!",MB_OK);
}
fwrite(&AdRange, sizeof(U16),1,streamout); //记录采集卡量程
fwrite(&(dlg->ChanType),sizeof(U16),1,streamout); //记录采集类型
}
}
else
{
AI_ContVScale(0,AdRange,ai_buf,buf1,data_size); //卡号为0 ,数据转化
for (int i=0;i<data_size;i++)
{
buf2[i]=(buf1[i]+0.173)/0.0143; //转换公式
}
dlg->m_Chart.PlotCharts(&ArrayToVar(buf2, data_size),1, BoolToVar(false));
}
}
if (streamout!=NULL) fclose(streamout);
delete []buf1;
delete []buf2;
AI_AsyncClear(card, &totalnumber);
return 0;
}
//这是我转化文件格式的程序片断。dat->txt
void CConvertFileDlg::OnStart()
{
// TODO: Add your control notification handler code here
FILE *streamout;
ofstream