为什么超级终端可以,而Spcomm传,返回的就不行了。在线等(50分)

  • 主题发起人 主题发起人 neverdeath
  • 开始时间 开始时间
N

neverdeath

Unregistered / Unconfirmed
GUEST, unregistred user!
用超级终端向手机模块传AT命令,返回OK,ERROR可以,怎么用Spcomm写的就不行了呢,返回的是发出去的问题!!!
 
你的程序有问题,一定是。我用过Spcomm,这个控件没问题。
 
在onReceiveData事件中接收返回数据
 
处理SPComm的Comm1ReceiveData事件中的Buffer和BufferLength即可解决问题。
procedure Comm1ReceiveData(Sender: TObject;
Buffer: Pointer; BufferLength: Word);
 
看看是不是数据流控制的问题,如果数据量过大的话,设置硬件流控制试试
 
我觉得不应该是程序的事情呀,应该是有个地方不对,我发出的东西又原样的回来了,给人的感觉是模块没有处理,我不知道怎么回事,要是返回的话应该是OK或ERROR啊
 
发送的东西很简单,一个命令而已。做的东西在两台机子之间没问题,是不是我发的字符串模块不识别亚
 
你试着发一个简单的命令试试
 
不是那个问题,他就是显示的我发出去的东西,为什么超级终端行呢?我跟超级终端也能通讯呢?那个地方不对头亚,我水平低,刚学,打击不要客气,砖头来吧!要是什么都没反应那倒好说了。哎。。。。。。。。
 
用超级终端发送,实际上在每一次发送时,每一行都跟一个$0D $0A;如果你的程序没有做这种处理的话,一定会出错的。
 
$0D $0A代表什么?我该怎么写呢?
 
把你的代码帖出来,或者给我一份;帮你看看 john20020501@163.com
 
谁让咱水平不行,见笑了
unit Unit3;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, ComCtrls, SPComm;

type
TForm1 = class(TForm)
GroupBox1: TGroupBox;
GroupBox2: TGroupBox;
GroupBox3: TGroupBox;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
ComboBox1: TComboBox;
ComboBox2: TComboBox;
ComboBox3: TComboBox;
Memo1: TMemo;
Memo2: TMemo;
Panel1: TPanel;
Panel2: TPanel;
Button1: TButton;
RadioGroup2: TRadioGroup;
StatusBar1: TStatusBar;
Comm1: TComm;
Label4: TLabel;
ComboBox4: TComboBox;
ComboBox5: TComboBox;
Label5: TLabel;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Comm1Receivedata(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
procedure Form1close(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}


procedure TForm1.FormCreate(Sender: TObject);
begin
memo1.Clear;
memo2.Clear;
combobox1.ItemIndex:=4;
combobox2.ItemIndex:=0;
combobox3.ItemIndex:=0;
combobox4.ItemIndex:=0;
radiogroup2.ItemIndex:=0;
combobox5.ItemIndex:=3;
comm1.StartComm;
end;

procedure TForm1.Button1Click(Sender: TObject);
var i: integer;
str:string;
begin
comm1.CommName:=combobox2.Text;
comm1.BaudRate:=strtoint(combobox1.Text);
comm1.StopBits:=Tstopbits(radiogroup2.ItemIndex);
comm1.Parity:=TParity(combobox4.ItemIndex);
comm1.ByteSize:=TBytesize(combobox5.ItemIndex);

sleep(200);
statusbar1.Panels[1].Text:=comm1.CommName+'正在发送数据';
statusbar1.Panels[2].Text:=comm1.CommName+'正在接受数据';
statusbar1.Refresh;
str:=trim(memo1.Text);
try
comm1.WriteCommData(Pchar(str),Length(str));
except
showmessage('发送错误');
end;


end;



procedure TForm1.Comm1Receivedata(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var recvstr:string;
begin
setlength(recvstr,bufferlength);
Move(buffer^,pchar(recvstr)^,bufferlength);

memo2.Text:=recvstr;
memo2.Invalidate;

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

end.
 
$0D $0A代表回车换行,比如:

'输出完整的一行' + #$0D#$0A
 
恩,试试,感觉不难么好
 
问题:
1). 串口参数只在打开串口前设置一次。即在comm1.StartComm;之前设置好;如果程序运行中间需要修改参数,则应该首先关闭串口->修改参数->打开串口;否则:1,修改参数无效;2,通讯不正常。
2).将发送按钮和打开串口按钮分开。
3).以前在Delphi2.0下我使用过SpComm.还有一些例程,不在手边,如果需要明天给你发一份。
4).调试串口通讯类程序,一般都使用简单的工具,即母的9针串口头,将其2,3用焊锡短接。这样自己接收自己发送的东西,分别调试发送和接受过程。
 
现在我这里有个别人的例子。作个参考吧

  下面,我们结合一个串口通讯的例子来说明SPCOMM的使用。
  为了实现PC与单片机8051之间的通讯,首先要调通它们之间的握手信号,假定它们之间的通讯协议是,PC到8051一帧数据6个字节,8051到PC一帧数据也为6个字节,当PC发出(F0,01,FF,FF,01,F0)后能收到这样一帧(F0,01,FF,FF,01,F0),表示数据通信握手成功,两者之间就可以按照协议相互传输数据。在PC方要发送及接受数据需要以下步骤:
1.创建一个新的工程COMM.DPR,把窗体的NAME属性改为FCOMM,把窗体的标题改为测试通讯,添加控件。
  对COMM1(黑色矩形围住的控件)进行属性设计,设波特率4800,校验位无,字节长度_8,停止位_1,串口选择COM1。Memo1中将显示发送和接受的数据。选择File/Save As将新的窗体存储为Comm.pas。
2.编写源代码
变量说明
var
FCOMM: TFCOMM;
Viewstring:string;
i:integer;
rbuf,sbuf:array[1..6] of byte;
打开串口
procedure TFCOMM.FormShow(Sender: TObject);
begin
comm1.StartComm;
end;
关闭串口
procedure TFCOMM.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 fcomm.comm1.writecommdata(@sbuf,1) then
begin
commflg:=false;
break;
end;
sleep(2); {发送时字节间的延时}
viewstring:=viewstring+inttohex(sbuf,2)+" ";
end;
viewstring:="发送"+viewstring;
fcomm.memo1.lines.add(viewstring);
fcomm.memo1.lines.add("");
if not commflg then messagedlg("发送失败!",mterror,[mbyes],0);
end;
procedure TFCOMM.Btn_sendClick(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($0f); {帧尾}
senddata;{调用发送函数}
end;
接收过程
procedure TFCOMM.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
i:integer;
begin
viewstring:="";
move(buffer^,pchar(@rbuf^),bufferlength);
for i:=1 to bufferlength do
viewstring:=viewstring+inttohex(rbuf,2)+" ";
viewstring:="接收"+viewstring;
memo1.lines.add(viewstring);
memo1.lines.add("");
end;
  如果memo1上显示发送F0 01 FF FF 0F 和 接受F0 01 FF FF F0
这表示串口已正确的发送出数据并正确的接受到数据,串口通讯成功。
 
谢谢,我试试!
 
AT指令结尾要加回车换行,
S:='AT'+CHAR($0D)+CHAR($0A);
 
谢谢大家的支持,CHAR($0D)+CHAR($0A); 和#13+#10 都可以,但是把发出去的东西也返回了
 

Similar threads

后退
顶部