在线等待,我从c++ builder翻译成delphi的代码,编译通过,但得不到正确的结果?(100分)

A

agangr

Unregistered / Unconfirmed
GUEST, unregistred user!
[red]这是c++ builder的代码:[/red]
/////////////////////////////////////
包含库函数的头文件
#ifndef __PLP__
#define __PLP__

#ifdef __cplusplus
extern "C" {
#endif

__declspec(dllimport) int PlpOpen(unsigned int baudrate, unsigned char *inipath);
__declspec(dllimport) void PlpClose();
__declspec(dllimport) int PlpRead(unsigned char *portname, unsigned char *addr, unsigned char *buf, int *readlen);
//__declspec(dllimport) int PlpRead(unsigned char *portname, unsigned char *addr, unsigned char *buf, int readlen);
__declspec(dllimport) int PlpReadAppoint(unsigned char *portname, unsigned char addr, unsigned char *buf, int n);
__declspec(dllimport) int PlpWrite(unsigned char *portname, unsigned char addr, unsigned char *buf, int n);

#ifdef __cplusplus
}
#endif

#endif

////////////////////////////////////

//////////////////////
[blue]下面为调用的code :[/blue]
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop

#include "testmain.h"
#include "plp.h"

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
nump = 0;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::CloseClick(TObject *Sender)
{
Timer1->Enabled = false;
PlpClose();
Start->Enabled = true;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::StartClick(TObject *Sender)
{
int ret;
AnsiString s;

Start->Enabled = false;
ret = PlpOpen(19200);
if(ret!=0)
{
s.sprintf("%d",ret);
ShowMessage("Fail to open com port!/n"+s);
}
Timer1->Enabled = true;
}

//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
int ret1, ret2, readlen;
unsigned char addr, portname[10];
unsigned char rbuf[260]


Timer1->Enabled = false;
Timer1->Interval = 50;

readnext:
ret1 = PlpRead(portname, &amp;addr, rbuf, &amp;readlen);
if( readlen == 0 || ret1 < 0 )
{
Timer1->Enabled = true;
return;
}
do{
ret2 = PlpWrite(portname,addr,rbuf,readlen);
}while( ret2 < readlen);

if( ret1 > 0 ) goto readnext;
Timer1->Enabled = true;
}
//---------------------------------------------------------------------------


//////////////////////////////////////


 
下面是我翻译的delphi代码:

[red]///////////
库声明单元[/red]
unit plp;
{ Interface routine for PLP.DLL }
interface
uses Types;
{$IFNDEF PLP}
{ Declare function with export keyword }

function Plp_Open(Baudrate: dWord): Integer;stdcall;
procedure Plp_close();stdcall;
function Plp_Read(PortName, Addr, Buf: PChar
ReadLen: PInteger): Integer;stdcall
function Plp_Read_Appoint(PortName: PChar
Addr: Char): Integer;stdcall
function Plp_Write(PortName: PChar
Addr: Char
Buf: PChar
WriteLen: Integer): integer;stdcall


{$ENDIF}
implementation
{$IFNDEF PLP}
{ Define the imported function }
function plp_open;external 'plp.dll' name 'PlpOpen';
procedure plp_close;external 'plp.dll' name 'PlpClose';
function plp_write;external 'plp.dll' name 'PlpWrite';
function Plp_Read_Appoint;external 'plp.dll' name 'PlpReadAppoint';
function plp_read;external 'plp.dll' name 'PlpRead'
{$ENDIF}

end.
////////////////
[blue]
调用单元[/blue]
unit test;

interface

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

type
TForm1 = class(TForm)
Panel1: TPanel;
start: TButton;
close: TButton;
Memo1: TMemo;
Timer1: TTimer;
procedure startClick(Sender: TObject);
procedure closeClick(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

uses plp;

{$R *.dfm}

procedure TForm1.startClick(Sender: TObject);
var
ret:integer;
begin

Start.Enabled:=false;
ret:= Plp_Open(19200);
if(ret<>0) then
begin
ShowMessage('Wrong');
exit;
end;
Timer1.Enabled := true;

end;

procedure TForm1.closeClick(Sender: TObject);
begin
Timer1.Enabled := false;
Plp_Close();
Start.Enabled := true;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
ret1, ret2:integer;
readlen:pinteger;
raddr: pchar;
waddr:char;
portname:pchar;
rbuf:pchar;
label ReadNext;
begin
Timer1.Enabled := false;
Timer1.Interval := 50;
raddr:=allocmem(500);
rbuf:=allocmem(260);
portname:=allocmem(100);
new(readlen);
readlen^:=0;
try

readnext :
ret1:=Plp_Read(portname, raddr, rbuf, readlen);
if (ReadLen^ = 0) or (Ret1 < 0) then
begin
Timer1.Enabled := True;
Exit;
end;

repeat
ret2:= Plp_Write(portname,Waddr,rbuf,readlen^);
until ( ret2 < readlen^);

if Ret1 > 0 then goto ReadNext;


finally
dispose(readlen);
freemem(raddr);
freemem(rbuf);
freemem(portname);
end;
Timer1.Enabled := True;
end;


end.
//////////////////////



//////////////////



下面是主要接口函数的原型
int PlpOpen(unsigned long baudrate);
void PlpClose();
int PlpRead(uchar *name, uchar *addr, uchar *buf, int *readlen);
int PlpWrite(uchar *name,uchar addr, unsigned char *buf, int writelen);

主要函数的说明:

l PlpOpen()
函数原型:int PlpOpen(unsigned long baudrate);
功能: 打开plp链路,准备传输数据
参数描述:
baudrate—传输波特率,支持9600和19200
返回: <0—失败
=0—成功

l PlpClose()
函数原型:void PlpClose();
功能: 关闭plp链路
参数描述:无
返回: 无

l PlpRead()
函数原型:int PlpRead(uchar *name, uchar *addr, uchar *buf, int *readlen);
功能: 读取plp收到的数据
参数描述:*name --- 串口名,COM1, COM2, …,接口返回
*addr—接收到数据的源slave地址,接口返回
buf—数据缓冲区
readlen— 本次实际读到的传输包字节数(最大为250)
返回: <0—读操作失败
=0---PLP暂时已没有可读的传输包
>0—表示尚有没读的传输包
注:PlpRead的返回值用于表示是否还有尚未读取的传输包,但不包括本次读到的传输包,本次读到的传输包的字节数由readlen给定。当有尚未读取的传输包时,则处理完本次读到的数据后,可立即调用PlpRead将下一个传输包取出来处理。

l PlpWrite()
函数原型:int PlpWrite(uchar *name, uchar addr, uchar *buf, int writelen);
功能: 向指定的串口,及slave地址发送数据
参数描述:port—PLP号
*name --- 串口号, COM1,COM2,….,应用给定
addr—数据去向的slave地址
buf—数据缓冲区
writelen—数据包含的字节数,应不大于250
返回: <0—失败
>=0—表示实际发送数据的长度。





 
我现在的问题是,用delphi的代码实现始终不能够读到数据,用c++ builder 的却可以,是什么地方不对呢?


 
顶部