关于mscom中inbuffer问题(20分)

L

liuyj

Unregistered / Unconfirmed
GUEST, unregistred user!
通过COM1通讯,原码如下:
先发命令:#05再以回车结尾,命令结束,
接收时,送回的数据格式:>xx xxxxx xxxx再以回车结束。
Comm1.CommPort := 1;
Comm1.Settings := '4800,N,8,1';
Comm1.InputLen := 0;
Comm1.PortOpen := True;
Comm1.Output := '#05' + Chr(13);
repeat
until Comm1.InBufferCount >=9 ;
instr := Comm1.Input;
Comm1.PortOpen := False;
当Comm1.InBufferCount >=9时,数据接收正确,但当inbuffercount<9时,
只能接收到一部分数据,怎么回事?
 
用的什么构件?
 
对不起!忘记写了!我用的是VB中的Tmscom控件。
 
1发送数据之前应先清空接收缓存区;
2如果接收方没有收到数据,程序进入死循环,应加入超时退出;
或超时数据重发,N次退出。
3如对方发送数据中包含$80到$ff则INPUTMOD应该为二进制方式
收发采用动态数组即可.
 
请问lihao:
until Comm1.InBufferCount >=x x的大小根据什么而定?
 
x应根据通讯规约而定,通常做法是判断帧头后根据规约判定接收数据长度。
 
lihao,能不能说详细一点?谢谢!
 
在Char数组和Variant是不相容的,你不能直接将Char数组赋给Variant,或直接将
Variant给Char数组,否则会出现你所说的错误,下面给出一例子:
(望您满意!)

type
TCharArray=array[0..1] of Char;
PCharArray=^TCharArray;

procedure TForm1.WriteCom(const Buf:array of Char;
var
V:Variant;
P:pCharArray;
i:Integer;
begin
V:= VarArrayCreate([Low(Buf), High(Buf)], varChar);
P := VarArrayLock(V);
try
for i:=Low(Buf) to High(Buf) do P^:=Buf;
finally
VarArrayUnlock(A);
end;
MsComm1.OutPut:=V;
end;

function TForm1.ReadCom(var Buf):Integer;
var
V:Variant;
P:pCharArray;
i:Integer;
begin
V:=MsComm1.Input;
Result:=0;
P := VarArrayLock(V);
try
for i:=VarArrayLowBound(V,1) to VarArrayHighBound(V,1) do
TCharArray(Buf)[i-VarArrayLowBound(V,1)]:=P^;
Result:=VarArrayHighBound(V,1) -VarArrayLowBound(V,1);
finally
VarArrayUnlock(A);
end;
end;

 
接受答案了.
 
最近,经过实验,其实用控件的oncomm事件进行事件中断处理会更好,再次谢谢lihao.
 

Similar threads

S
回复
0
查看
650
SUNSTONE的Delphi笔记
S
S
回复
0
查看
660
SUNSTONE的Delphi笔记
S
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
顶部