求助,一个有关串口通讯的问题!

chengxin054 2004-04-05 02:48:27
我用的控件是spcomm。当我发送一帧据之后,等待对方发送校验,当我收到正确校验码,就发送下一帧!我想请问在senddata中怎么写验证方法?

......
procedure senddata;
var
i,temp1: integer;
temp2: integer;
viewint: integer;
begin
viewstring := '';
framecount:=1;

//得到帧长度
textlength := form1.Memo1.Lines.Count-1;
framelength := (textlength+MaxBufLength) div MaxBufLength;
restlength := textlength mod MaxBufLength;

//发送帧
for i:= 1 to framelength do
begin

//发送帧头
if (framecount = 1) then
begin
for temp1 := 1 to 32 do
begin
ydstr:=$AA;
form1.comm1.WriteCommData(@ydstr,1);
end;
end;

//发送@
FrameStart := $40;
form1.Comm1.WriteCommData(@FrameStart,1);

//发送地址
target := $6200;
source := $6100;
form1.Comm1.WriteCommData(@target,2);
form1.Comm1.WriteCommData(@source,2);

//发送帧计数
form1.Comm1.WriteCommData(@framecount,1);

//发送控制命令
Write := $57;
Receive := $52;
form1.Comm1.WriteCommData(@Write,1);
form1.Comm1.WriteCommData(@Receive,1);
UWrite := not Write;
UReceive := not Receive;
form1.Comm1.WriteCommData(@UWrite,1);
form1.Comm1.WriteCommData(@UReceive,1);

//发送帧长
if framecount < framelength then
begin
Write := 128;
form1.Comm1.WriteCommData(@Write,1);
end
else
begin
form1.Comm1.WriteCommData(@restlength,1);
end;

//发送数据帧
//后续帧标志位
//充填位
if (framelength = framecount) then
begin
for temp2 := (framecount-1)*MaxBufLength to ((framecount-1)*MaxBufLength)+restlength do
begin
viewstring := form1.Memo1.Lines.Strings[temp2];
viewint := strtoint(viewstring);
form1.Comm1.WriteCommData(@viewint,1);
end;

flg := $23;
form1.Comm1.WriteCommData(@flg,1);
if((restlength mod 2) = 0) then
begin
tcstate := $00;
form1.Comm1.WriteCommData(@tcstate,1);
end;
end
else
begin
for temp2 := ((framecount-1)*MaxBufLength) to ((MaxBufLength-1)+((framecount-1)*MaxBufLength)) do
begin
viewstring := form1.Memo1.Lines.Strings[temp2];
viewint := strtoint(viewstring);
form1.Comm1.WriteCommData(@viewint,1);
end;
flg := $2A;
form1.Comm1.WriteCommData(@flg,1);
end;

//奇校验
Odd := form1.OddEven(1);

//偶校验
Even := form1.OddEven(0);

//结束符
endstate1 := $13;
form1.Comm1.WriteCommData(@endstate1,1);
endstate2 := $10;
form1.Comm1.WriteCommData(@endstate2,1);

//帧计数;
framecount:=framecount+1;
//等待
sleep(200);
end;
end;

procedure TForm1.BitBtn1_click(Sender: TObject);
begin
senddata;
end;

procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
i,j:integer;
rsbuf: array[1..48] of byte;
ACdata: array[1..48] of byte;
AFdata: array[1..48] of byte;
begin
move(buffer^,pchar(@rsbuf)^,bufferlength);
for i:=1 to bufferlength do
begin
viewstring:=viewstring+inttohex(rsbuf[i],2)+'';
form1.Memo1.Clear;
form1.Memo1.lines.add(viewstring);
end;
end;

end.
...全文
42 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
yurenjf 2004-04-05
  • 打赏
  • 举报
回复
对阿,在OnReceiveData事件里面写才比较合理吧
leeky 2004-04-05
  • 打赏
  • 举报
回复
也许楼主对“事件”的概念理解得还不太清楚。
你的发送与接收应当相对独立,
在接收处理中去验证,以此判断是否要发送下一帧,
还要加一个延时处理通信不正常的情况。
aiirii 2004-04-05
  • 打赏
  • 举报
回复
>>当我发送一帧据之后,等待对方发送校验,当我收到正确校验码,就发送下一帧!我想请问
>>在senddata中怎么写验证方法?
建議在
OnReceiveData
處理接收, 計算檢驗碼, 根據接收內容再發送相應的內容這些操作!

spcomm, 在一個sendData處理你說的東西, 可能麻煩!
火猴 2004-04-05
  • 打赏
  • 举报
回复
up
hmzgz81 2004-04-05
  • 打赏
  • 举报
回复
up

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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