首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

有木有会Delphi的大牛!解决思路

2012-03-11 
有木有会Delphi的大牛!!!**************************************************GPS上位机接收部分代码*****

有木有会Delphi的大牛!!!
**************************************************
GPS上位机接收部分代码
**************************************************

procedure TGPSForm.MSComm2Comm(Sender: TObject);
var
 dta,dta1,tmp:string;
 i,j:integer;
 begin
 dta:= MSComm2.Input;
 Timer2.Enabled:=False;
 Timer2.Enabled:=True;
 if dta='$' then begin
  b:=dta;
  exit;
 end;
 if dta=chr(10) then begin
  b:=b+dta;
  if pos('$GPRMC',b)<>0 then
  if pos('A',b)<>0 then begin
  try
  Image1.Visible:=True;
  Image2.Visible:=False;
  a:=copy(b,pos(',',b)+1,6);
  a:=copy(a,1,2)+':'+copy(a,3,2)+':'+copy(a,5,6);
  j:=pos(',',b);
  dta1:=copy(b,J+1,length(b));
  for i:=1 to 8 do begin
  j:=pos(',',dta1);
  dta1:=copy(dta1,j+1,length(b));
  end;
  c:=copy(dta1,1,6);
  c:=copy(c,5,2)+'-'+copy(c,3,2)+'-'+copy(c,1,2);
  tmp:=timetostr(strtotime(a)+strtotime('08:00:00'));
  if (strtotime(a)>strtotime('00:00:00') ) and (strtotime(a)<strtotime('16:00:00'))then
  Panel2.Caption:=DateToStr(strtodate(c))+' '+tmp
  else
  Panel2.Caption:=DateToStr(strtodate(c)+1)+' '+tmp;
  if SpeedButton1.Down then begin//调整PC时间
  SetPCSystemTime(StrToDateTime(Panel2.Caption));
  end;
  except
  end;
  //经纬度
  try
  j:=pos('A,',b);
  dta1:=copy(b,j+2,length(b));
  j:=pos(',',dta1);
  tmp:=copy(dta1,1,J-1);
  dta1:=copy(dta1,j+1,length(dta1));
  tmp:=dta1[1]+':'+FormatFloat('0.000',StrToFloat(tmp)/100);
  delete(dta1,1,2);
  j:=pos(',',dta1);
  dta1:=copy(dta1,1,J+1);
  tmp:=tmp+' '+rightstr(dta1,1)+':'+FormatFloat('0.000',StrToFloat(copy(dta1,1,J-1))/100);
  Panel3.Caption:=tmp;
  except
  Panel3.Caption:='E:--- N:---';
  end;
  exit;
  end else begin
  Image2.Visible:=True;
  Image1.Visible:=False;
  b:=' ';
  exit;
  end;
  b:='';
  exit;
 end;
 b:=b+dta;
end;


求大牛们,帮我写下注释,或者程序运行的步骤帮我写下,谢谢了!我要把这个写成C语言

[解决办法]

Delphi(Pascal) code
procedure TGPSForm.MSComm2Comm(Sender: TObject);var  dta,dta1,tmp:string;  i,j:integer;begin//mscomm是ms的串口控件,这里是读串口一个字符dta:= MSComm2.Input;{  timer2是个定时器,这里重置了timer2  猜测timer2类似一个看门狗,timer2触发之前不重置的话就会触发timer2的事件  应该是个超时处理}Timer2.Enabled:=False;Timer2.Enabled:=True;if dta='$' then             //如果接受到的字符串是 $  (gps上传数据都以$开头)   begin   //b是全局变量,存放一条gps语句。单字母做全局变量,菜鸟   //如果收到的是$,则重置b,作为一条新的gps语句   b:=dta;   exit;      //退出函数,等同于return   end;if dta=chr(10) then     //如果收到字符是换行LF(0x0a)  LF是gps语句结束符,如果收到LF,则可以进行语句解析了   begin   b:=b+dta;   if pos('$GPRMC',b)<>0 then  //如果当前gps语句是RMC语句      if pos('A',b)<>0 then    //如果当前gps语句里有字符'A'      //这里可能会有bug,程序本意应该是看RMC数据里的定位状态,A为有效,V为无效      //所以这里的判断是当前gps数据是否有效      //但RMC包最后也有个模式指示,如果是自主定位的话也是A,所以在使用不同gps时,这里可能会错误的解析非法gps数据包         begin         try    //delphi的异常机制,如果try里的语句出异常,则跳转到except部分执行            Image1.Visible:=True;    //显示image1            Image2.Visible:=False;   //隐藏image2            //结合最后的显示,这里应该是一个图片提示,收到有效gps包时显示image1,否则显示image2            //取gps语句第一个逗号后的6个字符到全局变量a,菜鸟            //实际就是取gps时间,详见gps RMC包格式            a:=copy(b,pos(',',b)+1,6);            //将时间由hhmmss转换成hh:mm:ss            a:=copy(a,1,2)+':'+copy(a,3,2)+':'+copy(a,5,6);            //截取gps语句第一个逗号之后的部分到dta1            j:=pos(',',b);            dta1:=copy(b,J+1,length(b));            //同样的蠢事做8次            for i:=1 to 8 do               begin               j:=pos(',',dta1);               dta1:=copy(dta1,j+1,length(b));               end;            //干过9次蠢事后,此时的gps语句开头应该是日期信息            //取gps日期信息(ddmmyy)到c,菜鸟            c:=copy(dta1,1,6);            //将日期由ddmmyy转换为yy-mm-dd            c:=copy(c,5,2)+'-'+copy(c,3,2)+'-'+copy(c,1,2);            //tmp为完整日期+时间            //这里感觉应该弄错了,应该是strtotime(c)而不是strtotime(a)            tmp:=timetostr(strtotime(a)+strtotime('08:00:00'));            //如果时间在16点前            if (strtotime(a)>strtotime('00:00:00') ) and (strtotime(a)<strtotime('16:00:00'))then               Panel2.Caption:=DateToStr(strtodate(c))+' '+tmp  //尼玛的strtodate再DateToStr好玩啊?            else               Panel2.Caption:=DateToStr(strtodate(c)+1)+' '+tmp;            if SpeedButton1.Down then begin//调整PC时间               SetPCSystemTime(StrToDateTime(Panel2.Caption));               end;         except     //出异常了什么都不做,仅仅只是为了防止程序奔溃.            end;         //经纬度         try            //取纬度,详见RMC数据格式            j:=pos('A,',b);            dta1:=copy(b,j+2,length(b)); //这里会多拷贝b串后的两个字节数据,相当于数组越界了.菜鸟            //下面一堆字符串处理,懒得看了,就是把经纬度取出来显示到Panel3的标题上            j:=pos(',',dta1);            tmp:=copy(dta1,1,J-1);            dta1:=copy(dta1,j+1,length(dta1));            tmp:=dta1[1]+':'+FormatFloat('0.000',StrToFloat(tmp)/100);            delete(dta1,1,2);            j:=pos(',',dta1);            dta1:=copy(dta1,1,J+1);            tmp:=tmp+' '+rightstr(dta1,1)+':'+FormatFloat('0.000',StrToFloat(copy(dta1,1,J-1))/100);            Panel3.Caption:=tmp;         except    //解析异常则清空经纬度显示            Panel3.Caption:='E:--- N:---';            end;         exit;         end      else         begin         Image2.Visible:=True;         Image1.Visible:=False;         b:=' ';         exit;         end;      b:='';      exit;      end;//如果既不是gps开头字符$,又不是结束符LF,则将字符拼接到当前gps语句的最后b:=b+dta;end; 

热点排行