我现在是希望往一个edit中输入数据,然后这个数据从串口发送出去,对方收到的也是负数,请问怎么实现?
也就是我在我的上位机上的edit中输入-1,然后通过232串口发送出去,对方下位机收到的也是-1
发送数据时统一采用转化为16进制发送。

解决方案 »

  1.   

    用Shortint类型变量来接收(或转换)这个数据。举个例子:var
      a : Byte;
      b : Shortint;
    begin
      a := $FF;
      b := a;
      ShowMessage (IntToStr(b));
    end;
      

  2.   

    byte是0-255,你一定要负数,就用shortint还是tinyint。
      

  3.   

    在发送一个数据时,编码和解码要求是十分清楚的,这就要求楼主对数据编码和解码比较了解:原码、反码、补码等概念,知道如何进行操作。
    以楼主的需求为例,楼主的数据是在一个编辑框中,所以有可能用户输入的值是0~255的数,这时可以使用Byte类型来表示,如果用户输入的是-128~127的数,也能使用Byte型表示,但在转换为实际值的时候,就必须进行补码的反运算了,当然用户的输入范围不同,有可能使用shortint,word,integer,long等等,
    现在的问题是:不能确定用户的输入范围,所以可以取一个最大可能的值(比如用户不可能输入超过Max(Integer)的值,则可以使用Integer值来存储数据,但是Integer是4个字节,通讯发送是一个字节一个字节的发,只能把Integer的四个字节按一定的顺序逐一发送,接收方收取后再按发送顺序排列好,将其编码到一个Integer类型的变量中,这样就完成了通讯过程。
      

  4.   

    至于对于负数的编码和解码,不同的数据类型是不同的:对于-1,如果用一个字节的有符号整数表示,其补码值为FF,如果用两个字节的有符号整数表示,其补码值为FFFF,如果用四个字节的有符号整数表示,其补码值为FFFFFFFF,所以需要在发送方和接收方进行约定按哪种数据类型进行表示,这样才能够收发一致,不然的话,发送方将值-1按一个字节的有符号整数进行编码,其值为FF,而接收方按两个字节的有符号数进行解码,会变成00FF,这个值为255,就不是负一了。