有用spcomm作过多串口的么??? ( 积分: 200 )

  • 主题发起人 主题发起人 womanlee
  • 开始时间 开始时间
W

womanlee

Unregistered / Unconfirmed
GUEST, unregistred user!
要求:不知道串口个数,同时对多个串口监视,通讯的协议都是一样的,如果作呢?
我的思路是动态创建TComm数组,就是不知道OnReceiveData事件要怎么写??,需要写数据库,写日志.
 
要求:不知道串口个数,同时对多个串口监视,通讯的协议都是一样的,如果作呢?
我的思路是动态创建TComm数组,就是不知道OnReceiveData事件要怎么写??,需要写数据库,写日志.
 
procedure TForm1.FormCreate(Sender: TObject);
begin
comm.OnReceiveData:=CommReceiveData;
end;

procedure TForm1.CommReceiveData(Sender: TObject; Buffer: Pointer;BufferLength: Word);
begin

end;
 
如果我在CommReceiveData中要把接收到的信息写入一个队列 怎么对这个队列进行互斥??还是不需要??
 
根据 Sender: TObject 处理
 
我得意思是 队列是公共的,是另外定义的
 
用临界区
var FCritical:TCriticalSection;
FCritical:=TCriticalSection.Create;创建
FCritical.Free;销毁

FCritical.Enter;进入
...写队列
FCritical.Release;退出
 
var
Rece_Queue: Array[1..2] of String;
comm1, comm2: TComm;

procedure TForm1.FormCreate(Sender: TObject);
begin
comm1 := TComm.Create(Self);
comm1.OnReceiveData := CommReceiveData;
...
comm1.Tag := 1;

comm2 := TComm.Create(Self);
comm2.OnReceiveData := CommReceiveData;
...
comm2.Tag := 2;
end;

procedure TForm1.CommReceiveData(Sender: TObject; Buffer: Pointer;BufferLength: Word);
var
id: Integer;
commx: TComm;
begin
commx := TComm(Sender);
id := commx.Tag;
//这里我直接将数据转为String了。:)
Rece_Queue[id] := strPas(Buffer);
end;
 
在OnReceiveData中用临界区实现对共享资源的访问

procedure TForm1.CommReceiveData(Sender: TObject; Buffer: Pointer;BufferLength: Word);
begin
FCritical.Enter;进入
......
FCritical.Release;退出
end;
 
没有环境,写得比较粗糙,用TList保存你的串口列表,增删都没有问题,所有的结果都保存在一个TStringList里面

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, SPComm, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
FCommList: TList;//串口列表
FRecvList: TStringList;// 结果列表
procedure CommReceiveData(Sender: TObject; Buffer: Pointer; BufferLength: Word);
procedure Process(AIndex: Integer);
public
{ Public declarations }
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

constructor TForm1.Create(AOwner: TComponent);
begin
inherited;
FCommList := TList.Create;
FRecvList := TStringList.Create;
end;

destructor TForm1.Destroy;
var
I : Integer;
begin
for I:= 0 to FCommList.Count - 1 do
TSPComm(FCommList.Items).Free;
FCommList.Free;
FRecvList.Free;
inherited;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
spcomm : TSPComm;
begin
//
spcomm := TSPComm.Create//……
//……
spcomm.tag := FCommList.Count + 1;
spcomm.OnReceiveData:=CommReceiveData;
FRecvList.Add('');
FCommList.Add(spcomm);
end;

procedure TForm1.CommReceiveData(Sender: TObject; Buffer: Pointer;BufferLength: Word);
var
spcomm: TSPComm;
strRecv : string;
begin
setLength(strRecv,BufferLength);
Move(Buffer^,pchar(strRecv)^,BufferLength);

spcomm := TSPComm(Sender);
FRecvList.Strings[spcomm.tag] := FRecvList.Strings[spcomm.tag] + strRecv;
// 添加处理函数
Process(spcomm.tag);
end;

procedure TForm1.Process(AIndex: Integer);
begin
if AIndex > FRecvList.Count then Exit;
//取字符 FRecvList.Strings[AIndex]
end;

end.
 
多人接受答案了。
 
后退
顶部