我现在有SPCOMM二个过程,一个SPCOMM发送过程,另外一个是SPCOMM接收过程,我现在想做成这样当SPCOMM发送数据“12345678......”时,如果说“SPCOMM接收过程”没有数据返回SLEEP(10),等待后“SPCOMM接收过程”没有数据我就循环发送三次,还是没有返回,结束发送,这个应该怎么做呢?谢谢各位指点!!!!
解决方案 »
- acess数据库中,怎样实现将逻辑字段的所有数据记录求反。。。。。。急!
- ++++++++++++++高手帮忙,看看我这个两层和简单树,为什么会出错?++++++++++++++++
- 初學者怎麽去理解多線程技術!又該怎麽去學習使用多線程!希望高手用通俗的語言描述一下!!
- 高分求解,有关查询字段的,分不够可另加
- 做个调查,大家认为计算机本科毕业应该会什么?
- 既有分得,又有好处,赶快进来啊!
- 如何发送一个全局消息让所有的窗体都可以接收的到,怎么发送,怎么接收
- 怎样在几个数中取随机数??
- 请教高手,在WIN2K下怎样获得系统资源呀?
- delphi+spcomm通讯问题
- 关于TClientDataSet控件的applyUpdate更新后刷新的问题
- delphi 实现文件夹(目录/路径)加密
kenshinggg能否给我一个例子呢,刚学DELPHI不久,我代码如下,或者是否能帮我改一下呢?非常感谢!!!!我的spcomm发送过程代码如下procedure TForm1.SendHex(S: String);
var
s2:string;
buf1:array[0..50000] of char;
i:integer;
begin
s2:='';
rsconfir:=0;
for i:=1 to length(s) do
begin
if ((copy(s,i,1)>='0') and (copy(s,i,1)<='9'))
or((copy(s,i,1)>='a') and (copy(s,i,1)<='f'))
or((copy(s,i,1)>='A') and (copy(s,i,1)<='F')) then
begin
s2:=s2+copy(s,i,1);
end;
end;
for i:=0 to (length(s2)div 2-1) do
buf1[i]:=char(strtoint('$'+copy(s2,i*2+1,2)));
//showmessage(char(65));表示ASIC码
Comm1.WriteCommData(buf1,(length(s2) div 2));
end;SPCOMM接收过程如下
procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
i:DWORD;
ReceiveBuffer:PChar;
strSel:TMyStrSel;
j:integer;
s,k:integer;
Rtrueorfalse:boolean;
begin
ReceiveHex:='';
Rfirst:='';
Rtype:='';
Rorder:='';
Rlast:='';
RAll:='';
rsconfir:=1;
Try
ReceiveBuffer:=Buffer;
Dec(ReceiveBuffer);
for i:=0 to BufferLength-1 do
begin
inc(ReceiveBuffer);
ReceiveHex:=ReceiveHex+IntToHEX(Ord(Byte(ReceiveBuffer^)),2);
end;
memo1.Lines.Add('接收的原始数据为:'+receivehex);
Except
on E:Exception do
begin
showmessage(' 异常处理');
end;
end;
end;
procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
i:DWORD;
ReceiveBuffer:PChar;
strSel:TMyStrSel;
j:integer;
s,k:integer;
Rtrueorfalse:boolean;
begin
ReceiveHex:='';
Rfirst:='';
Rtype:='';
Rorder:='';
Rlast:='';
RAll:='';
rsconfir:=1;
Try
ReceiveBuffer:=Buffer;
Dec(ReceiveBuffer);
for i:=0 to BufferLength-1 do
begin
inc(ReceiveBuffer);
ReceiveHex:=ReceiveHex+IntToHEX(Ord(Byte(ReceiveBuffer^)),2);
end;
//**********增加的代码*******************//
if ReceiveHex = '' then
begin
Inc(iSendTimes);
if iSendTimes <= 3 then
begin;
sleep(10);
SendHex('你要发送的数据');
Exit;
end
else
begin
ShowMessage('发送超过三次');
iSendTimes := 0;
end;
end
//**********End*******************//
memo1.Lines.Add('接收的原始数据为:'+receivehex);
Except
on E:Exception do
begin
showmessage(' 异常处理');
end;
end;
end;
procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;BufferLength: Word);这个过程是当SPCOMM串口接收到数据的时候才被运行的。
receivehandle:Thandle;
.......
receivehandle:=createthread(nil,0,@Comm1ReceiveData,nil,0,tid);if receivehandle=0 then showmessage('接收没有数据');
if receivehandle<>0 then showmessage('有数据');我这样做的时候在createthread(nil,0,@Comm1ReceiveData,nil,0,tid);的@Comm1ReceiveData后面提示错误,我估计应该是线程不能调用过程出错,但不知道如何解决,正探索望高手指点。Comm1ReceiveData过程代码在本贴上面有的
WaitForSingleObject等待一定时间
如果等待超时就重发SPComm的OnReceiveData事件里,SetEvent。
是否有例子给我看一下呢?谢谢!!!
发送几个字节等相关的,一般SLEEP(200)以上