串口通讯数据转换问题 ( 积分: 300 )

  • 主题发起人 主题发起人 Rommel6
  • 开始时间 开始时间
R

Rommel6

Unregistered / Unconfirmed
GUEST, unregistred user!
1、如何将一个word类型的数据转换成byte类型
如: systemtime:Tsystemtime;
getsystemtime(systemtime);
year:=systemtime.wyear;
month:=systemtime.wmonth;
day:=systemtime.wday;
hour:=systemtime.whour;
min:=systemtime.minute;
sec:=systemtime.second;
year,month,day,hour,min,sec都是word类型的,我现在想把它们转换成一个字节的byte类型,然后通过spcomm的write功能发送出去,应该如何实现?

2、用getsystemtime(systemtime)的方法取到的系统时间好像有点问题,我在系统时间为
9:05分时,取到的whour值居然是1,不知是什么原因。

3、定义为byte类型的一组数字,在相加的时候数据溢出,编译器是如何处理的?
如:i:integer;
sum:byte;
buf:array [1..3] of byte;
sum:=0;
buf[1]:=byte($f9);
buf[2]:=byte($f8);
buf[3]:=byte($a3);
for i:=1 to 3 do
sum:=sum+buf;
最后sum的值应该是多少,如果相加的个数更多,最后sum的值是怎样决定的?

4、如果通过comm1.receivedate(buffer,pchar(@sbuf)^,bufferlength)得到的数据应该是char类型的吧!
可不可以将pchar改成pbyte或者是pinteger从而使得到的数据为byte或integer类型呢?
怎样能将char类型转换成byte类型?

5、如果有一个byte的数据的高位为0,怎样能动态地将这个0除去,写到string类型中?
如:i:byte;
str:string;
i:=byte($05);
怎样能让str的值为5

6、浮点数是如何通过byte类型在串口中进行传输的?
 
1、如何将一个word类型的数据转换成byte类型
如: systemtime:Tsystemtime;
getsystemtime(systemtime);
year:=systemtime.wyear;
month:=systemtime.wmonth;
day:=systemtime.wday;
hour:=systemtime.whour;
min:=systemtime.minute;
sec:=systemtime.second;
year,month,day,hour,min,sec都是word类型的,我现在想把它们转换成一个字节的byte类型,然后通过spcomm的write功能发送出去,应该如何实现?

2、用getsystemtime(systemtime)的方法取到的系统时间好像有点问题,我在系统时间为
9:05分时,取到的whour值居然是1,不知是什么原因。

3、定义为byte类型的一组数字,在相加的时候数据溢出,编译器是如何处理的?
如:i:integer;
sum:byte;
buf:array [1..3] of byte;
sum:=0;
buf[1]:=byte($f9);
buf[2]:=byte($f8);
buf[3]:=byte($a3);
for i:=1 to 3 do
sum:=sum+buf;
最后sum的值应该是多少,如果相加的个数更多,最后sum的值是怎样决定的?

4、如果通过comm1.receivedate(buffer,pchar(@sbuf)^,bufferlength)得到的数据应该是char类型的吧!
可不可以将pchar改成pbyte或者是pinteger从而使得到的数据为byte或integer类型呢?
怎样能将char类型转换成byte类型?

5、如果有一个byte的数据的高位为0,怎样能动态地将这个0除去,写到string类型中?
如:i:byte;
str:string;
i:=byte($05);
怎样能让str的值为5

6、浮点数是如何通过byte类型在串口中进行传输的?
 
1、StrToint('$'+edt_Contor.Text)
2、getsystemtime(now)
3、buf:array [1..3] of byte定义错误,数组的下标从0开始,buf:array [0..3] of byte;
4、用Ord('AA')函数可以实现
5、用函数转化两次
6、传递二进制啊

 
1、 hi(word); lo(word); 将字转换为字节
3、 $94, 再多也只保留一个字节所能容的数,溢出的就溢出呗
 
1,看我以前的代码
var
tempword:word;
b1,b2,b3,b4:byte;
buf:pchar;
begin
getmem(buf,4);
tempword:=loword(adr);
b1:=lobyte(tempword);
b2:=hibyte(tempword);
tempword:=hiword(adr);
b3:=lobyte(tempword);
b4:=hibyte(tempword);
buf[0]:=char(b1);
buf[1]:=char(b2);
buf[2]:=char(b3);
buf[3]:=char(b4);
result:=buf;
end;

2,用now函数就行了。
3,下标是从零开始。字节内容相加赋给字节这样不太好吧。
4,从你的comm1.receivedate(buffer,pchar(@sbuf)^,bufferlength)看好像是用spcomm做的。它接收到的内容是指针类型的。我这样处理的
var
rbuf:array[0..1000] of byte;//你可以定义成动态的。
ss :string;
........
move(buffer,pchar(@rbuf)^,bufferlength);
//你要转换成字符串的话就如下这样
move(buffer^,pchar(ss)^,bufferlength);

5,你这样的话
i:byte;
str:string;
i:=byte($05);
怎样能让str的值为5
str就是5呀,$05这样是十六进制的5呀

6,十六进制
 
1、我是要用于串口发送的日期的,比如年份是year:=2005,用lo(year)取的数字是D5,而不是05,我的目的是将05作为数据向串口发送
现在我的解决方案是:
buf[1]:=byte(strtoint('$'+copy(inttostr(year),3,2)));然后发送
但是这样好象比较麻烦,大家有没有更好的方法。

2、我发现用systemtime时whour和实际时间总是差8小时,我想知道这是什么原因呢?楼上的建议用now,但是now的数据结构是什么样的?如何将其分解成年月日时分秒?能在这里表示一下吗?如果想精确到毫秒,now好象是不行哦.

3、To jianguobu:
下标从1开始好象也可以吧,定义的时候就是从1开始 buf:array [1..33] of byte;
字节内容相加赋给字节,是因为我的最后一位buf[33]是校验位,规定是第3到第32个字节相加再加1,就是有点像汇编里的ADD语句。
是不是能这样:(假设从串口上传了一串数据33个字节按照上面的规定校验)
var sum:byte;
sum:=0;
begin
for i:=3 to 32 do
sum=sum+buf;
if (buf[33]=sum) then
语句1
else
丢弃此次数据;(丢弃数据如何执行?)
end;

4、To 中鼎:
用ord('aa')好象不行啊

5、jianguobu 你没明白我的意思,我的意思是:现在取到2个字节** **,如果第一个字节的高位为0,则0不用表示出来,如果不为0,则全部显示。
例如,2个字节是05H 08H,显示出来的是508 2个字节是11H 32H,显示的是1132

6、糊涂了,中鼎说是传递二进制,jianguobu说是16进制,到底是什么啊?
我知道在用comm1.WriteCommData(@buf,2)的时候,buf:=byte($aa)的,也就是16进制,二进制也能实现吗?具体过程有人能在这里介绍一下吗?
 
rommel6的问题我也想知道,有没有人解释一下,关注.
 
高手就是多,进来学到不少
顶一下
 
后退
顶部