首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

pcomm.dll接收数据有有关问题

2013-07-01 
pcomm.dll接收数据有问题function recvdata(p:Pointer):Integerstdcallvarid:thandlerLen:LongIntPBuf:

pcomm.dll接收数据有问题
function recvdata(p:Pointer):Integer;stdcall
var
  id:thandle;
  rLen:LongInt;
  PBuf:PChar;
  Buf:String;
begin
  Result := 0;
  if endrecvthread = true then exit;
  rlen := sio_iqueue(port);
  PBuf := PChar(StringOfChar(' ',rlen+1));
  rlen := sio_read(Port, PBuf, rlen); //读取数据
  sio_flush(port,0);
  If rlen = 0 Then
  begin
   CreateThread(nil,0,@recvdata,nil,0,id); //若无数据则跳出
   exit;
  end;
  Buf := StrPas(PBuf);
  Buf := Copy(Buf,1,rlen);

  form1.memo1.Text := form1.memo1.Text + buf;
  form1.memo1.SelStart := Length(form1.memo1.Text);
  form1.memo1.SelLength := 0;
  CreateThread(nil,0,@recvdata,nil,0,id);
  exit;
end;

这段代码,当对方发送的是ASCII码时就正常,当对方发送的是HEX时,MEMO1中无任何数据显示,是哪里出问题了?
[解决办法]
function TReceiveDataBase.ToHexString(AStream: TMemoryStream; IsSpace: Boolean): String;
var
  vByte: Byte;
  vSpace: String;
  vSize, iStart: Integer;
begin
  Result := '';
  iStart := 0;
  vSize := AStream.Size;
  while iStart < vSize do
  begin
    move(Pointer((integer(AStream.Memory) + iStart))^, vByte, 1);
    If IsSpace Then vSpace := ' '  else vSpace := '';
    if Result <> '' then Result := Result + vSpace + IntToHex(vByte, 2)
    else Result :=  IntToHex(vByte, 2);
    iStart := iStart + 1;
  end;
end;
//上面是我把十六进制转换为字符串的代码! 你可以根据你自己的修改一下就行了。
[解决办法]
我觉得最好还是直接按BYTE数据读,然后根据通信协议来解释你接收的内容,数据就数据,字符就字符。
呵呵,总觉得这个pcomm.dll串口控件怪怪的,我没用过。我一般用cport,也很多人用spcomm

热点排行