编译没有报错,运行的时候出现这个,代码如下,请高手指点:{取位函数}
function getbit(Number:Byte;nBit:Byte):Byte;
begin
   Number:=Number shl 8-nbit;
   Number:=Number shr 7;
   getbit:=Number;
end;{设位函数}
function SetBit(Number:Byte;nBit:byte;value:byte):Byte;
begin
     case value of
     1:SetBit:=Number or (1 shl  nBit-1);
     0:SetBit:=Number and ((1 shl  nBit-1) xor $FF);
     end;
end;{取时间年,设置,发送到串口}
procedure TForm1.Button1Click(Sender: TObject);
var
 i:Byte;
  ch1,ch2,ch3,ch4:Byte;
  vdate:TDateTime;
  ayear, AMonth, ADay, AHour, AMinute,ASecond, AMilliSecond:Word;
  str:string;
begin
  DecodeDateTime(vdate, AYear, AMonth, ADay, AHour, AMinute,ASecond, AMilliSecond);  for i:=3 to 8 do
    SetBit(ch1,i,(getbit(Byte(ayear),i-2)));  for i:=1 to 2 do
    SetBit(ch1,i,(getbit(Byte(AMonth),i+2)));  for i:=7 to 8 do
    SetBit(ch2,i,(getbit(Byte(AMonth),i-6)));  for i:=2 to 6 do
    SetBit(ch2,i,(getbit(Byte(ADay),i-1)));  SetBit(ch2,1,(getbit(Byte(AHour),5)));  for i:=5 to 8 do
    SetBit(ch3,i,(getbit(Byte(AHour),i-4)));  for i:=1 to 4 do
    SetBit(ch3,i,(getbit(Byte(AMinute),i+2)));  for i:=7 to 8 do
    SetBit(ch4,i,(getbit(Byte(AMinute),i-6)));  for i:=1 to 6 do
    SetBit(ch4,i,(getbit(Byte(AMilliSecond),i)));  str:=Char($aa)+char($15)+char(ch1)+char(ch2)+char(ch3)+char(ch4);
  Comm1.WriteCommData(PChar(@str[1]),6);
end;

解决方案 »

  1.   

    vdate没有初始化啊,你要给他赋个初值:
    procedure TForm1.Button1Click(Sender: TObject); 
    var
    i:Byte; 
      ch1,ch2,ch3,ch4:Byte; 
      vdate:TDateTime;
      ayear, AMonth, ADay, AHour, AMinute,ASecond, AMilliSecond:Word;
      str:string;
    begin
      vdate := Now;
      DecodeDateTime(vdate, AYear, AMonth, ADay, AHour, AMinute,ASecond, AMilliSecond);  for i:=3 to 8 do
        SetBit(ch1,i,(getbit(Byte(ayear),i-2)));   for i:=1 to 2 do 
        SetBit(ch1,i,(getbit(Byte(AMonth),i+2)));   for i:=7 to 8 do 
        SetBit(ch2,i,(getbit(Byte(AMonth),i-6)));   for i:=2 to 6 do 
        SetBit(ch2,i,(getbit(Byte(ADay),i-1)));   SetBit(ch2,1,(getbit(Byte(AHour),5)));  for i:=5 to 8 do
        SetBit(ch3,i,(getbit(Byte(AHour),i-4)));  for i:=1 to 4 do
        SetBit(ch3,i,(getbit(Byte(AMinute),i+2)));  for i:=7 to 8 do
        SetBit(ch4,i,(getbit(Byte(AMinute),i-6)));  for i:=1 to 6 do 
        SetBit(ch4,i,(getbit(Byte(AMilliSecond),i)));  str:=Char($aa)+char($15)+char(ch1)+char(ch2)+char(ch3)+char(ch4);
      Comm1.WriteCommData(PChar(@str[1]),6);
    end;