有关spcomm的一个奇怪问题(103分,全部家当) (103分)

  • 主题发起人 主题发起人 fifa2000
  • 开始时间 开始时间
F

fifa2000

Unregistered / Unconfirmed
GUEST, unregistred user!
小弟用spcomm做两台pc串口通讯
用一常量数组connectbyte存发送的指令,一字节一字节发送,共5字节
用nextnum做数据序号,用以标示发送的字节在数组中的位置,接收时也想一字节一字节接收

1)spcomm发送数据时是否要先发一个字节用以启动串口?因为
我程序中TfrmMain.Button1Click中发的‘a’接收端一直收不到
2)接收端只能接收到一个字节,为什么?
但我试了以下情况能接受到数据,即在SendDataEmpty中加入注释掉的那行‘showmessage(inttostr (nextnum));‘ 就5字节都收到了
但总不能发一个字节按一下鼠标响应showmessage吧?!大家帮我出出主意,小弟感激不尽。

具体程序如下:

发送端:
procedure TfrmMain.FormCreate(Sender: TObject);
begin
nextnum:=0;
comm1.StopComm;
end;

procedure TfrmMain.Button1Click(Sender: TObject);
begin
comm1.StopComm ;
comm1.StartComm ;
comm1.WriteCommData('a',1);
end;

procedure TfrmMain.Comm1SendDataEmpty(Sender: TObject);
var
ss:byte;
begin
nextnum:=nextnum+1;
ss:=connectbyte[nextnum];
// showmessage(inttostr(nextnum));
if nextnum<=5 then
comm1.WriteCommData(@ss,1);
end;

接收段:
procedure TForm1.FormCreate(Sender: TObject);
begin
i:=0;
comm1.StopComm ;
comm1.StartComm ;
end;

procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
temp:byte;
begin
temp:=byte(buffer^);
i:=i+1;
stringgrid1.Cells[i,1]:=inttostr(temp);
end;
 
谁教教我如何实现一字节一字节发,另一pc一字节一节接收呢?
我到底错在哪呢?
 
检查一下Buffer的长度然后找出你发送的字节的位置.多试验几次就知道了
 
to 老屯:
果然有效,原来是5个子节一起发过去了,不过又有了几个新困惑:
1)如我问题中附的程序 Button1Click事件处理中 去掉最后一行‘comm1.WriteCommData('a',1);‘怎么照样执行senddataempty事件
难道初次打开串口都会触发senddataempty事件?
3)有没有接收到1个字节就在接受端产生onreceivedata事件的方法呢?
 
我认为没有必要追求一字一字的发送, 只要你采用一点程序上的技巧,
就可以解决问题。
我想你是要两PC通讯时“握手” ,只要在两方的ONRECIEVDATA事件中写好握手代
码就行了。
 
你可以用Async32控件,里面有很详细说明(demo),满足你接收到1个字节就在接受端产生onreceivedata事件。

 
to 蒋劲刚:
你说的很对,小弟只不过是想偷懒,spcomm是不是没有接受到一字节就产生中断的方法呢?
再问一个问题:
为什么我的数据只能发送一次,就是程序运行后可成功发送数据。而此后再按发送按钮都不发送,而只发发送按钮中用以启动串口的‘a’,也就是根本不执行
senddataempty中的代码,为什么呀?
我是用一个按钮来触发发送事件,即其click事件中写入 comm1.writedatacomm('a',1); 在senddataempty事件中控制发送数据(具体代码在我的问题里)

 
to 蒋劲刚:
你说的很对,小弟只不过是想偷懒,spcomm是不是没有接受到一字节就产生中断的
方法呢?
再问一个问题:
为什么我的数据只能发送一次,就是程序运行后可成功发送数据。而此后再按发送
按钮都不发送,而只发发送按钮中用以启动串口的‘a’,也就是根本不执行
senddataempty中的代码,为什么呀?
我是用一个按钮来触发发送事件,即其click事件中写入 comm1.writedatacomm
('a',1); 在senddataempty事件中控制发送数据(具体代码在我的问题里)
 
哪位有用spcomm收发的例子给小弟发一个,多谢
xiaoflyfly@263.net
 
如果可以的话,也给我一个
不胜感激!!!
distillbn@263.net
 
有一个问题很有意思,你为什么不把
Comm1SendDataEmpty(Sender: TObject);
里的代码直接写进
Button1Click(Sender: TObject);
里呢
 
请给我一个builder5.0调用SPCOMM控件做串口收发的源程序,小弟将不胜感激。
 
多人接受答案了。
 
我也想求的spcomm控件做串口收发的源程序
谁能给我发一个?
谢谢!
wrc@371.net
 
后退
顶部