河南电力公司月薪4000面试试题(要知道河南月薪4000是什么概念)
   代码很长  下面是部分代码(未全)如果有人能解决请与我联系 QQ:251052979
数据发送的正确格式为 FB 02 C0 D4 01 00……………………………..FF
现在发送的为错误格式 FB 02 00 01 D4 40.......................00
TErrRec = record
    MtNo:TMtNo;   //序号
    Rnd: Integer; //圈数
    Tim: Integer; //计算圈数使用的时间 Second
    CalVal:Double;//算定值
    ErrPort: TSamplePort;//New
  end;
  TErrParams = record
    ErrArs:array[TMtNo] of TErrRec;
cPts: DWord;
function TDevComm.SetErrParaEx(Sn, RationOrTime: Integer;
  ErrorType: TErrorType): Integer;
var
  EP: TErrParams;
  i: Integer;
begin
  EP.cPts := 12;
  EP.ErrArs[0].ErrPort := FSamplePort;
  EP.ErrArs[0].MtNo := 1;
  if ErrorType = etRatation then
  begin
    EP.ErrArs[0].Rnd := RationOrTime;
    EP.ErrArs[0].Tim := 1;
  end
  else begin
    //EP.ErrArs[0].Rnd := TestMeter.CalcRatation(Sn, RationOrTime);
    EP.ErrArs[0].Rnd := RationOrTime;
    EP.ErrArs[0].Tim := RationOrTime;
  end;
  //EP.ErrArs[0].CalVal := Trunc(EP.ErrArs[0].Rnd * 3600 / 200 * 1000 * 10000/ (TestMeter.GetCs(Sn) * FIRange)); //算定值的计算方法待定
  //电能误差计算参数设定
  for i := 0 to 11 do    //有12块电表
    EP.ErrArs[i].CalVal := (180000000 * EP.ErrArs[0].Rnd / TestMeter.GetCs(i+1)) / FIRange; //按200V
   WriteDevCmd(dtSetErrParm, @EP);   //每一块电表的值
  
    
 { for i := 0 to 11 do
    EP.ErrArs[i].CalVal := (180000000 * EP.ErrArs[0].Rnd / TestMeter.GetCs(i+13)) / FIRange; //按200V
  WriteDevCmd(dtSetErrParm2, @EP); }
  //WriteDevCmd(dtSetErrParm, @FF);
  Result := EP.ErrArs[0].Rnd; //返回实际设定的试验圈数
end;{************************************************************}
{过程名  :WriteDevCmd                                       }
{功能描述:数据设置命令解释并写入设备                        }
{全局变量:无                                                }
{调用模块:本单元                                            }
{作 者   :李淼                                              }
{日期    :                                                  }
{************************************************************}
function WriteDevCmd(DataType: TDataType; lpBuffer: Pointer): Integer;
var
  Cmd: WideString;
begin
  Result := E_NOIMPL;
  if (DataType in ErrCmdSets) and Assigned(SetDevCmdErr) then
  begin
    Result := SetDevCmdErr(DataType, 0, lpBuffer, Cmd);
    //ShowMessage(inttostr(Result));
    if Result = E_OK then WriteDevComm(DataType, Cmd);
     ShowMessage(inttostr(Result));
    //ShowMessage(Cmd);
  end
  else if (DataType in ErrCmdSets2) and Assigned(SetDevCmdErr2) then
  begin
    Result := SetDevCmdErr2(DataType, 0, lpBuffer, Cmd);
    if Result = E_OK then WriteDevComm(DataType, Cmd);
  end
  else if Assigned(SetDevCmd) then begin
    Result := SetDevCmd(DataType, 0, lpBuffer, Cmd);
    if Result = E_OK then WriteDevComm(DataType, Cmd);
  end
  else LastWarnString := RSComm104;//规约解释文件加载错误
end;
{************************************************************}
{过程名  :WriteDevComm                                      }
{功能描述:根据数据请求类别向对应设备写入命令行              }
{全局变量:无                                                }
{调用模块:本单元                                            }
{作 者   :李淼                                              }
{日期    :2005.07                                           }
{************************************************************}
procedure WriteDevComm(DataType: TDataType; Cmd: WideString);
var
  PortNo: Integer;
begin
  if DataType in ErrCmdSets then
    PortNo := ErrCalc.Port
  else if DataType in ErrCmdSets2 then
    PortNo := ErrCalc2.Port
  else  PortNo := Power.Port; //写入主控端口
  //数据写入端口
  WriteInto(PortNo, Cmd);
  ShowMessage(Cmd);
end;
{************************************************************}
{过程名  :WriteInto                                         }
{功能描述:1、向通讯端口写入数据                             }
{          2、通讯写入数据导入监控窗口                       }
{全局变量:无                                                }
{调用模块:STComm_IMP                                        }
{作 者   :李淼                                              }
{日期    :2005.07                                           }
{************************************************************}
procedure WriteInto(PortNum: Integer; const CmdStr: WideString);
const
  Comma = ',';
var
  SubCmd: WideString;
  nPos, nPos2: Integer;
  nLen: Integer;
begin
  nLen := Length(CmdStr);
  nPos := 1;
  nPos2 := 1;
  while nPos2 > 0 do
  begin
    nPos2 := PosEx(Comma, CmdStr, nPos);
    if nPos2 = 0 then
      SubCmd := Copy(CmdStr, nPos, nLen - nPos + 1)
    else begin
      SubCmd := Copy(CmdStr, nPos, nPos2 - nPos);
    end;
    if Length(SubCmd) > 0 then
    begin
      if PortNum = TestTB.Port then //Timer数据是ASCII
        WriteComm(PortNum, ASCToHex(SubCmd))
      else WriteComm(PortNum, SubCmd);
      //将数据导入监控窗体
      if Assigned(SpyFrm) and SpyFrm.Visible then
        SpyFrm.ShowData(1, PortNum, SubCmd);
    end;
    nPos := nPos2 + 1;
    if nPos2 > 0 then
      DelayTime(200);
  end;
end;function ASCToHex(Str: String): String;
var
  Ts,Rs :String; //临时字符串
begin
  Ts := Str;
  Result := '';
  while Length(Ts) > 0 do
  begin
    Rs := Copy(Ts,1,1);
    Result := Result + IntToHex(Ord(Rs[1]),2);
    Delete(Ts,1,1);
  end;
end;
function SetDevCmd(Fn: TDataType; Param: Integer; DPR: Pointer; out Cmd: WideString): Integer;
var
  CmdStr, Ts: string;
  I: Integer;
begin
  Result := E_OK;
  case Fn of//解析参数数据
    dtSetErrParm2:
    begin       
      with TErrParams(DPR^) do
      begin
        Cmd := 'FB' + Format('%.2d', [ErrArs[0].Rnd]);
        for I := 0 to cpts - 1 do
          Cmd := Cmd + IntToHex(Trunc(ErrArs[i].CalVal), 8);
      end;
      if Length(Cmd) = 100 then
        for i := 0 to 15 do
          Cmd := Cmd + '00';
        Cmd := Cmd + 'FF';
      if Length(Cmd) <> 132 then Cmd := '';
    end;
    dtSetTestWk2:
    begin
      with TDevCtrl(DPR^) do 
        if Op = 1 then Cmd := 'F3' else Cmd := 'F4';
    end;
    else
      Result := E_NOIMPL;
  end;
  OutPutDebugString(Pchar(Cmd));
end;function GetDevCmd(Fn: TDataType; Param: integer; out Cmd: WideString): Integer;
begin
  Result := E_OK;
  case Fn of
    dtGetPulses2:
      Cmd := 'FD';
    dtGetErrs2:
      Cmd := 'FE';
    else
      Result := E_NOIMPL;
  end; 
end;end.

解决方案 »

  1.   

    delphi的这题目写的不错啊,狠现实的问题。。而且代码也写的比较好,结构也清晰。。搂主应该很好分析错误原因的啊
      

  2.   

    是在考LZ调用函数吗?   MIC怎么没出来  可以调槽了你
      

  3.   

    没法看,给代码吧! [email protected][email protected]
      

  4.   

    找错吗?
    这个应该是通过串口跟下位机通信吧,协议呢?
    如果FB是包头,FF是包尾,那么其他对应的是什么内容?不知道怎么协议怎么做
    另外数据好像直接发送的,难道数据中间就没有遇到FF这样的数据?如果遇到呢?
    难道发送之前不拆分数据包?
      

  5.   

    先看规约,然后debug,轻松搞定!
      

  6.   

    xhxlss()请不要有地方歧视,谢谢