本人毕业设计。
Delphi中用Windows API 函数编写串行通信程序,在读串口时数据时用
ClearCommError(hComm,dwError,@CS);
if cs.cbInQue =0 then exit;
if cs.cbInQue > sizeof(inbuff) then begin
PurgeComm(hComm, PURGE_RXCLEAR);
exit;
end;
ReadFile(hComm, inbuff,cs.cbInQue,nBytesRead,nil);
现在要数据处理
数据结构是二进制的,共14个字节,第一个字节标示电压,后6个数据每两个表示一个数据,第八个字节标示电流,后6个数据每两个表示一个数据,数据处理完后每个数据分别送到对应的地方显示,
这个程序要怎么写啊
哪个高手指点下啊 !!!
谢谢!!!
Delphi中用Windows API 函数编写串行通信程序,在读串口时数据时用
ClearCommError(hComm,dwError,@CS);
if cs.cbInQue =0 then exit;
if cs.cbInQue > sizeof(inbuff) then begin
PurgeComm(hComm, PURGE_RXCLEAR);
exit;
end;
ReadFile(hComm, inbuff,cs.cbInQue,nBytesRead,nil);
现在要数据处理
数据结构是二进制的,共14个字节,第一个字节标示电压,后6个数据每两个表示一个数据,第八个字节标示电流,后6个数据每两个表示一个数据,数据处理完后每个数据分别送到对应的地方显示,
这个程序要怎么写啊
哪个高手指点下啊 !!!
谢谢!!!
解决方案 »
- delphi 文件流复制问题,诡异!求解!
- 跨进程发送LVM_GETITEMTEXT该消息,返回值为零。求助?????
- fastreport怎么安装呀,4.5的,求教>>>>!!!!!
- 有看过Windows高级编程指南的吗,有个问题!
- 真郁闷。这是不是realplayer的一个BUG?如能解决了再另开贴加100分。
- 如何打开文件?............................
- 受苦受难的同行们,大家齐来分享项目中遇到的“不可理喻”的问题和经历, 好让我们少受折磨。
- 想做一个MDI结构的窗体,类似于金碟2000XP软件窗体,在建立后,为什么mdiform调用mdichild后mdichild总是关不了是怎么回事呢?(散分了)
- delphi怎么让进程成为关机时最后被关闭的程序
- Delphi7的下载网址,要可续传的,100分!!!下完结贴!!!
- 怎样下载类似 http://www.abc.cn/down.asp?name=computer.doc这样的文件,delphi代码怎样写.
- 关于正版DELPHI发布产品
电压值: inbuff[0]
电流值: inbuff[7]
只要对他进行相应的类型转换,例如IntToStr(inbuff[0])就可以显示了!
分析一下,其他两个由6个BYTE组成的数据,我们要怎么把他处理成一个数据并且表示呢
这里以16禁止表示,可以这样来计算
a[1]*$100^5+a[2]*$100^4+a[3]*$100^3+a[4]*$100^2+a[5]*$100+a[6];
例如一个数的值存在数组中的16进值是:
F1,8E,6C,A3,B6,FF
通过上面说的,他得出来的应该是
F1*$100^5+8E*$100^4+6C*$100^3+A3*$100^2+B6*$100+FF
=F1 00 00 00 00 00 + 8E 00 00 00 00 + 6C 00 00 00 + A3 00 00 + B6 00 + FF
=F1 8E 6C A3 B6 FF
放在一个长整型的变量里面就可以了,因为INTEGER才32位,你这里是6*8=48位
所以需要一个64位的变量来保存!
var
i: Int64;
这时候再把他转换成字符串显示!
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
MCForms, StdCtrls;const
buffer: array[1..6] of Byte = ($F1,$8E,$6C,$A3,$B6,$FF);
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ 私有成员(变量、函数)声明 }
public
{ 公共成员(变量、函数)声明 }
end;var
Form1: TForm1;implementation{$R *.DFM}procedure TForm1.Button1Click(Sender: TObject);
var
I: Integer;
Dest: Int64;
Base: Int64;
begin
Dest := 0;
Base := 1;
for I := 6 downto 1 do
begin
Dest := Dest + buffer[I]*Base;
Base := Base*$100;
end;
ShowMessage(IntToHex(Dest,48));
end;end.
1、 三相电压:每相各占两字节,格式如下
数据格式
D7 D6 D5 D4 D3 D2 D1 D0
BYTE 1 BCD个位 BCD十分位
BYTE 2 BCD百位 BCD十位2、三相电流:每相各占两字,格式如下
数据格式
D7 D6 D5 D4 D3 D2 D1 D0
BYTE 1 BCD十分位 BCD百分位
BYTE 2 S BCD十位 BCD个位
S的定义:S=0,表示数据为正值,S=1,表示数据为负值,以下含义相同。
3、 各相有功功率:各占三个字节,格式如下:
数据格式
D7 D6 D5 D4 D3 D2 D1 D0
BYTE 1 BCD码千分位 BCD码万分位
BYTE 2 BCD码十分位 BCD码百分位
BYTE 3 S BCD码十位 BCD码个位
BUFFER中有 U 01010101 ……(BCD码,6个字节,每2个字节表示一个10进制数) I 00000000(BCD码,6个字节,每2个字节表示一个10进制数) P (BCD码,9个字节,每2个字节表示一个10进制数)
BYTE 2 BCD百位(高4位) BCD十位(低4位)
var
b,bh,bl: Byte;
begin
b := $E8;
bh := b and $F0;
bl := b and $0F;
end;
数据结构是二进制的,共14个字节,第一个字节标示电压,后6个数据每两个表示一个数据,第八个字节标示电流,后6个数据每两个表示一个数据,数据处理完后每个数据分别送到对应的地方显示
这里又说14个BYTE
你到底想说什么啊?
自己看看吧!
procedure TForm1.Button1Click(Sender: TObject);
var
Buffer: array[1..4] of Byte;
pw: PWord;
begin
Buffer[1] := $F8;
Buffer[2] := $E6;
Buffer[3] := $A7;
Buffer[4] := $9C;
pw := (@Buffer[1]);
ShowMessage(FloatToStr(pw^ / $10));
pw := (@Buffer[3]);
ShowMessage(FloatToStr(pw^ / $10));
end;
Data: array of byte;ReadFile(hComm, inbuff,cs.cbInQue,nBytesRead,nil);怎么样将接收到的数据送入数组Data中呢?
数据是BCD码格式!!
帮忙看看啊?
Data: array of byte;SetLength(Data,Length(inbuff));
CopyMemory(@Data[0],@inbuff[0],Length(inbuff));
http://community.csdn.net/Expert/topic/5387/5387384.xml?temp=.9392969
http://community.csdn.net/Expert/topic/5385/5385481.xml?temp=.2659265