各位大侠,现在我正在做一个关于数据采集的上位机,在数据保存时遇到一些问题,希望得到你的热心帮助,在此先行谢过!
我要完成对USB口的数据采集保存以曲线显示,现在完成了采集以及曲线显示,可在数据保存时出了些问题,我把部分程序写下,希望大家帮我看看出出主意。
procedure TForm1.FormCreate(Sender: TObject);beginDevIoHandle :=
CreateFile('\\.\M8usbdrvlv0',generic_read or generic_write,1,nil,3,0,0);
  start:=0;
end;
这里与驱动通信进行数据采集,主要是想在Timer中完成对数据的连续读入,当读到30000个数据后写入txt文档procedure TForm1.Timer1Timer(Sender: TObject);
   var
    rbyte:DWORD   ;
    err:DWORD   ;
     sut:BOOL   ;
     x:Integer ;
     stx :Integer ;
    readData: ARRAY[0..4096] of Byte   ;
     mCount: Integer;
begin //1
readData[0]:=0;
mCount:=0;
sut:=ReadFile  (DevIoHandle,readData,256, rbyte,NIL)  ;
FileHandle := FileCreate('C:\data.txt');//创建文档
if sut=False then
begin
err:= GetLastError  ;
 end ;
   if  rbyte>0 then
  begin 
     for x:=0 to ((rbyte div 4)-1) do
begin  
这里是数据,我想把数据(主要有两个,分别是readData[stx]+readData[stx+1]*256和readData[stx+2]+readData[stx+3]*256 )想把这两个数据不停保存,因为数据一直在更新,当保存30000个后写入data.txt
stx:=4*x;
iPlot1.Channel[0].AddXY(start, readData[stx]+readData[stx+1]*256);
iPlot1.Channel[1].AddXY(start, readData[stx+2]+readData[stx+3]*256);
s1:=Format('%.6d', [readData[stx]+readData[stx+1]*256]);
s2:=Format('%.6d', [readData[stx+2]+readData[stx+3]*256]);
s3:=Format('%.6d', [start]);
sdata:=sdata+s1+'      '+s2+'      '+s3+#13#10;
start:=start+1 ;
end;  
   end   if  start>30000 then
  begin
    FileWrite(FileHandle,sdata[1],Length(sdata));
    start:=0;
    sdata:='';//可我发现这样写程序时,data文档中并没有数据,希望大侠指正
   for x:=0 to 1 do
begin//6
     iPlot1.Channel[x].Clear ();end; end;  end; 

解决方案 »

  1.   

    写文件时,系统并没有立刻写进去,而是先放进缓存里,等有空的时候写。当文件close时,如果还没写进去,系统也会补写一下。到底什么时候写文件,这个我们是不知道的。但我们可以强制性把缓存区的数据立刻写进文件里,那就是使用Flush函数
      

  2.   

    //用TFileStream来读写文件var
      fs : TFileStream;
    begin
      fs := TFileStream.Create('文件路径', fmCreate);
    end;//写文件时
      fs.Write(data, dataSize);