使用spcomm控件,波特率9600,每次接收22个字节,截取其中的第6-21个为有效数据,总共接收2000次,有效数据32K
代码如下
procedure TFmComm.CommDataReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
i:integer;
lBuffer:array[1..maxBuffer] of Byte;
lReceiveResult:array[1..4] of Byte;
viewstring:string;
begin
move(buffer^,lBuffer,bufferlength);//接收数据到缓冲
if (BufferLength>1) and (uppercase(inttohex(lBuffer[1],2))='07') then
begin
if not dataVerify(lBuffer[BufferLength],CalcVerifycode(@lBuffer,BufferLength)) then
begin
viewstring:='';
for i:=1 to BufferLength do
begin
viewstring:=viewstring+inttohex(lBuffer[i],2)+'';
end;
if _IsDebug=1 then
MemComm.Lines.Add(viewstring);
lReceiveResult[1]:=_0B;
lReceiveResult[2]:=strtoint('$'+copy(Fullstr(CommBNo,'0',4),1,2));
lReceiveResult[3]:=strtoint('$'+copy(Fullstr(CommBNo,'0',4),3,2));
lReceiveResult[4]:=CalcVerifyCode(@lReceiveResult,4);
SendAskData(@lReceiveResult,4);
exit;//如果数据校验错,则向仪器发出错误命令请求重发
end;
if not VerifyBNo(inttohex(lBuffer[2],2),inttohex(lBuffer[3],2)) then exit;//仪器编号校验
lReceiveResult[1]:=_0A;
lReceiveResult[2]:=strtoint('$'+copy(Fullstr(CommBNo,'0',4),1,2));
lReceiveResult[3]:=strtoint('$'+copy(Fullstr(CommBNo,'0',4),3,2));
lReceiveResult[4]:=CalcVerifyCode(@lReceiveResult,4);
SendAskData(@lReceiveResult,4);//数据接收成功,请求发下一段数据 OverTimeControl(False,3);//取消超时控制
viewstring:='';
for i:=6 to BufferLength-1 do
begin
allDataBuff[hasDataCount]:=lBuffer[i];
hasDataCount:=hasDataCount+1;
viewstring:=viewstring+inttohex(lBuffer[i],2)+' ';
end;//将本次接收到的数据写入内存
pBar.Position:=hasDataCount-1;
end; if (uppercase(inttohex(lBuffer[1],2))='08') and (BufferLength=4) then
begin
if not dataVerify(lBuffer[BufferLength],CalcVerifycode(@lBuffer,BufferLength)) then exit;
if not VerifyBNo(inttohex(lBuffer[2],2),inttohex(lBuffer[3],2)) then exit;
OverTimeControl(False,3);
pBar.Position:=dataCount;
memComm.Lines.Add('数据接收结束!');
InitialComm;
////以下处理接收到的数据
if _IsDebug=1 then
AcceptData(@allDataBuff,hasdataCount-1)
else
begin
if not dataProcess(@allDataBuff,hasdataCount-1) then exit;
try
DMMain.ConnMain.BeginTrans;
QTestMain.UpdateBatch;
QTestDetail.UpdateBatch;
DMMain.ConnMain.CommitTrans;
except
QTestMain.CancelBatch;
QTestDetail.CancelBatch;
DMMain.ConnMain.RollbackTrans;
showmessage('数据接收失败');
end;
end;
SetBtnEnable(True);
exit;
end;
end;在收到08命令之前我接收完数据大概要到10分钟,这是否有些太长,有什么办法能使之减少的2分钟左右
代码如下
procedure TFmComm.CommDataReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
i:integer;
lBuffer:array[1..maxBuffer] of Byte;
lReceiveResult:array[1..4] of Byte;
viewstring:string;
begin
move(buffer^,lBuffer,bufferlength);//接收数据到缓冲
if (BufferLength>1) and (uppercase(inttohex(lBuffer[1],2))='07') then
begin
if not dataVerify(lBuffer[BufferLength],CalcVerifycode(@lBuffer,BufferLength)) then
begin
viewstring:='';
for i:=1 to BufferLength do
begin
viewstring:=viewstring+inttohex(lBuffer[i],2)+'';
end;
if _IsDebug=1 then
MemComm.Lines.Add(viewstring);
lReceiveResult[1]:=_0B;
lReceiveResult[2]:=strtoint('$'+copy(Fullstr(CommBNo,'0',4),1,2));
lReceiveResult[3]:=strtoint('$'+copy(Fullstr(CommBNo,'0',4),3,2));
lReceiveResult[4]:=CalcVerifyCode(@lReceiveResult,4);
SendAskData(@lReceiveResult,4);
exit;//如果数据校验错,则向仪器发出错误命令请求重发
end;
if not VerifyBNo(inttohex(lBuffer[2],2),inttohex(lBuffer[3],2)) then exit;//仪器编号校验
lReceiveResult[1]:=_0A;
lReceiveResult[2]:=strtoint('$'+copy(Fullstr(CommBNo,'0',4),1,2));
lReceiveResult[3]:=strtoint('$'+copy(Fullstr(CommBNo,'0',4),3,2));
lReceiveResult[4]:=CalcVerifyCode(@lReceiveResult,4);
SendAskData(@lReceiveResult,4);//数据接收成功,请求发下一段数据 OverTimeControl(False,3);//取消超时控制
viewstring:='';
for i:=6 to BufferLength-1 do
begin
allDataBuff[hasDataCount]:=lBuffer[i];
hasDataCount:=hasDataCount+1;
viewstring:=viewstring+inttohex(lBuffer[i],2)+' ';
end;//将本次接收到的数据写入内存
pBar.Position:=hasDataCount-1;
end; if (uppercase(inttohex(lBuffer[1],2))='08') and (BufferLength=4) then
begin
if not dataVerify(lBuffer[BufferLength],CalcVerifycode(@lBuffer,BufferLength)) then exit;
if not VerifyBNo(inttohex(lBuffer[2],2),inttohex(lBuffer[3],2)) then exit;
OverTimeControl(False,3);
pBar.Position:=dataCount;
memComm.Lines.Add('数据接收结束!');
InitialComm;
////以下处理接收到的数据
if _IsDebug=1 then
AcceptData(@allDataBuff,hasdataCount-1)
else
begin
if not dataProcess(@allDataBuff,hasdataCount-1) then exit;
try
DMMain.ConnMain.BeginTrans;
QTestMain.UpdateBatch;
QTestDetail.UpdateBatch;
DMMain.ConnMain.CommitTrans;
except
QTestMain.CancelBatch;
QTestDetail.CancelBatch;
DMMain.ConnMain.RollbackTrans;
showmessage('数据接收失败');
end;
end;
SetBtnEnable(True);
exit;
end;
end;在收到08命令之前我接收完数据大概要到10分钟,这是否有些太长,有什么办法能使之减少的2分钟左右
解决方案 »
- 电子病历保存时候怎么实现保存为XML文件
- 低调发布一个小玩意
- 如何中断线程的ADOQUERY查询?
- delphi7裡面F1Book如何打開excel文件
- 请问如何在程序中调用文件自身关联的程序打开该文件?如word文件用word打开。
- 请问:如何把WebBrowser控件的3D框架变成无以及把它的背景变成透明等?
- &&&&&&&&&高手帮忙改进一下这个控件&&&&&&&&&&&&&&
- fastreport2.47在delphi7里如何安装(在线等)
- 新手提问:如何通过delphi的ADO控件连接sql数据库,谢谢!最好具体一些!
- 请教关于自动化服务器调用的简单问题。谢谢
- 我设了一个窗体,想把他始终在最前显示(有主窗体子窗体的时候)?
- 我想问个有关ADOQuery的问题...
壓縮你的數據, 先將數據壓縮, 再傳送
在SPCOMM的源文件中找到:
INPUTBUFFERSIZE
然后把其定义的数据改大一点。
http://search.csdn.net/Expert/topic/2180/2180220.xml?temp=.7964289