N
netsnowfly
Unregistered / Unconfirmed
GUEST, unregistred user!
我现在在调试一台西门子的变频器uss协议,采用rs232转rs485,delphi spcomm串口编程
现在的情况是数据发送以后没有接受到反应!com1端口
程序代码如下大家帮忙看看:
var
Form1: TForm1;
Viewstring : string;
i:integer;
j:integer=1;
rbuf,sbuf:array[1..14] of byte;
commflg:boolean;
rP:^integer;
bcc:string;
bcccode:byte;
xorresult:integer;
const
resendcount:integer=5;
procedure SendData;
var
i:integer;
begin
viewstring:=' ';
commflg:=true;
for i:=1 to 14 do
begin
if not form1.comm1.writecommdata(@sbuf,1) then
begin
commflg:=false;
break;
end;
sleep(2); {发送时字节间的延时} //对于西门子的uss协议这里要不要考//虑报文超时啊,这里sleep(2)对不对啊?
viewstring:=viewstring+inttohex(sbuf,2)+' ';
end;
viewstring:='发送'+viewstring;
form1.memo1.lines.add(viewstring);
form1.memo1.lines.add('');
if not commflg then
begin
sleep(2000); //发送失败时延时2秒再发5次
if j<> resendcount then
begin
inc(j);
senddata;
end;
if j=resendcount then //发送5次以后都失败则显示失败
begin
showmessage('发送失败!');
j:=1;
application.ProcessMessages;
exit;
end;
end;
end;
procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
i:integer;
checkbcc:integer;
count:integer;
begin
checkbcc:=0;
viewstring :='';
rP := @rbuf;
move(buffer^,pchar(rP^),bufferlength);
for i:=1 to bufferlength do begin
count:=i;
if count <> bufferlength then
checkbcc:= checkbcc xor rbuf ; //计算bcc码
viewstring :=viewstring+inttohex(rbuf,2)+'';
end;
if checkbcc=rbuf[bufferlength] then
begin
viewstring:='接受'+viewstring;
memo1.lines.add(viewstring);
memo1.lines.add('');
end
else //出错了
begin
end;
end;
procedure getbcc ; //异或取得bcc校验码的过程 验证报文的正确性
begin
xorresult:=0;
for i:=1 to 13 do
xorresult:= xorresult xor sbuf ;
bcccode:=byte(xorresult);
sbuf[14]:=bcccode; {帧尾}
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
sbuf[1]:=byte($02); {帧头}
sbuf[2]:=byte($0c); {命令号}
sbuf[3]:=byte($01);
sbuf[4]:=byte($00);
sbuf[5]:=byte($00);
sbuf[6]:=byte($00);
sbuf[7]:=byte($00);
sbuf[8]:=byte($00);
sbuf[9]:=byte($00);
sbuf[10]:=byte($0c);
sbuf[11]:=byte($7f);
sbuf[12]:=byte($20);
sbuf[13]:=byte($00);
getbcc;
senddata;{调用发送函数}
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
sbuf[1]:=byte($02); {帧头}
sbuf[2]:=byte($0c); {命令号}
sbuf[3]:=byte($01);
sbuf[4]:=byte($00);
sbuf[5]:=byte($00);
sbuf[6]:=byte($00);
sbuf[7]:=byte($00);
sbuf[8]:=byte($00);
sbuf[9]:=byte($00);
sbuf[10]:=byte($04);
sbuf[11]:=byte($76);
sbuf[12]:=byte($00);
sbuf[13]:=byte($00);
getbcc;
senddata;{调用发送函数}
end;
整个程序是在win98下调试的,要不要在系统硬件管理器,串口属性里设置什么东西啊?
还有对于uss协议,spcomm属性里要不要做一下设计?有没有人有用spcomm写与西门子变频器通讯的经验的啊?
现在的情况是数据发送以后没有接受到反应!com1端口
程序代码如下大家帮忙看看:
var
Form1: TForm1;
Viewstring : string;
i:integer;
j:integer=1;
rbuf,sbuf:array[1..14] of byte;
commflg:boolean;
rP:^integer;
bcc:string;
bcccode:byte;
xorresult:integer;
const
resendcount:integer=5;
procedure SendData;
var
i:integer;
begin
viewstring:=' ';
commflg:=true;
for i:=1 to 14 do
begin
if not form1.comm1.writecommdata(@sbuf,1) then
begin
commflg:=false;
break;
end;
sleep(2); {发送时字节间的延时} //对于西门子的uss协议这里要不要考//虑报文超时啊,这里sleep(2)对不对啊?
viewstring:=viewstring+inttohex(sbuf,2)+' ';
end;
viewstring:='发送'+viewstring;
form1.memo1.lines.add(viewstring);
form1.memo1.lines.add('');
if not commflg then
begin
sleep(2000); //发送失败时延时2秒再发5次
if j<> resendcount then
begin
inc(j);
senddata;
end;
if j=resendcount then //发送5次以后都失败则显示失败
begin
showmessage('发送失败!');
j:=1;
application.ProcessMessages;
exit;
end;
end;
end;
procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
i:integer;
checkbcc:integer;
count:integer;
begin
checkbcc:=0;
viewstring :='';
rP := @rbuf;
move(buffer^,pchar(rP^),bufferlength);
for i:=1 to bufferlength do begin
count:=i;
if count <> bufferlength then
checkbcc:= checkbcc xor rbuf ; //计算bcc码
viewstring :=viewstring+inttohex(rbuf,2)+'';
end;
if checkbcc=rbuf[bufferlength] then
begin
viewstring:='接受'+viewstring;
memo1.lines.add(viewstring);
memo1.lines.add('');
end
else //出错了
begin
end;
end;
procedure getbcc ; //异或取得bcc校验码的过程 验证报文的正确性
begin
xorresult:=0;
for i:=1 to 13 do
xorresult:= xorresult xor sbuf ;
bcccode:=byte(xorresult);
sbuf[14]:=bcccode; {帧尾}
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
sbuf[1]:=byte($02); {帧头}
sbuf[2]:=byte($0c); {命令号}
sbuf[3]:=byte($01);
sbuf[4]:=byte($00);
sbuf[5]:=byte($00);
sbuf[6]:=byte($00);
sbuf[7]:=byte($00);
sbuf[8]:=byte($00);
sbuf[9]:=byte($00);
sbuf[10]:=byte($0c);
sbuf[11]:=byte($7f);
sbuf[12]:=byte($20);
sbuf[13]:=byte($00);
getbcc;
senddata;{调用发送函数}
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
sbuf[1]:=byte($02); {帧头}
sbuf[2]:=byte($0c); {命令号}
sbuf[3]:=byte($01);
sbuf[4]:=byte($00);
sbuf[5]:=byte($00);
sbuf[6]:=byte($00);
sbuf[7]:=byte($00);
sbuf[8]:=byte($00);
sbuf[9]:=byte($00);
sbuf[10]:=byte($04);
sbuf[11]:=byte($76);
sbuf[12]:=byte($00);
sbuf[13]:=byte($00);
getbcc;
senddata;{调用发送函数}
end;
整个程序是在win98下调试的,要不要在系统硬件管理器,串口属性里设置什么东西啊?
还有对于uss协议,spcomm属性里要不要做一下设计?有没有人有用spcomm写与西门子变频器通讯的经验的啊?