用Spcomm碰到一个很怪异的问题,居然还有加速度(50分)

  • 主题发起人 主题发起人 rovedream
  • 开始时间 开始时间
R

rovedream

Unregistered / Unconfirmed
GUEST, unregistred user!
在接收下位机数据的同时返回数据给下位机.下位机数据量不大时一切正常;
但下位机要是发来的数据比较大时,用Spcomm.WriteCommData返回就很慢,但后面又越来越快

上位机: 请求传送数据
E7 E7 E7 01 07 41 00 00 30 30 04 05 01 01 08 BC

下位机应答 +0.1094 seconds
E7 E7 E7 51 07 41 AA AA B0 00 01 00 9E
继续发送请求数据:第一包
E7 E7 E7 01 07 C0 AA AA B0 00 F4 00 02 00 01 02 06 07 01
16 04 31 DF BF 63 10 01 02 06 07 01 16 04 33 DF
BF 63 10 01 02 06 07 01 16 04 35 DF BF 63 10 01
02 06 07 01 16 04 50 DF BF 63 10 01 02 06 07 01
16 04 51 DF BF 63 10 01 02 06 07 01 16 04 52 DF
BF 63 10 01 02 06 07 01 16 04 53 DF BF 63 10 01
02 06 07 01 16 04 54 DF BF 63 10 01 02 06 07 01
16 04 55 DF BF 63 10 01 02 06 07 01 16 04 56 DF
BF 63 10 01 02 06 07 01 16 05 08 DF BF 63 10 01
02 06 07 01 16 05 10 DF BF 63 10 01 02 06 07 01
16 05 DF BF 63 10 01 02 06 07 01 16 05 12 DF BF
63 10 01 02 06 07 01 16 05 DF BF 63 10 01 02 06
07 03 08 50 21 DF BF 63 10 01 02 06 07 03 08 50
25 DF BF 63 10 01 02 06 07 03 08 50 36 DF BF 63
10 01 02 06 07 03 09 10 39 DF BF 63 10 02 02 06
07 03 09 10 52 DF BF 63 10 02 6F

上位机返回 +9.7188 seconds //居然隔了差不多10秒才返回,不要说我处理数据用时,都没处理,收到后马上返回
E7 E7 E7 51 07 C0 B0 00 AA AA 01 01 1E

下位机 +0.1250 seconds //判断超时,重复发送第一包
E7 E7 E7 01 07 C0 AA AA B0 00 F4 00 02 00 01 02 ççç..Àªª°.ô.....
06 07 01 16 04 31 DF BF 63 10 01 02 06 07 01 16 .....1ß¿c.......
04 33 DF BF 63 10 01 02 06 07 01 16 04 35 DF BF .3ß¿c........5ß¿
63 10 01 02 06 07 01 16 04 50 DF BF 63 10 01 02 c........Pß¿c...
06 07 01 16 04 51 DF BF 63 10 01 02 06 07 01 16 .....Qß¿c.......
04 52 DF BF 63 10 01 02 06 07 01 16 04 53 DF BF .Rß¿c........Sß¿
63 10 01 02 06 07 01 16 04 54 DF BF 63 10 01 02 c........Tß¿c...
06 07 01 16 04 55 DF BF 63 10 01 02 06 07 01 16 .....Uß¿c.......
04 56 DF BF 63 10 01 02 06 07 01 16 05 08 DF BF .Vß¿c.........ß¿
63 10 01 02 06 07 01 16 05 10 DF BF 63 10 01 02 c.........ß¿c...
06 07 01 16 05 DF BF 63 10 01 02 06 07 01 16 05 .....ß¿c........
12 DF BF 63 10 01 02 06 07 01 16 05 DF BF 63 10 .ß¿c........ß¿c.
01 02 06 07 03 08 50 21 DF BF 63 10 01 02 06 07 ......P!ß¿c.....
03 08 50 25 DF BF 63 10 01 02 06 07 03 08 50 36 ..P%ß¿c.......P6
DF BF 63 10 01 02 06 07 03 09 10 39 DF BF 63 10 ß¿c........9ß¿c.
02 02 06 07 03 09 10 52 DF BF 63 10 02 6F .......Rß¿c..o

上位机 (+0.2969 seconds) //这里就快了 0.29秒
E7 E7 E7 51 07 C0 B0 00 AA AA 01 01 1E

下位机 (+0.1406 seconds) //发送第二包
E7 E7 E7 01 07 C0 AA AA B0 00 7C 00 02 00 02 01 ççç..Àªª°.|.....
06 07 03 09 51 12 34 56 10 01 02 06 07 03 10 19 ....Q.4V........
57 DF BF 63 10 02 02 06 07 03 10 21 12 DF BF 63 Wß¿c.......!.ß¿c
10 02 02 06 07 03 10 27 29 DF BF 63 10 02 01 06 .......')ß¿c....
07 03 10 33 31 12 34 56 10 01 01 06 07 03 10 40 ...31.4V.......@
26 12 34 56 10 01 02 06 07 03 05 48 DF BF 63 10 &.4V.......Hß¿c.
02 02 06 07 03 15 37 DF BF 63 10 02 02 06 07 03 ......7ß¿c......
14 19 37 DF BF 63 10 02 01 06 07 03 14 19 53 12 ..7ß¿c........S.
34 56 10 01 39 4V..9

上位机 (+0.0313 seconds) //更快了,0.03秒
E7 E7 E7 51 07 C0 B0 00 AA AA 01 02 1F

后面基本就保持这个返回速度,这是什么原因呢???怎么第一包这么慢,后面还有加速度.看了一下Spcomm源码,看不出什么端倪,请那位对Spcomm熟悉的朋友看看!
 
没有人知道呀?怎么一个回答的都没有呢
 
上位机的问题,注意好处理时间以及所定的协议时间间隔
 
没有处理啊,有处理都放处理线程去了,也没有什么协议时间间隔,收到就返回.我这里收到数据响应很快,但执行到WriteCommData后要很久才能发数据出去.只是第一帧慢,后面越来越快;如果接收到的数据量比较小,一切正常,原以为也是处理部分出了问题,我现在全注释掉了,而且在线程处理也不应该会出现这样的情况
 
同意楼上
 
大家有没有看我的往返数据和时间呢?如果是处理问题,那么返回的每一帧都应该是很慢的,就像是第一帧,用时大概十秒左右,但为什么后面用时又很短呢?而且我已经说过了,在接收到数据后只是简单返回,不是处理耗时问题,而且我在接收事件后也是启动线程返回的,处理也放在线程里面,处理部分我早注释掉了,同样存在这样的情况,所以不是我处理部分的毛病.大家如果手头有条件可以试试,Spcomm确实存在这个问题.
 
大家看看源码吧

//Spcomm接收数据事件
procedure ComPortTest.CommReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
pStr: PChar;
i: DWORD;
begin
pStr:=Buffer;
Dec(PStr);
//转移接收到的数据到自定义数据缓冲
SetLength(OperData.ReadBuff,BufferLength);
for i:=0 to BufferLength-1 do
begin
inc(PStr);
OperData.ReadBuff:=Byte(PSTR^);
end;
IDMSCommandParse; //判断并处理返回
end;

//分支处理
function IDMSCommandParse: integer;
var
MyThread: TReturnThread;
begin
case OperData.ReadBuff[5] of
//......
$C0 : MyThread:=TReturnThread.Create(@Return_Test,0); //启动返回线程
end;
end;

//线程回调
function Return_Test(iMode: integer): integer;
var Buff: Array of Byte;
begin
//处理
{.......
........
........}

SetLength(Buff,13);
Buff[0]:=$E7; Buff[1]:=$E7; Buff[2]:=$E7;
Buff[3]:=$51;
Buff[4]:=$07;
Buff[5]:=$C0;
Buff[6]:=$B0;
Buff[7]:=$00;
Buff[8]:=$AA;
Buff[9]:=$AA;
Buff[10]:=$01;
Buff[11]:=$00;
Buff[12]:=CheckSum(Buff);
CommIDMS.WriteCommData(PChar(Buff), Length(Buff) ); //返回,我接收到数据后马上执行到这里,但Spcomm就是要等10秒才发数据,除了第一帧,后面正常,而且速度越来越快
Buff:=nil;
end;
 
不知道为什么ComPort可以马上返回,而SpComm不行
 
有谁用Spcomm做过大量数据相互传输的例子呢
 
后退
顶部