串口通信的一个问题,关于全局变量.各位大侠请指教!!!(100分)

  • 主题发起人 浴火凤凰
  • 开始时间

浴火凤凰

Unregistered / Unconfirmed
GUEST, unregistred user!
unit Unit1;

interface

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

type
TForm1 = class(TForm)
Memo1: TMemo;
Memo2: TMemo;
MSComm2: TMSComm;
procedure FormCreate(Sender: TObject);
procedure MSComm2Comm(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
[red]ss:string;[/red]//定义为全局变量就好好的了.
implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin

mscomm2.commport:=2 ;
mscomm2.settings:='9600,o,7,1';
mscomm2.inputlen:=1;
mscomm2.inputmode:=cominputmodetext;
mscomm2.portopen :=true;
mscomm2.rthreshold:=1;
end;
procedure TForm1.MSComm2Comm(Sender: TObject);
var
buffer:variant;
s1,s2,s3,s4:string;
c:char;
pos1,pos2:integer;

//但是ss定义在这里就不行
begin
case MSComm2.CommEvent of
comEvReceive:
begin
buffer:=mscomm2.input;
s1:=buffer;
c:=s1[1];
ss:=ss+c;
pos1:=pos('<',ss);
pos2:=pos('D',ss);
if (pos1>0) and (pos2>0) then
begin
mscomm2.rthreshold:=0;
s2:=copy(ss,pos1,pos2-pos1+1);
memo1.Lines.Add(s2);

//后面就不用看了,没什么问题.
s3:=copy(s2,2,6);
s4:=chr(10)+'>'+s3+'ok'+' '+'001'+chr(13);
mscomm2.output:=s4;
Memo2.Lines.Add(s4);
ss:='';
mscomm2.rthreshold:=1;
end;
end;

end;
end;
end.


我的目的是接收以"<"开头以'd'结尾的字符串.
现在的问题是这样的 如果 ss定义为全局变量就好好的
但是定义在procedure TForm1.MSComm2Comm(Sender: TObject);
var
这个下面就不行了

 
当然不行
你要在ss里放接受到的一串字符
你的串口控件没收到一个字符就触发一次接收字符的事件,如果ss为局部变量,在收到字符时,ss中是刚收到的字符,过程执行完就释放掉了,下次收到字符,ss又是空的
这里肯定要全局变量的
 
这个问题主要是 'ss' 变量的定义问题

ss好像只在第二个过程里用了
可为什么非要定义为全局变量???
百思不得其解

请各位大侠指教!
 
你不要着急 一会就给你分
ss 要释放???
那你说得 定义为局部变量的话
ss:=ss+c
ss不会递增??

我要理解一下 等一会
 
因为delphi里面没有像VB那以Static声明的静态变量,出了范围就在内存中不存在了,
所以要定义为全局变量或本全局类的私有变量也行,
 
顺便说一句,如果你的ss只在那个过程里用到,这样声明也行:
var
ss : string;
procedure TForm1.MSComm2Comm(Sender: TObject);
begin
ss....
end;
就声明在该过程的上面。
 
已经基本理解,明天就给大家分
还有 一个问题 仍是不很明白
触发一个事件是什么意思??比如说mscomm2.rthreshold:=0;
将不响应接收事件?
望大侠详细解释之.触发一个事件在这里是不是就是通知去接收;
mscomm2.rthreshold:=0
就是不通知去接收了?程序就不自动的去接收了/但还是可以用 input去人工接收??
 
rthreshold为0,收到字符时就不会出发接收事件,你可以读input来接收,但要判断InBufferCount是不是0,是0说明没有数据,>0说明有InBufferCount个字符在接收缓冲区里
你设置的rthreshold应该是1,即每接收到一个字符,就会触发一次接收事件(执行一次你的过程),所以你用局部变量不行
 
多人接受答案了。
 
顶部