关于串口读写的处理,spcomm控件

newdreamer 2006-04-13 12:17:13
现在

procedure Tmainform.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);

var
i:integer;
returnstr:string;
rbuffer:array[0..Maxsize] of byte;
begin
bufferdatalen:=bufferlength;
if bufferlength<>2 then
begin
move(buffer^,(@rbuffer)^,bufferlength);
hand[0]:=rbuffer[0];
for i:=0 to bufferlength-1 do
begin
inbuffer[i]:=rbuffer[i];
end;
end;
application.ProcessMessages;
end;
===========
function TMainform.rd(chip,AddrHigh,AddrLow,dataLenHigh,dataLenLow:byte):byte;
var
i:integer;
Tbuf:array [0..10] of byte;
checksum:byte;
datalen:word;
begin
hfok:=$55;
bufferdatalen:=0;
DataLen:=DataLenHigh*256+DataLenLow;
Tbuf[0]:=$01;
Tbuf[1]:=$00;
Tbuf[2]:=$ff;
Tbuf[3]:=$01;
Tbuf[4]:=chip;
Tbuf[5]:=AddrHigh;
Tbuf[6]:=AddrLow;
Tbuf[7]:=dataLenHigh;
Tbuf[8]:=dataLenLow;
Tbuf[9]:=Tbuf[0];
for i:=1 to 8 do Tbuf[9]:=Tbuf[9] xor Tbuf[i];
comm1.WriteCommData(pchar(@Tbuf),10);
timedelay(2000,datalen+4);
if bufferdatalen>=datalen+4 then
begin
checksum:=0;
for i:=0 to datalen+3 do
begin
checksum:=checksum xor inbuffer[i];
end;
for i:=3 to datalen+3 do pt[i-3]:=inBuffer[i];
if checksum=0 then
hfok:=$99
else
hfok:=$44;
end;
result:=hfok;
end;

Function TMainform.wr(chip,AddrHigh,AddrLow,dataLenHigh,dataLenLow:byte):byte;
var
i:integer;
buffer:array [0..MaxSize] of byte;
//buffer:array [0..2048] of byte;

datalen:word;
begin
hfok:=$55;
bufferdatalen:=0;
DataLen:=DataLenHigh*256+DataLenLow;
buffer[0]:=$01;
buffer[1]:=$00;
buffer[2]:=$ff;
buffer[3]:=$00;
buffer[4]:=chip;
buffer[5]:=AddrHigh;
buffer[6]:=AddrLow;
buffer[7]:=dataLenHigh;
buffer[8]:=dataLenLow;

for i:=0 to datalen-1 do
begin
buffer[9+i]:=pt[i];
end;
buffer[9+datalen]:=$00;
for i:=0 to datalen+8 do // to datalen+11-1
begin
buffer[datalen+9]:=buffer[datalen+9] xor buffer[i];
end;
comm1.WriteCommData(pchar(@buffer),datalen+10);
timedelay(2000,1);
if bufferdatalen>0 then
if (inbuffer[0]=$99) then
hfok:=$99
else
hfok:=$44;
result:=hfok;
end;
...全文
235 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
luxuewei5214 2006-04-14
  • 打赏
  • 举报
回复
数据接收是控件自己创建单独线程完成的,可是onRecieveData是在什么时候执行的,在哪个线程执行的呢?
ly_liuyang 2006-04-14
  • 打赏
  • 举报
回复
SPCOMM是使用独立线程控制的,要注意哦~
luxuewei5214 2006-04-13
  • 打赏
  • 举报
回复
根据数据量大小,适当缩短延时;或提高波特率,增加传输速度
newdreamer 2006-04-13
  • 打赏
  • 举报
回复
着急,解决了马上给分。
newdreamer 2006-04-13
  • 打赏
  • 举报
回复
有数据接收到缓冲数组的过程,和读写过程。现在是处理速度很慢,需要优化过程,
该怎么解决呀。延迟用的太多了,可不加延迟,就读取不过来数据。
aiirii 2006-04-13
  • 打赏
  • 举报
回复
你的流程感觉处理不好

timedelay(2000,1);
if bufferdatalen>0 then

这样等了很长无畏的时间,spcomm是基于事件机制的,
所以,你应该抽那些处理,发送的代码出来,不要混在一起

最简单的,设一个全局的状态参数,
如 curStatus: integer = 0;

Function TMainform.wr()
begin
case curStatus
0: 发送第一步数据
1: 发送第二步数据
...
end;
end;

procedure Tmainform.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
begin
rd( inbuffer);
end;


function TMainform.rd
begin
case curStatus of
1: 处理第一步应该接收的数据,根据需要,设定 inc(curStatus);
2: 处理第二步应该接收的数据,根据需要,设定 inc(curStatus);
..
1: 处理第n步应该接收的数据,根据需要,设定 curStatus := 0, 从头开始
end;

只是大概给个思路,这样,你就不用每次去等 timedelay(2000,1);

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧