本人毕业设计。
  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个数据每两个表示一个数据,数据处理完后每个数据分别送到对应的地方显示,
  这个程序要怎么写啊  
  哪个高手指点下啊 !!!
  谢谢!!!

解决方案 »

  1.   

    说一点想法吧:电压和电流就比较容易了
    电压值:  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;
    这时候再把他转换成字符串显示!
      

  2.   

    写了一个例子
    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.
      

  3.   

    可能是我的数据格式没有说清楚:在补充下:
    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码个位
      

  4.   

    不明白你说什么?你就举个例子吧,说BUFFER里面有什么东西,然后取什么东西,怎么取,取出来是什么?
      

  5.   

    比如:
      BUFFER中有  U  01010101 ……(BCD码,6个字节,每2个字节表示一个10进制数) I 00000000(BCD码,6个字节,每2个字节表示一个10进制数) P (BCD码,9个字节,每2个字节表示一个10进制数)
      

  6.   

    BYTE 1   BCD个位(高4位)     BCD十分位(低4位)
    BYTE 2   BCD百位(高4位)     BCD十位(低4位)
      

  7.   

    有点晕,告诉你要取出一个字符的高四位和低四位可以这样取:
    var
      b,bh,bl: Byte;
    begin
      b := $E8;
      bh := b and $F0;
      bl := b and $0F;
    end;
      

  8.   

    郁闷着:BUFFER中有  U  01010101 ……(BCD码,6个字节,每2个字节表示一个10进制数) I 00000000(BCD码,6个字节,每2个字节表示一个10进制数) P (BCD码,9个字节,每2个字节表示一个10进制数)6+6+9=21 BYTE  还有,P是9个BYTE,每2个BYTE表示一个10进制,9只能配成4对,还有一个BYTE跟谁配啊?
    数据结构是二进制的,共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;
      

  9.   

    inbuff: array[0..2047] of char;
    Data:  array of byte;ReadFile(hComm, inbuff,cs.cbInQue,nBytesRead,nil);怎么样将接收到的数据送入数组Data中呢?
    数据是BCD码格式!!
      

  10.   

    chenzhuo(睡到自然醒) 
    帮忙看看啊?
      

  11.   

    inbuff: array[0..2047] of char;
    Data:  array of byte;SetLength(Data,Length(inbuff));
    CopyMemory(@Data[0],@inbuff[0],Length(inbuff));
      

  12.   

    串口很慢的,为啥要用api呢,有很多好用的控件。delphi自带的有mscom,第三方的如cport之类的都很好用。
      

  13.   

    串口的控件确实很多,我一般用spcomm,我觉得还算好用,编写程序也比较顺手。建议用spcomm或者其他的第三方控件。
    http://community.csdn.net/Expert/topic/5387/5387384.xml?temp=.9392969
    http://community.csdn.net/Expert/topic/5385/5385481.xml?temp=.2659265