Spcomm接收的数据如何在DLL中用Pchar型发出去?(100分)

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

wanbb

Unregistered / Unconfirmed
GUEST, unregistred user!
我想问已经在ReceiveData事件中接收到了261个字符,
我想将它用Pchar类型的函数发给调用者,请问如何解决?
 
你现在问题是转成PCHAR有问题还是发给调用者有问题啊?
 
如果要使用PChar类型的问题:
PChar(myStr)
 
呵呵, 看样子Cut.fei不是像贴子说的那样, [:D][:D]
 
我的Spcomm是在DLL中的,我只要将收到的数据传出去就行了,但我的DLL要给用户用所以要用PChar了,请帮忙解答,分不够可以在加两倍
 
你的意思是想把SPCOMM接收到的数据返回给调用者?
如果这样, 你生命一个引出函数, 大概是这样的, 它负责将数据传出来

function GetData(aData: PChar; aLen: Integer): Integer;
//aData 用于存放返回数据
//aLen 用于传入缓冲区长度
//返回值为实际的数据长度
 
to tseug: 你的思路很好, 是不是在接收事件中将收到的数据赋给aData参数,
然后将function GetData传出去? 我试试先
 
我想 是不是可以直接把ReceiveData(Sender: TObject; Buffer: Pointer; BufferLength: Word);
中的Buffer: Pointer; BufferLength: Word传递出去?
如下设置全局变量: var aBuffer:Pchar; aBuffLen:word;
在事件中直接传出去:
if (有数据) then
begin
aBuffer:=Buffer;
aBuffLen:=BufferLength;
end;
然后就在申明一个引出函数将两个全局变量当成参数传出去.
不知道我这个方法是不是可行呢?
 
你需要另外开辟一个接收队列, 把接收来的数据保存到队列中, 然后通过引出函数
访问这个队列. 如果用你上面的办法, 可能会丢失数据.
 
你的意思是在DLL中将收到的数据先保存在一个Pchar变量,然后再传出去?
我不是很明白你说的队列
 
我原来的做法是将收到的数据转成String然后在引出函数中Result:=Pchar(str),在数据少的时候倒是可以的,
但数据多了(261)就错了
 
因为ReceiveData事件可能会随时触发, 如果你没有来得及处理, 那么数据就丢掉了.
所以, 你要在这个事件里把接收到的数据保存起来, 这样, 即使没有及时调用DLL
他也不会丢失, 为了保存数据, 你应该每次把ReceiveData中收到的数据保存到上次
接收来的数据的尾巴上, 同时计数. 其实这就是一个队列结构. 你可以参考数据结构
教材
 
用回调函数。
在DLL的调用者中定义一个回调,如:
function OnData(aData: PChar; aLen: Integer): Integer;
在DLL内做一个函数将此OnData指针传到DLL内部,一旦Spcomm触发ReceiveData,直接通过OnData回调应用程序进行处理。
此方法不需要在DLL建缓冲池。
 
一般情况下只有我这里发了数给串口才会返回数据的,我想可以不用考虑吧,
我只想知道如何安全的把DLL中收到的数据传到调用者, 这个问题已经困扰我几天了,拜托
 
如果像你说的那样可以简化....
 
我试过了,数据短的时候可以,但多就不对了,我就是这样的,下面是我写的DLL:
Function Read(Baud_Rate:Integer;Set_Port:PChar;out aData:pchar):integer;StdCall;

var rdata:Pchar; //全局变量

在Spcomm的onReceiveDat事件中:
begin
if 有数据 then
begin
... //将收到的数据换成String型
rdata:=Pchar(String)
end;
end;

Function Read(Baud_Rate:Integer;Set_Port:PChar;out aData:pchar):integer;StdCall;
begin
...
getmem(rdate,290); //在数据短的时候可以不要,长了就要不然什么也看不到,但会出现乱码
aData:=Rdata;
end;

在程序中直接调用:
var i:integer;
i:=Read(i,P,P1);
Edit1.text:=p1;

但数据长了就不行了 会有乱码出现 反复试收几次有几下能显示出后面一点数据 为什么?
 
那还是用我说的办法吧,用队列
 
SPCOMM好像在WIN2000下有问题,我现在用CPortLib。
 
太久了,结束吧[^]
 
后退
顶部