一个串口通讯的问题,求高手帮忙解决(300分)

  • 主题发起人 主题发起人 whory
  • 开始时间 开始时间
MSCOM打包时会遇到困难!我深有体会! API函数又太烦!!(我都使用过)
还是SPCOMM最好!!
 
用组件也可以的
 
没有必要使用API写。

尽可能减少不确定性。

如果你还没通讯成功,把你代码贴上来,让大家看看。

如果你通讯成功,却不知道怎么取数据。
发送是先将数据放到MSCOM的INPUT,然后由MSCOMM的机制自己发出的。
接受就是倒过来,将数据从MSCOMM的OUTPUT取出,然后按照协议解析得到你想要的数据。

我没有用过MSCOMM,你看一下我INPUT和output是否倒过来。

SPCOMM不错,关键在于你理解协议,串口知识以及SPCOMM。。。否则也不能写出好点的程序

 
var
pStr:string;
uFact:Uint;
a:integer;
begin
pStr:=char($01);
//呼叫设备(其实就是发送设备的地址码,在这里是"$01")
if not WriteFile(Form1.hCommDev,pStr[1],length(pStr),uFact,nil) then begin
//ShowMessage('失败');
end else begin
//ShowMessage('成功');
end;
//接收缓冲区返回信息
if not ReadFile(form1.hCommDev,pstr,4,uFact,nil) then
showmessage('null')
else
begin
//showmessage(pstr[4]);
//成功接收后发送后续命令包
dcb.Parity :=4; //更改校验码,协议要求,原来是0;
//后续命令包
pStr:=char($7E)+char($02)+char($01)+char($12)+char($34)+char($56)+char($00)+char($63);
if not WriteFile(Form1.hCommDev,pStr[8],length(pStr),uFact,nil) then begin
ShowMessage('null');
end else
begin
//ShowMessage('成功');
//发送命令包后接收缓冲区返回信息
if not ReadFile(form1.hCommDev,pstr,4,uFact,nil) then
showmessage('null')
else
showmessage(pstr[4]);
end;
end;
end;

以上是完整发送一次命令包的过程,但是在第二次发送命令包后设备没有反映,但是缓冲区应该是有信息的,确没有读出来,不知道原因,请各位帮忙看看,谢了
 
你这样当然不行,你写到0串口的是字符型,不是字节,
计算机把你传送的数据都变为一个个字符。你可以用f7查看缓冲里的数据。或者用
snoop监视串口。
 
但是我呼叫设备成功了哦?
现在发现两次发送命令包都有返回信息了,但是就是不知道是啥
如果数据不对的话,是不会通讯成功的哦,比如应该发$01但是发送$02的话,设备是没有反映的
 
function ReadPLC(iAddress:string;iLen:integer):integer;
var
ReceBuff :array[0..99] of Byte; //接收缓冲区
SendBuff :array[0..99] of Byte; //发送缓冲区
s,n,t,e,tt:DWORD;
lpComstat:Comstat;
tLen:integer;
begin
s:=1;
clearbuffer();
s:=readframe(iaddress,iLen);
writefile(Hcom,sendbuff,s,n,0);写
repeat
clearcommerror(HCom,e,@lpComstat);
until lpcomstat.cbOutQue =0;
FlushFileBuffers(HCom);
sleep(100);
readfile(Hcom,ReceBuff,s,n,0) ;读
if s>n then messagebox(0,'操作超时!','信息窗口',mb_OK);
result:=n;
end;
 
哪位大虾能把SPCOMM控件来一个仔细介绍:如何安装,主要特性等。
 
我以前写了一个通过 Com 控制变压器的程序。如果需要,给我来信。

dannygao2000@yahoo.com.cn
 
问题还是没有解决,但是不想拖太久了,我想问题在厂家给的通讯协议上说的不清楚吧,谢谢各位了
 
后退
顶部