如果不是大数据量传递,可以参考我的代码。 1:接收代码: procedure TForm1.Comm1Comm(Sender: TObject); var inputlength:integer; p:POleVariant; btest:olevariant; begin //收到 Rthreshold 个字符。该事件将持续产生直到用 Input 属性从接收缓冲区中删除数据。 if (comm1.CommEvent=2) then begin inputlength:=comm1.inbuffercount; btest:= VarArrayCreate([0,inputlength-1], varByte); btest:=comm1.input; //1:接收数据 p:=VarArrayLock(btest); try move(p^,M.ReceiBuff[M.Recei_Total],inputlength); M.Recei_Total:=M.Recei_Total+inputlength; finally VarArrayUnlock(btest); end; end; 2:发送代码 ShortPacketLen:=1039 function SendShortPacket(PacketConent:byte):integer; //发送短控制信息帧,PacketLen个PacketConent, var i:integer; shortoutole:olevariant; begin shortoutole := VarArrayCreate([0,ShortPacketLen-1], varByte); for i:=0 to ShortPacketLen-1 do shortoutole[i]:=PacketConent; //PacketConent Form1.comm1.output:=shortoutole; repeat application.ProcessMessages ; until Form1.comm1.outBufferCount=0; result:=1; end; 3:MSCOMM的设置: MSCOMM以设置成二进制方式 comm1.CommPort :=Form_Comsele.RadioGroup1.ItemIndex+1 ; ; comm1.DTREnable :=true; comm1.RTSEnable :=true; comm1.Settings :=Form_Comsele.RadioGroup3.Items.Strings[Form_Comsele.RadioGroup3.ItemIndex]+',N,8,1'; comm1.InBufferSize :=2048; comm1.OutBufferSize :=4096; comm1.InBufferCount :=0; //清除缓冲区 comm1.OutBufferCount :=0; //清除缓冲区 //comm1.SThreshold :=1; //发送缓冲区数据全部发送完时,触发 //comm1.InputLen :=1; //每次接受一个字符 comm1.InputLen :=0; //每次读空缓冲区 comm1.SThreshold :=0; //发送缓冲区数据全部发送完时,禁止触发 comm1.RThreshold :=1; //收到一个字符,触发一次 comm1.PortOpen:=true; comm1.Output:='ATQ0E0V1W0S0=1&C1&D2&K3'+chr(13)+chr(10); //
//发送二制数组 var outByte:array of byte; i:integer; begin setlength(outByte,200); for i:=1 to 200 do outByte[i]:=i;//i就是要发送的值 mscomm1.output:=outByte; end; //接收二制数组mscomm1.inputmode:=1; var inByte:array of byte; i:integer; t:integer; begin inbyte:mscomm1.input; t:=varArrayhighbound(inbyte); for i:=0 to t do r:=inbyte[i];//取出接收的字节进行处理 end;
1:接收代码:
procedure TForm1.Comm1Comm(Sender: TObject);
var
inputlength:integer;
p:POleVariant;
btest:olevariant;
begin
//收到 Rthreshold 个字符。该事件将持续产生直到用 Input 属性从接收缓冲区中删除数据。
if (comm1.CommEvent=2) then
begin
inputlength:=comm1.inbuffercount;
btest:= VarArrayCreate([0,inputlength-1], varByte);
btest:=comm1.input;
//1:接收数据
p:=VarArrayLock(btest);
try
move(p^,M.ReceiBuff[M.Recei_Total],inputlength);
M.Recei_Total:=M.Recei_Total+inputlength;
finally
VarArrayUnlock(btest);
end;
end;
2:发送代码
ShortPacketLen:=1039
function SendShortPacket(PacketConent:byte):integer;
//发送短控制信息帧,PacketLen个PacketConent,
var
i:integer;
shortoutole:olevariant;
begin
shortoutole := VarArrayCreate([0,ShortPacketLen-1], varByte);
for i:=0 to ShortPacketLen-1 do shortoutole[i]:=PacketConent; //PacketConent
Form1.comm1.output:=shortoutole;
repeat
application.ProcessMessages ;
until Form1.comm1.outBufferCount=0;
result:=1;
end;
3:MSCOMM的设置:
MSCOMM以设置成二进制方式
comm1.CommPort :=Form_Comsele.RadioGroup1.ItemIndex+1 ; ;
comm1.DTREnable :=true;
comm1.RTSEnable :=true;
comm1.Settings :=Form_Comsele.RadioGroup3.Items.Strings[Form_Comsele.RadioGroup3.ItemIndex]+',N,8,1';
comm1.InBufferSize :=2048;
comm1.OutBufferSize :=4096;
comm1.InBufferCount :=0; //清除缓冲区
comm1.OutBufferCount :=0; //清除缓冲区
//comm1.SThreshold :=1; //发送缓冲区数据全部发送完时,触发
//comm1.InputLen :=1; //每次接受一个字符
comm1.InputLen :=0; //每次读空缓冲区
comm1.SThreshold :=0; //发送缓冲区数据全部发送完时,禁止触发
comm1.RThreshold :=1; //收到一个字符,触发一次
comm1.PortOpen:=true;
comm1.Output:='ATQ0E0V1W0S0=1&C1&D2&K3'+chr(13)+chr(10); //
var
outByte:array of byte;
i:integer;
begin
setlength(outByte,200);
for i:=1 to 200 do
outByte[i]:=i;//i就是要发送的值
mscomm1.output:=outByte;
end;
//接收二制数组mscomm1.inputmode:=1;
var
inByte:array of byte;
i:integer;
t:integer;
begin
inbyte:mscomm1.input;
t:=varArrayhighbound(inbyte);
for i:=0 to t do
r:=inbyte[i];//取出接收的字节进行处理
end;