Delphi中用SPCOMM读Com口数据时,符号丢失问题(50分)

  • 主题发起人 主题发起人 snight
  • 开始时间 开始时间
S

snight

Unregistered / Unconfirmed
GUEST, unregistred user!
用spcomm控件读com口数据,然后把读出来的数据用integer格式显示出来,但是本来应该是负的,却自动加了256,转换成了正的,代码大概如下:

rbuf:array[1..200] of byte;
comm1:tcomm;

procedure tfcomm.comm1receivedata(sender: tobject; buffer: pointer;bufferlength: word);
var
i:integer;
begin
viewstring:=‘’ ;
move(buffer^,rbuf,bufferlength);

for i:=1 to bufferlength do
viewstring:=viewstring+ inttostr(rbuf)+‘’ ;
viewstring:=‘接收’+ viewstring;
memo1.lines.add(viewstring);
memo1.lines.add(‘’ );
end;

其中假如rbuf(2)应该是-123的(我有程序可以正确读到数据),显示出来的时候就变成133了,如果是-96的,就变160了,小弟愚昧,不明白为什么,是语句有问题,还是spcomm控件的缘故?
 
你看看是不是传递的模式问题,不是有字符和二进制两种吗?
你不会告诉我你程序中的一个rbuf[1]就能出现-123吧。
 
我用spcomm,
却始终无法读出数,
我使用的是com1,
读取的是地磅电子称的数据,
谁能告诉我怎样能够读出数?
 
xuegaoyili,理论上应该是可以读得到的,我现在rbuf[1]读到的就是Byte值
 
转换十六进制
 
用shortint 这是个有符号的字节类型。
 
byte值的范围
 
楼上的各位,问题找到了,呵呵,因为Java的Byte类型是带符号的,而Delphi的Byte类型是不带符号的,所以在转换的过程中出现的问题,现在有个新的问题,如何才能达到Java的Byte类型所得到的结果呢?Shortint范围太小,只有-127~128,需要-255~256的变量范围,而Smallint就是16字节的了,取出来的值就没有用了
 
byte类型是8位无符号整数,值范围是0..255,不管取到什么都解释成这个范围的数了
 
这句
viewstring:=viewstring+ inttostr(rbuf)+‘’ ;
改为:
viewstring:=viewstring + inttostr(shortint(rbuf)) + ' ' ;

 
kadia,这样做范围不够把,-128~-255之间的值会取不到。
另外,还有一事请教,Delphi有类似Split的函数么?就是根据字符串中的特定分隔符,把字符串分离成数组。还有,有没有在一个字符串中查找没个字符,返回该字符串中出现的次数的函数。
 
你说的情况不存在。byte 类型取值范围要么-128~127,要么0~255。
 
不要用数组,直接用string,一口气接收,然后用字符串函数处理,什么都不会丢,想怎么处理都行

procedure TForm.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
strInput : string;
begin

SetLength(strInput, BufferLength);

Move(Buffer^, PChar(StrInput)^, BufferLength);
 
JAVA不懂,但是觉得奇怪啊,怎么会有值的范围是-255~256?
那不是成了9Bit,也要占2个字节,不是浪费空间吗?
 
viewstring:=viewstring+ inttostr(rbuf)+‘’ ;
改为:
viewstring:=viewstring + inttohex(shortint(rbuf),2) + ' ' ;

 
viewstring:=viewstring+ inttostr(rbuf)+‘’ ;
改为:
viewstring:=viewstring + inttostr(rbuf),2) + ' ' ;

刚才发的的错了

 
后退
顶部