200分求用spcomm接收单片机发送的数据的代码,思路也行。(100分)

  • 主题发起人 主题发起人 caoshangfei99
  • 开始时间 开始时间
C

caoshangfei99

Unregistered / Unconfirmed
GUEST, unregistred user!
200分求用spcomm接收单片机发送的数据的代码,思路也行。顺便帮我看看我的代码,为什么不能接收。。只能发送,却不能接收。。为什么??
procedure TForm1.FormShow(Sender: TObject);
begin
comm1.StartComm;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
close;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
comm1.StopComm;
end;
procedure senddata;

var
i:integer;
commflg:boolean;
begin
viewstring:='';
commflg:=true;
for i:=1 to 6 do
begin
if not form1.comm1.writecommdata(@sbuf,1) then
begin
commflg:=false;
break;
end;
//发送时字节间的延时
sleep(2);
viewstring:=viewstring+inttohex(sbuf,2)+'';
end;
viewstring:='发送'+ viewstring;
form1.memo1.lines.add(viewstring);
if not commflg then messagedlg('发送失败 !' ,mterror,[mbyes],0);
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
sbuf[1]:=byte($f0); //帧头

sbuf[2]:=byte($01); //命令号

sbuf[3]:=byte($ff);

sbuf[4]:=byte($ff);

sbuf[5]:=byte($01);

sbuf[6]:=byte($f0); //帧尾

senddata;//调用发送函数

end;

procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
i:integer;
begin
viewstring:='' ;
move(buffer^,pchar(@rbuf)^,bufferlength);
showmessage(inttostr(bufferlength));
for i:=1 to bufferlength do
begin
viewstring:=viewstring+inttohex(rbuf,2)+'';
end;
viewstring:='接收'+viewstring;
memo1.lines.add(viewstring);
memo1.lines.add('');

end;
procedure TForm1.Comm1ReceiveError(Sender: TObject; EventMask: Cardinal);
begin
memo1.Lines.add('接受数据错误');
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
button1.Click;
end;

end.
为什么我这段代码只执行发送,却不执行接收呢??
 
我也在找
 
晕死。。。
 
ReceiveData事件的触发需要字符串的结束符号,你在单片机侧很可能没有发送这个符号。
这个符号在delphi中为#13#10;
给分吧!!
 
我没有用到单片机,只是在本机模拟,自己发送,自己接收。。那我该怎么改啊??
 
你要是能帮我解决,我肯定给分。
 
sbuf[1]:=byte($f0); //帧头

sbuf[2]:=byte($01); //命令号

sbuf[3]:=byte($ff);

sbuf[4]:=byte($ff);

sbuf[5]:=byte($01);

sbuf[6]:=byte($f0);

sbuf[7]:=byte($00);//加上这个看看

 
一样还是不行,根本就没有执行ReceiveData事件,我快急死了。。。救救我啊。
可以告诉我你的qq吗??谢谢谢谢了。。。
 
本机模拟的话,你是不是用线将com1和com2连接起来了?
 
没有连接起来。需要连接起来?
 
用现成的串口调试软件就可以了!(多串口调试工具)
下载地点:
华军软件园:http://www.onlinedown.net/mcom.htm
http://bj.onlinedown.net/mcom.htm
http://sz.onlinedown.net/mcom.htm
天空软件园:http://www.skycn.com/soft/9280.html
视点软件园:http://www.citytea.com/download/list.Asp?id=854
99软件站: http://www.99soft.com/soft/6820.htm
中国软件: http://www.downme.net/soft_detail.php?nbr=21235
 
检查一下单片机发过来的数据,有没有13、10等的控制码,有的话,你要把SPCOMM的相关
属性去掉,例如XON/XOFF控制码之类的,去掉后就可以了。最好把所有的流量控制属性参
数都关掉。这样就万无一失了。
因为单片机发了这些控制码过来以后,SPCOMM就以为是流控制码,于是就不会触发
ReceiveData事件了。

看来可以给分了。 [:D]
 
请大家接着指教:
1。单片机发送数据后,是不是自动会出发spcomm控件的ReceiveData,如果不能的话,我该怎么判定有
数据发送过来了。
2。单片机一次发送很多字节的数据。spcomm该怎么接收,把连续的四个8bit字节看做一个整体存储。
谢谢各位了。。。
 
单片机发数据来后,自然会触发spcomm的ReceiveData事件,不触发,你也没有办法。

单片机发数据来的时候,基本不会象PC对PC那样一个一个数据包的发的,是连续的发。
最好你就自己定义一个数据包的规则(与硬件结合),类似你说的每4个字节就当一个
正确的数据包也可以,不过你要注意处理有可能硬件发了3个字节就断电不再发数据给
你的话,你就以后收的数据都会乱套了,要处理好啊。我使用的方法是定义数据包头包
尾的方法,当收到$FF就当新的数据包,收到$FE就当数据包已经结束,当然咯,我的数
据包里的真实数据是没有$FF和$FE的。
[:)]
 
rbuf在哪定義的?
 
呵呵,我是新手,说错了别怪。以前用VB做了一个小程序用COMM与交换机接口。
好像comm只能自己检测,在发过来的字符串中加标志位,如回车换行什么的,在COMM中检测到了
这个标志位就读出comm中的数据,并清空。
 
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, SPComm;
type
TForm1 = class(TForm)
Comm1: TComm;
Memo1: TMemo;
procedure Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
s: string;
begin
SetLength(S, BufferLength); //接收RS232的数据并显示Memo1上。
Move(Buffer^, PChar(S)^, BufferLength);
Memo1.Lines.Add(S);
Memo1.Invalidate;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Comm1.startcomm;//创建窗体时,将comm1控件打开。
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
comm1.StopComm;//关闭窗体时,将comm1控件关闭。
end;
end.
 
打开SPComm的代码,找到这个函数
procedure TReadThread.Execute;
注释掉
WAIT_OBJECT_0 + 2: // Read Event signaled.
语句下面的begin和end之间的代码,如下:
代码:
               WAIT_OBJECT_0 + 2: // Read Event signaled.
               begin
              {      //***********此处开始注释*****************
                    // Get the new data!
                    if not HandleReadEvent( @overlappedRead,
                                            szInputBuffer,
                                            INPUTBUFFERSIZE,
                                            nNumberOfBytesRead ) then
                       goto EndReadThread;

                    // Wait for more new data.
                    if not SetupReadEvent( @overlappedRead,
                                           szInputBuffer, INPUTBUFFERSIZE,
                                           nNumberOfBytesRead ) then
                       goto EndReadThread
                    {break;}
                    //***********此处结束注释***************** }
               end;
加了之后编译一次SPComm,可以解决你的问题

 
多亏honeycow对我的帮助。谢谢各位
 
后退
顶部