如何使用SPCOMM控件(50分)

  • 主题发起人 主题发起人 wmdpeter
  • 开始时间 开始时间
W

wmdpeter

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure TReceiveFrm.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
tmpstr: array [0..2048] of integer;
i: integer;
begin
Move(Buffer^,tmpstr,BufferLength);
for i := 0 to BufferLength-1 do
Memo1.Lines.Add(char(tmpstr));
end;

当接收到一个‘e’时,为什么会收到4个数值。而且没有一个是101,请教,这个控件收到的数据是什么格式的?那位大哥有这个控件详细的开发手册。能否给我一份。
 
1。tmpstr声明为interger数组是有问题的,应该是byte或Char数组
2。你如何保证收到的‘e'没问题,如果发送端有问题呢??
从你的描述,应该是发送端也有问题
把发送的代码贴来看看
 
发送端是MOXA的工具叫PComm Terminal Emulator,实际应用中对方是用C写的,字符是以对应的十进制数发送的。那么这个程序我应该怎么写。
 
同意Avenir, tmpstr设定为string,接收的时候先加上
setlength(tmpstr, BufferLength);
然后
Move(Buffer^,PChar(tmpstr)^,BufferLength);
Memo1.Lines.Add(tmpstr);
memo是可以自动接收的,你不用拉心,我的测试程序就这样做过
 
我刚写的发送程序
procedure TForm1.Button1Click(Sender: TObject);
begin
Comm1.WriteCommData('e',1);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Comm1.StartComm;
end;

我的接收程序
procedure TReceiveFrm.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
tmpstr: string;
i: integer;
begin
setlength(tmpstr, BufferLength);
Move(Buffer^,PChar(tmpstr)^,BufferLength);
for i := 0 to BufferLength-1 do
Memo1.Lines.Add(tmpstr);
end;

跟踪得到的tmpstr数据为'x'#$1E'?'

怎么会这样。
 
是数据类型转换问题。
procedure TForm1.Button1Click(Sender: TObject);
begin
Comm1.WriteCommData('e',1);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Comm1.StartComm;
end;

接收程序
procedure TReceiveFrm.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
tmpstr: char;
i: integer;
begin
setlength(tmpstr, BufferLength);
Move(Buffer^,PChar(tmpstr)^,BufferLength);
for i := 0 to BufferLength-1 do
Memo1.Lines.Add(inttostr(tmpstr));
end;
 
还是不行啊,你写的编译都不过。我改了一下。发送'e'收到的是'x''#30''#248''#248'
 
你不必用数组,spcom不是一个字符一个字符接收的,它是一段一段接收的
 
那就看你怎么定义你接收的数据拉?你定义成char,她就是它了,定义成byte………………
 
>>Memo1.Lines.Add(char(tmpstr));
Memo1.Lines.Add(chr(tmpstr));

 
接收程序这样改:f
procedure TReceiveFrm.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
tmpstr:string;
begin
setlength(tmpstr, BufferLength);
Move(Buffer^,PChar(tmpstr)^,BufferLength);
Memo1.Lines.Add(tmpstr);
end;
如果要得到二进制的话只要这样:
i:=ord(tmpstr);
memo1.lines.add(inttohex(i,2));

 
rx:string
发:
comm1.WriteCommData(Pchar(rx),length(rx));
收:
SetLength(rx,BufferLength);
move(buffer^,Pchar(rx)^,BufferLength);
这样是没问题的。

 
我用了你们这里所有的办法,和我能想到的办法。还是不行啊。那位大哥给我发一个DEMO啊。wmdpeter@hotmail.com
 
unit Unit1;

interface

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

type
TForm1 = class(TForm)
smess: TEdit;
Button1: TButton;
Label2: TLabel;
Comm1: TComm;
Memo1: TMemo;
Label1: TLabel;
Memo2: TMemo;
procedure Button1Click(Sender: TObject);
procedure Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
s1,s2,SendInfo,sendmes:String;
i:integer;
fCheckValue:boolean;
begin
SendInfo:='';
if smess.Text='' then
showmessage('请输入数据!');
s1:=smess.text+',';
fCheckValue:=True;
for i:=1 to length(s1) do
begin
case s1 of
',': begin
case length(s2) of
2: SendInfo:=SendInfo+char(StrToInt('$'+s2));
1: SendInfo:=SendInfo+s2;
0: SendInfo:=SendInfo;
else
fCheckValue:=False;
end;
s2:='';
end
else
s2:=s2+s1;
end;
end;
if fCheckValue then
begin
Memo2.Lines.Add(s1);
comm1.WriteCommData(Pchar(SendInfo),length(SendInfo));
end
else
showmessage('输入数据的格式不正确'#13'信息间采用,区分'#13'注意字符串长度');
end;

procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var rx,s10:string;
i:integer;
begin
SetLength(rx,BufferLength);
move(buffer^,Pchar(rx)^,BufferLength);
for i:=1 to Length(rx) do
begin
s10:=s10+'$'+intToHex(ord(rx),2)+',';
end;
Memo1.Lines.Add(s10);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
try
comm1.StartComm;
except
showmessage('打开串口失败');
end;
end;
end.
===============================================
给你发到邮箱了!
 
呵呵,我也来看看
 
s,ss:string
i:integer;
发:
comm1.WriteCommData(Pchar(s),length(s));
收:
SetLength(s,BufferLength);
move(Buffer^,Pchar(s)^,BufferLength);
ss:='';
for i:=1 to Length(s) do ss:=ss+IntToHex(Byte(s),2);
如果发e,收到65(16进制)
 
nomit我学习了你发给我的程序,我知道该怎么办了。谢谢。
 
后退
顶部