[急]关于spcomm时间问题! ( 积分: 20 )

  • 主题发起人 主题发起人 kofoun
  • 开始时间 开始时间
K

kofoun

Unregistered / Unconfirmed
GUEST, unregistred user!
我现在通过spcomm读数据,现有一个时间控件,如果spcomm,5秒内成功收到读入数据,则保存进数据库,否则就提示showmessage,不成功,另外请问一下buffer是怎么初始化它的值的,
因为如果扫描速度一快,数据就连续的放在buffer上,
以下这段代码可以实现数据接收,但我以上的问题还未解决?请教
procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
PStr: PChar;
S: String;

// i: integer;
begin
comm1.StartComm;
PStr := Buffer;
S := String(PStr);
// for i:=0 to bufferlength-1 do
// Pstr:=Pstr;
Memo2.Lines.Add(s);
adoquery2.Close ;
adoquery2.sql.clear ;
adoquery2.SQl.text:='select * from table2';
adoquery2.open;
adoquery2.Append;
adoquery2.FieldByName('no').AsString:=trim(memo2.text);
adoquery2.Post;
 
我现在通过spcomm读数据,现有一个时间控件,如果spcomm,5秒内成功收到读入数据,则保存进数据库,否则就提示showmessage,不成功,另外请问一下buffer是怎么初始化它的值的,
因为如果扫描速度一快,数据就连续的放在buffer上,
以下这段代码可以实现数据接收,但我以上的问题还未解决?请教
procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
PStr: PChar;
S: String;

// i: integer;
begin
comm1.StartComm;
PStr := Buffer;
S := String(PStr);
// for i:=0 to bufferlength-1 do
// Pstr:=Pstr;
Memo2.Lines.Add(s);
adoquery2.Close ;
adoquery2.sql.clear ;
adoquery2.SQl.text:='select * from table2';
adoquery2.open;
adoquery2.Append;
adoquery2.FieldByName('no').AsString:=trim(memo2.text);
adoquery2.Post;
 
不清楚你想要做什么,我想spcomm也是接时刷新来接收数据的。
 
我意思是如果5秒内,spcomm还没有成功收到数据的话,就提示,否则就将收到的数据保存
但我不知道应该在那个事件中写

我想应该在timer中写
if TForm1.Comm1ReceiveData then
showmessage 但不成功
 
你最上面写的程序有错误,comm1.StartComm不应该写到Comm1ReceiveData事件里面,应该先启动comm1.StartComm,然后串口才能收到数据。如果串口有数据才会触发Comm1ReceiveData事件。 另Buffer内保存的是串口收到的内容,不用初始化
 
建立定时器,
发送时将定时器清0
在Comm1ReceiveData事件里如果正确得到结果并定时器时间小于5秒并大于0秒则返回正确
其它情况则按你说的保存!
 
补充下,正确后也要将定时器清0或关闭,等待下步调用!
移动数据用move(......);
 
butcool兄可不可以详细点
 
我串口主要接的是扫描头,主要用来扫描条码,
在扫描头,另一接线处有传感器,当物品触发传感器后,扫描头发射光线,如果5秒内扫描成功,则数据保存,否则提示扫描不正确!
 
做一个5秒定时器,去判断变量(接收成功作正在接收标志),在Comm1ReceiveData事件代码的最后初始化变量(作成功标志)
 
那位仁兄能帮帮手
 
好像扫描条码不是这种做法,用不着用SPCOMM
 
wszysystem兄,请问那是什么方法
 
加一个一秒的计时器,定义全局conter
作 inc(conter);if conter>4 then showmessage();

在spcomm的接收事件里面加conter:=0;
应该就可以了
 
问题是根本没有触发Comm1ReceiveData事件,
能否取得comm1receivedata 的buffer内容,去判断是否为空,如为空就报错,

谁对spcomm事件比较熟悉!
 
不懂你的意思,"根本没有触发Comm1ReceiveData事件"是什么意思?
那你不如用moxa的pcomm 来做,写成线程控制就可以解决了!
 
我觉得没有触发Comm1ReceiveData才是正确的,这说明你没有收到数据!!
 
扫描枪是PS/2口的,就是键盘口。直接扫描,就显示在文本中了,或者edit中了
 
扫描枪是串口的
 
procedure TForm1.COMReceiveData(Sender: TObject; Buffer: Pointer; BufferLength: Word);
var i:integer;
rxbuf:array of byte;
s:string;
begin
setlength(rxbuf,bufferlength);
move(buffer^,rxbuf[0],bufferlength);
ss:='';
for i:=0 to bufferlength-1 do ss:=ss+Char(rxbuf);
RichEdit1.Lines.Add(s);
Timer1.Enabled:=True;
end;
然后在OnTimer事件里写超时报警
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
824
DelphiTeacher的专栏
D
后退
顶部