如,我的string为CA 01 A0 A1,我要把其转换为byte数组然后用串口发出,如何能让设备收到的也是CA 01 A0 A1,而不是一串数字?

解决方案 »

  1.   

    var
      bs:array of byte;
    bs:=setlenght(bs,lenght(s));
    for i:=1 to lenght(s) do
      bs[i-1]:=Ord(s[i]);...接收方用Chr(bs[j])ASCII码,没概念?
      

  2.   

    有些串口通信协议是用ASCII传输的,比如Modbus就有RTU(二进制方式)和ASCII方式
      

  3.   

    这个报错?
    bs[0]:=Ord('A');
    这个报错吗?
      

  4.   

    bs:=setlenght(bs,lenght(s));这个要改成bs:=setlength(bs,lenght(s));
    哈哈....这个语法都能不过啊
      

  5.   

    var
      bs:array[0..1023] of byte;
    begin
      fillchar(bs, sizeof(bs), #0);
      //这里假设你的S长度不大于1K
      move(PChar(s)^, bs, length(s));
      //下面就是你的发送代码了
      ....
    end;
      

  6.   


    过了,是我自己多加了个填充零的语句
    不过我用串口精灵看了一下,我发出的数据还都为数字,是十进制的数字
    有没有办法就把我的string原样不动的转为array of byte
      

  7.   

    串口当然只能传数字啊
    ASCII就是数字,你找个ASCII码表看看
    ‘0’-48,
    ……
    ‘9’-57,
    ....
    'A' - 65,'a' - 97
      

  8.   

    接收端把数字变回字符,
    Chr(48) - '0'Chr(65) - 'A'Chr(97) - 'a'
      

  9.   

    你没有说明你的String 是  CA 01 A0 A1  这是个字符串,不算前后空格共有11个字符,占用11个字节。
    对方我想应该收的是4个字节吧,每个字节用16进制表示是CA 01 A0 A1.
    至于是16进制显示,还是10进制显示,这是串口精灵软件的表示给你看方式,在内存中都是0和1。
    如果你愿意你还可以用8进制来看。
      

  10.   

    别扯 0 1这些没用的,照你这么说电影文件还是0 1  组成的呢我就问,我就是想问怎么把string中表示十六进制的东西原封不动的转成byte
      

  11.   

     楼主就是把你的字符串每两位组成一个byte发送??
      

  12.   


    我就是想要,如果我的STRING中是CA,那就给我转到BYTE后也是CA,或都数字202,可是我CA转过去后,变成ASCII码表上标的数字了
      

  13.   

    你的string中的字符是表示的16进制的数?那你可以直接StrToInt()从源字符串中取出2个字符构成一个临时字符串比如:
    s2:='CA';
    s2:='$'+s2;
    aByte:=inttostr(s2);哈哈,要说清楚啊
      

  14.   

    function TForm1.HexStrToByte(HesStr: String): Byte;
    var
      iLen: Integer;
    begin
      Result := 0;
      iLen := length(HesStr);
      if iLen <> 2 then Exit;
      If not (HesStr[1] in ['0'..'9', 'A', 'B', 'C', 'D', 'E', 'F',
       'a', 'b', 'c', 'd', 'e', 'f']) Then Exit;
      If not (HesStr[2] in ['0'..'9', 'A', 'B', 'C', 'D', 'E', 'F',
       'a', 'b', 'c', 'd', 'e', 'f']) Then Exit;
       Result := StrToInt('$' + HesStr);
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    const
      SHEX = 'CA01A0A1';
    var
      iByte: Byte;
      sTemp: String;
      hexBuf: array[0..1023] of byte;
      iStart, iCount, idex: Integer;
    begin
      idex := 0;
      iStart := 1;
      fillchar(hexBuf, sizeOf(hexBuf), #0);
      iCount := length(SHEX) + 1;
      while iStart < iCount do
      begin
        sTemp := SHEX[iStart];
        iStart := iStart + 1;
        if iStart >= iCount then Break;
        sTemp := sTemp + SHEX[iStart];
        iByte := HexStrToByte(sTemp);
        ShowMessage(IntToHex(iByte, 2));
        hexBuf[idex] := iByte;
        idex := idex + 1;
        iStart := iStart + 1;
      end;
    end;
    就是上面的代码了! 你测试一下看看是不是你要的!  
      

  15.   

    function TForm1.HexStrToByte(HesStr: String): Byte;
    var
      iLen: Integer;
    begin
      Result := 0;
      iLen := length(HesStr);
      if iLen <> 2 then Exit;
      If not (HesStr[1] in ['0'..'9', 'A'..'F', 'a'..'f']) Then Exit;
      If not (HesStr[2] in ['0'..'9', 'A'..'F', 'a'..'f']) Then Exit;
      Result := StrToInt('$' + HesStr);
    end;
    上面这个函数更简洁一些!
      

  16.   

    简单点就是
    感谢楼主。简而言之: Byte_Type_Var:=StrToInt('$' +String_Type_Var); //Length(String_Type_Var)<=2;