MSCOMM的发送和接收(20分)

  • 主题发起人 主题发起人 asmile
  • 开始时间 开始时间
A

asmile

Unregistered / Unconfirmed
GUEST, unregistred user!
我要用MSCOMM发送和接收一组字节;
VAR
buffer:array[0..4] of byte;
buffer_send[0]:=byte(78);
buffer_send[1]:=byte(56);
buffer_send[2]:=byte(34);
buffer_send[3]:=byte(12);
buffer_send[4]:=byte(4);
请问如何发送并且如何接收呢
 
没做过,帮你Up
 
干吗要用mscomm呢,Delphi有很多的串口控件可供选用的
 
记得好像是
mscomm.output:=buffer;
 
不能用output:=buffer的,
提示:
[Error] F_MSComm.pas(100): Incompatible types: 'OleVariant' and 'Array'
 
好像是用VariantToArray还是叫什么名字的一个函数做变换,语句是没有错的,函数名字
记不清楚了。LiChaoHui说的不错,你不该用mscomm,我是在97年写串口程序的时候用的
mscomm,当时没有什么选择,现在delphi下的串口控件太多了,基本都比mscomm强。
题外话:mscomm使用了varient类型,这是一种无类型的数,在VB这样的无类型语言中很好
用,但是delphi是强类型语言,所以必须经过必要的变换(显式的或者隐含的)。
 
这样:
VAR
buffer:array[0..4] of byte;
buffer_send[0]:=byte(78);
buffer_send[1]:=byte(56);
buffer_send[2]:=byte(34);
buffer_send[3]:=byte(12);
buffer_send[4]:=byte(4);
mscomm1.output := chr(buffer_send[0]) + chr(buffer_send[1]) +chr(buffer_send[2]) +chr(buffer_send[3]) +chr(buffer_send[4]);

 
接收时:
下面的代码是接收串口信息的例子。要注意的是MSCOMM的文字属性为二进制。
procedure TForm1.MSComm1Comm(Sender: TObject);
var
Mbuffer:variant;
arr: array of byte;
K_sum:integer;
OutputString:string;
ArrayLength:integer;
begin
arr:=nil;
if mscomm1.CommEvent =2 then begin
mbuffer:=mscomm1.Input
arr:=mbuffer;
if arr=nil then exit;
.
.
.
end;
.
.
.
end;
 

//发送
var
buffer_send:Variant

begin
buffer_send:=VarArrayCreate([0, 4], varVariant)

buffer_send[0]:=78;
buffer_send[1]:=56;
buffer_send[2]:=34;
buffer_send[3]:=12;
buffer_send[4]:=4

mscomm1.Output:=buffer_send

end;


//接受,首先属性InputMode设置成comInputModebinary.

procedure TForm1.MSComm1Comm(Sender: TObject);

var
buffer_receive:Variant

b:array of byte;
i:integer;
begin
buffer_receive:=mscomm1.input

setlength(b,MSComm1.InBufferCount);
for i:=low(b) to high(b) do b:=buffer_receive

end;





 
to sqlai:
mscomm1.Output:=buffer_send
这句话错误提示:
project **.exe raised exception class EOleException with message 'Invalid property value'',
setlength(b,MSComm1.InBufferCount);后low(b)和high(b)都是为0而不管inbuffercount是否为0;
还有假如我要发送大于128的字节收回的都是0,怎么办?

 
>还有假如我要发送大于128的字节收回的都是0,怎么办?

接受问题,发送时对的.

试一下如下测试程序,在delphi5下是没问题的.

unit u_testcomm;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, OleCtrls, MSCommLib_TLB;

type
TForm1 = class(TForm)
MSComm1: TMSComm;
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure MSComm1Comm(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);

//发送
var
buffer_send:Variant;
begin
buffer_send:=VarArrayCreate([0,4], varbyte);
buffer_send[0]:=78;
buffer_send[1]:=56;
buffer_send[2]:=34;
buffer_send[3]:=12;
buffer_send[4]:=4;
mscomm1.output:=buffer_send;
end;



//接受,首先属性InputMode设置成comInputModebinary.

procedure TForm1.MSComm1Comm(Sender: TObject);

var
buffer_receive:Variant;
b:array of byte;
i:integer;
begin
buffer_receive:=mscomm1.input;
setlength(b,MSComm1.InBufferCount);
for i:=low(b) to high(b) do b:=buffer_receive;
end;



procedure TForm1.FormCreate(Sender: TObject);
begin
MSComm1.CommPort:=2;
MSComm1.Settings:='4800,n,8,1';
MSComm1.RThreshold:=5
// 设触发 MSComm1Comm时间的字节数
if MSComm1.PortOpen=False then MSComm1.PortOpen:=true;
MSComm1.InputMode:=comInputModebinary;

end;

end.




 
to sqlai:
我确实是这样写的,但就是会出现上述的问题:
后来我改为
MS_Sent.Output:=chr(buffer_send[0]) + chr(buffer_send[1]) +chr(buffer_send[2]) +chr(buffer_send[3]) +chr(buffer_send[4]);
就没有出问题。还有第二个问题也是这样的,我调试运行了
 
to sqlai:
刚刚又调试了一下,原来是把
buffer_send:=VarArrayCreate([0,4], varVariant);改为
buffer_send:=VarArrayCreate([0,4], varbyte);就对了,
对于第二个问题是,mscomm1.inbuffercount是0
 
试一下

procedure TForm1.MSComm1Comm(Sender: TObject);
var
buffer_receive:Variant;
b:array of byte;
i:integer;
begin
//--
if MSComm1.InBufferCount<5 then exit
//小于预置字节个数则不理,退出
//---
buffer_receive:=mscomm1.input;
setlength(b,MSComm1.InBufferCount);
for i:=low(b) to high(b) do b:=buffer_receive;
end;
 
to sqlai:
如果接收缓冲区中有RTHRESHold个字符才会引起ONCOMM事件的,所以我觉得应该改为这样:
setlength(b,mscomm1.rthreshhold);
 

Similar threads

D
回复
0
查看
925
DelphiTeacher的专栏
D
后退
顶部