Var
  Query_Card:Array[1..18]of Char;
  CurMsComm:TMsComm;
Begin
CurMSComm:=MSComm;
  Hstr:=KeyStr;
  Hstr:='3c0e01711390581508680000d1a8bd24';
  //将一组十六进制的串转化成单个的十六进制字符
  For i:=1 to trunc((length(Hstr))/2) Do
    Begin
      Query_Card[i]:=Chr(StrToIntDef('$'+Copy(HStr,i*2-1,2),10));
    End;
 //将一组单个的十六进制字符发送给串口
  CurMSComm.Output:=Query_Card[1]+Query_Card[2]+Query_Card[3]+Query_Card [4]+Query_Card[5]+Query_Card[6]+Query_Card[7]+Query_Card[8]+Query_Card[9]+Query_Card[10]+Query_Card[11]+Query_Card[12]+Query_Card[13]+Query_Card[14]+Query_Card[15]+Query_Card[16;
End;
现在的问题是:如果串的后几位‘d1a8bd24’的值偏大的话,接收到的数据就不对,
接收到的数据会少一位。如果串的后八位的值小一点的话,接收的数据为正确的,请问
问题出在哪里?

解决方案 »

  1.   

    怎么说?我想不会吧?
    我单步跟踪发现每个QUERY_CARD[]都已经赋了值,比如‘24’对应的字符为'$',也就是十六进制的24,十进制的36,而‘BD’对应的字符为#189,
    但接收到的结果是‘BD’、‘24’两个十六进制对应的结果只有一个字符‘3F’,而正确的结果是‘BD’‘24’。
      

  2.   

    Char is equivalent to AnsiChar which is byte-sized(8 bits).就是说char类型的变量只能存放1字节的内容。
    你试试用widechar看看
      

  3.   

    TO FILIX
    对是默认值!
    我试过用WIDECHAR 但在
    CurMSComm.Output:=Query_Card[1]+Query_Card[2]+Query_Card[3]+Query_Card [4]+Query_Card[5]+Query_Card[6]+Query_Card[7]+Query_Card[8]+Query_Card[9]+Query_Card[10]+Query_Card[11]+Query_Card[12]+Query_Card[13]+Query_Card[14]+Query_Card[15]+Query_Card[16];处,编译通不 过,数据类型不对!
    该如何写?
      

  4.   

    to yansea(思宏)
    能不能说更具体一点?
      

  5.   

    我找到了问题所在,将大于7f的十六进制前加一个指定的十六进制(如#$81)发送出去就行了。
    如:d1a8bd24 就要发送为#$81#$d1#$81#$a8#$81#$bd#$24
    接收的时候将第一个#$81去掉就行了。