function hex(c:char):Integer ;
var
      x:integer;
begin
     if c=' ' then
        x:=0
     else if (Ord(c)>=ord('0')) and (Ord(c)<=ord('9')) then
        x:=Ord(c)-Ord('0')
     else if (Ord(c)>=ord('a')) and (Ord(c)<=ord('f')) then
        x:=Ord(c)-Ord('a')+10
     else if (Ord(c)>=ord('A')) and (Ord(c)<=ord('F')) then
        x:=Ord(c)-Ord('A')+10
     else
        //输入错误
        x:=-1;
      Result:=x;
end;//该函数接收1个至2个字符
//转换成功.输出对应16进制数的值
//转换失败.输出-1。
function HexToInt(S:String): Integer;
var
    tmpInt1,tmpInt2:Integer ;
begin
   if Length(S)=1 then
   begin
      Result:=hex(S[1]);
   end
   else if Length(S)=2 then
   begin
      tmpInt1:=hex(S[1]);
      tmpInt2:=hex(S[2]);
      if (tmpInt1=-1) or (tmpInt2=-1) then
          Result:=-1
      else
          Result:= tmpInt1*16+tmpInt2;
      end
    else
        //输入错误,转换失败    
        Result:=-1;
end;procedure TForm1.MSComm1Comm(Sender: TObject);
{var
  serialinput:variant;
  serialdatalength:integer;
  i,tmpint:integer;
  inputstring:string;
begin
      if MSComm1.CommEvent=ComEvReceive then
      begin
        serialdatalength:=mscomm1.InBufferCount;
        serialinput:=MSComm1.Input;
        InputString:='';
        for i:=0 to serialdatalength-1 do
        begin
          tmpInt:=serialinput[i];
          InputString:=InputString+' '+LowerCase(IntToHex(tmpint,2));
        end;
      end;
     memo1.Lines.Add(InputString); }
var
    i,InputLen:Integer;
    tmpInt:Integer;
    tmpvar:Variant;
    InputString:String;begin
    if MSComm1.CommEvent=ComEvReceive then
    begin
        InputLen:=MSComm1.InBufferCount;        //接收二进制数据,转换为十六进制显示
        if HexShow.Checked then  //如果不按16进制就可以显示,但显示的都是乱码
        begin
          tmpvar:=MSComm1.Input;
          InputString:='';
          for i:= 0 to InputLen-1 do
          begin
            tmpInt:=tmpvar[i];//(在这里提示错)
            InputString:=InputString+' '+LowerCase(IntToHex(tmpint,2));
          end;
        end
        //直接接收字符
        else begin
            InputString:=MSComm1.Input;  //如果不按16进制就可以显示,但显示的都是乱码
        end;
        memo1.Text :=memo1.Text +InputString;
    end; 
end;
这是代码!请高手指教,试过N次了,用了Mscomm控件,

解决方案 »

  1.   

    應該是兩位兩位轉成對應的 HEX, 你一位一位轉,已經是錯了!一般用
      如 s:= '12345';
        stem := '$' + Copy(s, length(s)-3, 2);
        iHex := StrToInt(stem);大概是這樣
      

  2.   

    Hex、HexToInt这两个函数实在写的不怎么样~~不过关键是Variant类型不是想你的那样好用~~参考如下代码:
    var
      I, InputLen: Integer;
      tmpVar: PChar;
      InputString: string;
    begin
      if MSComm1.CommEvent <> ComEvReceive then Exit;
      if HexShow.Checked then
      begin
        InputLen := MSComm1.InBufferCount;
        tmpVar := MSComm1.Input;
        InputString := '';
        for I := 0 to InputLen - 1 do
          InputString := Format('%s %.2x', [InputString, Ord(tmpVar[I])]);
        Delete(InputString, 1, 1);
        InputString := LowerCase(InputString);
      end
      else InputString := MSComm1.Input;
      Memo1.Text := Memo1.Text + InputString;
    end;