MSComm中output的输出类型问题(输出字符要求转化为hex 16进制) : delphi中如何声明16进制数 ?

解决方案 »

  1.   

    var 
    i:Byte;
    i:=Byte($01);
      

  2.   

    var 
      i:byte;
    for i :=0 to length(str)/2-1 do
    begin
      i:=byte($str[i]+str[i+1]);
    end;
      

  3.   

    建议MSComm中output的输出类型用olevariant来处理。
      

  4.   

    我用的就是Olevariant类型 , 请各位再次帮忙 , 贴上我的一些代码 . 
    我目前在写一个小程序 , 通过MSComm控件向一个LCD看板(点阵)发送数据 , LCD中采用的是5*7点阵西文字符库 , 对应的字符与16进制码分别是(举几个例子): 0代码”10”, 1代码”11” ….., 9代码”19” , …. ,A代码”21”, B代码”22” , …. , I代码”29” , J代码”2A” , …. O代码”2F” , P代码”30” , ……, Z代码”3A” , [ 代码”3B” .  现在需要显示的字符串已经从数据库中取出 , 比如 : “IBM 2510 FOX 3560“, 以上的字符如何显示在LCD上 . 我的想法 :  将字符串“IBM 2510 FOX 3560“ 先转化成5*7点阵西文字符库中对应的代码 , 但是通过
    MSComm.output:=…… 在LCD上显示不出来 . 有好的建议请贴出代码 , 高分酬谢 !  
      

  5.   

    部分代码 : private
        { Private declarations }
     // function ConvertStr(tmpStr:String);
      public
        { Public declarations }
      end;var
      FormMain: TFormMain;
      KanBanDB: TiniFile;
      Sid,Username,Password:String;
      RecordCounter:integer;
      SendStr : array[0..99] of String;
      ArrayIndex : integer ;
      TimerSwitch : String;
      DisplayChar : array[0..36] of String = ('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P,','Q','R','S','T','U','V','W','X','Y','Z','-');
      ActualVal : array[0..36] of String = ('10','11','12','13','14','15','16','17','18','19','21','22','23','24','25','26','27','28','29','2A','2B','2C','2D','2E','2F','30','31','32','33','34','35','36','37','38','39','3A','3F') ; 
    implementationuses UserLogin;{$R *.dfm}procedure TFormMain.FormShow(Sender: TObject);
    begin
       StopBtn.Enabled:=false;
       Timer1.Enabled:=false;
       Timer2.Enabled:=false;
       TimerSwitch:='Timer1On';
      // MSComm1.InputMode:=0 ;    // 1 - comInputModeBinary
      // DisplayChar:=('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P,','Q','R','S','T','U','V','W','X','Y','Z','-');
      // ActualVal:=('10','11','12','13','14','15','16','17','18','19','21','22','23','24','25','26','27','28','29','2A','2B','2C','2D','2E','2F','30','31','32','33','34','35','36','37','38','39','3A','3F');
    end;
    procedure TFormMain.Timer1Timer(Sender: TObject);
    var
       TmpArrayIndex:integer;
       SqlStr : String;
       MOStr:String;
       ModelStr:String;
       TargetStr:String;
       OutputStr:String;
    begin
     if TimerSwitch='Timer1On' then
     begin
      TmpArrayIndex:=0;
      SqlStr:='select mo_number,model_name ,target_qty, sum(output_qty) output_qty  from  sfism4.r_mo_base_t where mo_number in '
             +' (select  distinct  rec.mo_number from sfism4.r_station_rec_t  rec, sfism4.r_mo_base_t   base  '
             +'   where   rec.work_date = ( select to_char(sysdate,''yyyymmdd'')  from dual ) '
             +'   and  rec.MO_NUMBER=base.MO_NUMBER   and  base.CLOSE_FLAG=2   '
             +'   and base.INPUT_QTY>=base.OUTPUT_QTY ) '
             +' group by mo_number, model_name , target_qty ' ; 
       with ADOQuery1 do
       begin
           close;
           sql.Clear;
           sql.Add(SqlStr);
           prepared;
           open;
           RecordCounter:=ADOQuery1.RecordCount;
        end;
        while not ADOQuery1.Eof do
        begin
             MOStr:=ADOQuery1.fieldByName('mo_number').AsString;
             ModelStr:=ADOQuery1.fieldByName('model_name').AsString;
             TargetStr:=IntToStr(ADOQuery1.fieldByName('target_qty').AsInteger);
             OutputStr:=IntToStr(ADOQuery1.fieldByName('output_qty').AsInteger);
             SendStr[TmpArrayIndex]:=MOStr+ModelStr+TargetStr+OutputStr;
             ADOQuery1.Next;
             TmpArrayIndex:=TmpArrayIndex+1;
        end;
        ArrayIndex:=TmpArrayIndex ;
        TimerSwitch:='Timer2On';
     end;
    end;procedure TFormMain.Timer2Timer(Sender: TObject);
    var
       i:integer;
       COMLinkStr : String ;
    begin
      if TimerSwitch='Timer2On' then
      begin
        
        if ArrayIndex>=0 then
        begin
            COMLinkStr:='';
            for i:=0 to ArrayIndex do
               COMLinkStr:=COMLinkStr+SendStr[i] ;
            MSComm1.Output:=COMLinkStr ;
          // MSComm1.Output:='A1 5F' ;
        end;
        TimerSwitch:='Timer1On';
      end;
    end;
    end.