哪位大侠有多机通讯的原程序,是PC与单片机的通讯程序(我的所有家产俸上200分)(200分)

  • 主题发起人 主题发起人 201
  • 开始时间 开始时间
2

201

Unregistered / Unconfirmed
GUEST, unregistred user!
程序能够与多个单片机进行通信,我是采用的查询式,可接收不到数据。急哪!!!
 
你发送和接收的数据包里应该设置地址,不同的地址对应不同的单片机
 
我的程序步骤是,每隔一定时间发送一个命令,发送完一个命令后等进入等待状态,
下位机发一确认命令后,不是确认命令则开计时器。如是通过命令,则我发一个取数命令,
接完数据后,我再把计时器打开,是这样循环的,不知有没错。



FindOrder[1] :=$22;FindOrder[2]:=$23;FindOrder[3]:=$24;FindOrder[4]:=$25;
NowOrderIndex:=1;








procedure Tfrm_test.Comm2ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
CommFlag:boolean;
i:integer;
str:string;
begin
commflag:=true;
str:='';
move(buffer^,pchar(@ReceiveData)^,BufferLength);
for i:=1 to bufferlength do str:=str+inttohex(receivedata,1);
image1.Canvas.TextOut(10,y,str);
if y>270 then
begin
y:=10;
image1.Canvas.brush.color:=$00FEB483;
image1.Canvas.FillRect(image1.clientRect);
end
else y:=y+15;
application.ProcessMessages;
if receivedata[1] = $A3 then
begin
sbuf[1]:=$7f;
if comm2.WriteCommData(@sbuf[1],1) = false then commflag := false;
sleep(2);
if not commflag then MessageDlg('发送出错信息出信,请检查通信线路',mterror,[mbYes],0);
end
else
begin
sbuf[1]:=rightOrder;
if comm2.WriteCommData(@sbuf[1],1) = false then commflag := false;
sleep(2);
if not commflag then MessageDlg('发送出错信息出信,请检查通信线路',mterror,[mbYes],0);
timer3.Enabled:=true;
end;
end;



procedure Tfrm_test.Comm2ReceiveError(Sender: TObject;
EventMask: Cardinal);
begin
try
case EventMask of
CE_BREAK: showmessage('CE_BREAK');
CE_DNS: showmessage('CE_DNS');
CE_FRAME: dealError;
CE_IOE: showmessage('CE_IOE');
CE_MODE: showmessage('CE_MODE');
CE_OOP: showmessage('CE_OOP');
CE_OVERRUN: showmessage('CE_OVERRUN');
CE_PTO: showmessage('CE_PTO');
CE_RXOVER: showmessage('CE_RXOVER');
CE_RXPARITY:BEGIN
DealError;
END;
CE_TXFULL: showmessage('CE_TXTULL');
end;
except showmessage(' deal error miss the error');
end;
end;






procedure Tfrm_test.Timer3Timer(Sender: TObject);
var
commflag:Boolean;
begin
commflag:=true;
timer3.Enabled := false;
OrderNum :=1;
sbuf[1]:= findOrder[NowOrderIndex];
image1.canvas.TextOut(0,0,inttostr(noworderIndex));
application.ProcessMessages;
if NowOrderIndex = 4 then NowOrderIndex:=1
else NowOrderIndex := NowOrderIndex+1;
if comm2.WriteCommData(@sbuf[1],1) = false then commflag := false;
sleep(2);
if not commflag then MessageDlg('发送出错信息出信,请检查通信线路',mterror,[mbYes],0);
end;
















 
你用的是Spcomm控件吧,我没有时间仔细看你的代码。你的思路应该说没有什么问题。
你可以先用一台单片机进行调试,看能否收发,若不行,则试试自发自收调试。
另外,你没必要等什么确认命令,发送和接收的数据加个CRC什么的校验就行了,就可
以直接发送去数据命令(校验后的数据出错率较低)
 
我是半路出家,CRC不懂,只会奇偶校验,我不知道另外一个同事编的下位机是否出了问题,
所以最好有下位的实例给我看一下就好了。
 
那你就自发自收,若你发送与接收的数据相吻合,则说明你的发送和接收都没有问题,否则
你就得查看到底是接收问题还是发送问题了(这些代码可以说是死的,应该没什么错吧)。
下位机的实例?你要来干什么?若你自发自收对了,那就是单片机的问题,否则你要来也没用
 
有用那,给我同事参考参考,能否发一份给小弟那
 
怎么不好给分那
 
moucanbin@sina.com
 
帮忙哪,那位大侠发一份给我看看吧。急哪?拜托,拜托。
 
多人接受答案了。
 
哈哈,是否认识洪龙
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部