GPS串口自适应解码Delphi源程序(SPCOMM控件)
菜农 发表于 2006-10-20 23:57:00 //菜农HotPower@126.com 2003.1.18 写于西安大雁塔村队部//使用SPCOMM控件是经过菜农改编的
//经过改造的Delphi环境下应用的串口控件SPComm
unit GPSTESTU;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Menus, ComCtrls, Buttons, Grids, SPComm, ExtCtrls;
type
TForm1 = class(TForm)
GroupBox1: TGroupBox;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
StatusBar1: TStatusBar;
GroupBox2: TGroupBox;
CheckBox1: TCheckBox;
CheckBox2: TCheckBox;
CheckBox3: TCheckBox;
CheckBox4: TCheckBox;
CheckBox5: TCheckBox;
CheckBox6: TCheckBox;
CheckBox7: TCheckBox;
CheckBox8: TCheckBox;
CheckBox9: TCheckBox;
CheckBox10: TCheckBox;
CheckBox11: TCheckBox;
CheckBox12: TCheckBox;
CheckBox13: TCheckBox;
CheckBox14: TCheckBox;
Label4: TLabel;
ComboBox1: TComboBox;
Label5: TLabel;
ComboBox2: TComboBox;
BitBtn1: TBitBtn;
PageControl1: TPageControl;
TabSheet1: TTabSheet;
StringGrid1: TStringGrid;
BitBtn2: TBitBtn;
BitBtn3: TBitBtn;
BitBtn4: TBitBtn;
BitBtn0: TBitBtn;
Comm1: TComm;
Label6: TLabel;
Edit1: TEdit;
Label7: TLabel;
Edit2: TEdit;
Label8: TLabel;
Edit3: TEdit;
Label9: TLabel;
Edit4: TEdit;
Label10: TLabel;
Edit5: TEdit;
Label11: TLabel;
Edit6: TEdit;
Edit7: TEdit;
Label12: TLabel;
BitBtn5: TBitBtn;
BitBtn6: TBitBtn;
TabSheet2: TTabSheet;
Memo1: TMemo;
Edit8: TEdit;
Label13: TLabel;
Label14: TLabel;
ComboBox3: TComboBox;
Label15: TLabel;
Edit9: TEdit;
Label16: TLabel;
Edit10: TEdit;
Label17: TLabel;
Label18: TLabel;
Edit11: TEdit;
Label19: TLabel;
Edit12: TEdit;
Edit13: TEdit;
Edit14: TEdit;
Label20: TLabel;
Label21: TLabel;
Edit15: TEdit;
Label22: TLabel;
Edit16: TEdit;
Timer1: TTimer;
Label23: TLabel;
Edit17: TEdit;
Edit18: TEdit;
Button1: TButton;
Edit19: TEdit;
procedure BitBtn1Click(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure FormCreate(Sender: TObject);
procedure BitBtn0Click(Sender: TObject);
function GetGpsMess(MessString: String; MessNum: integer) : String;
function GpsDateFormat(DateString: String) : String;
function GpsTimeFormat(TimeString: String) : String;
procedure BitBtn3Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure Comm1ReceiveData(Sender: TObject; Buffer: PChar;
BufferLength: Word);
procedure ComboBox2Change(Sender: TObject);
procedure BitBtn6Click(Sender: TObject);
procedure BitBtn5Click(Sender: TObject);
procedure BitBtn4Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
GPSBuffers: String;
GPSMessString: String;
implementation
{$R *.DFM}
function TForm1.GpsTimeFormat(TimeString: String) : String;
functionGpsChnTimeFormat (TimeString: String) : String;
var
i: integer;
begin
Result := '';
if length(TimeString) = 2 then
begin
i := strtoint(TimeString) + 8;
if i > 23 then i := 0;
if i < 10 then Result := '0' + inttostr(i)
else Result := inttostr(i);
end;
end;
begin
Result := '';
if length(TimeString) = 6 then
begin
Result := GpsChnTimeFormat(copy(TimeString, 1, 2)) + '时' + copy(TimeString, 3, 2) + '分' + copy(TimeString, 5, 2) + '秒';
end;
end;
function TForm1.GpsDateFormat(DateString: String) : String;
begin
Result := '';
if length(DateString) = 6 then
begin
Result := '20' + copy(DateString, 5, 2) + '年' + copy(DateString, 3, 2) + '月' + copy(DateString, 1, 2) + '日';
end;
end;
function TForm1.GetGpsMess(MessString: String; MessNum: integer) : String;
var
str: String;
i, k: integer;
s: byte;
begin
str := MessString;
i := Pos('*', str);
if (i < 10) or (str <> '$') then
begin
Result := '';
Exit;
end;
s := 0;
for k := 2 to i - 1 do
begin
s := s xor byte(str);
end;
if inttohex(s, 2) <> Copy(str, i + 1, 2) then
begin
Result := '';
Exit;
end;
str := ',';
str := ',';
k := 0;
for i := 0 to MessNum do
begin
k := Pos(',', str);
str := #7;
end;
i := Pos(',', str);
str := Copy(str, k + 1, i - k - 1);
Result := str;
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
Comm1.PortOpen := false;
Comm1.CommName := ComboBox1.Text;
Comm1.PortOpen := true;
if Comm1.PortOpen = true then
begin
ComboBox2.Color := clWindow;
ComboBox2.Enabled := true;
StatusBar1.Panels.Items.Text := '';
end
else
begin
ComboBox2.Color := clRed;
ComboBox2.Enabled := false;
StatusBar1.Panels.Items.Text := '无此串口!!!请选择其他串口设备!!!';
end;
end;
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
Comm1.PortOpen := false;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
i: integer;
begin
ComboBox1.ItemIndex := 1;//COM2
ComboBox2.ItemIndex := 2;//4800
ComboBox3.ItemIndex := 2;//4800
ComboBox2.Enabled := false;
ComboBox2.Color := clRed;
//Comm1.CommPort := 2;
Comm1.BaudRate := 4800;//波特率4800
Comm1.ParityCheck := False;//无校验
Comm1.Parity := None;//无校验
Comm1.ByteSize := _8;//8位数据位
Comm1.StopBits := _2;//2位停止位
//Comm1.PortOpen := true;
for i := 1 to 5 do
begin
Comm1.CommPort := i;
Comm1.PortOpen := true;
if Comm1.PortOpen = true then
begin
ComboBox1.ItemIndex := i - 1;
ComboBox2.Color := clWindow;
ComboBox2.Enabled := true;
StatusBar1.Panels.Items.Text := '串口';
StatusBar1.Panels.Items.Text := StatusBar1.Panels.Items.Text + inttostr(i);
StatusBar1.Panels.Items.Text := StatusBar1.Panels.Items.Text + '已打开!';
break;
end
end;
StringGrid1.ColCount := 5;
StringGrid1.RowCount := 2;
StringGrid1.Cells := '序号';
StringGrid1.Cells := '经度';
StringGrid1.Cells := '纬度';
StringGrid1.Cells := '速度';
StringGrid1.Cells := '地点';
StringGrid1.Cells := inttostr(1);
end;
procedure TForm1.BitBtn0Click(Sender: TObject);
begin
Comm1.PortOpen := false;
ComboBox2.Color := clRed;
ComboBox2.Enabled := false;
StatusBar1.Panels.Items.Text := '';
end;
procedure TForm1.BitBtn3Click(Sender: TObject);
begin
Edit1.Text := '';
Edit2.Text := '';
Edit3.Text := '';
Edit4.Text := '';
Edit5.Text := '';
Edit6.Text := '';
Edit7.Text := '';
Edit8.Text := '';
Edit9.Text := '';
Edit10.Text := '';
Edit11.Text := '';
Edit12.Text := '';
Edit13.Text := '';
Edit14.Text := '';
Edit15.Text := '';
Edit17.Text := '';
Memo1.Clear;
end;
procedure TForm1.BitBtn2Click(Sender: TObject);
begin
if StringGrid1.Cells <> '' then
begin
StringGrid1.RowCount := StringGrid1.RowCount + 1;
StringGrid1.Cells := inttostr(StringGrid1.RowCount - 1);
end;
StringGrid1.Cells := Edit4.Text;//经度
StringGrid1.Cells := Edit5.Text;//纬度
StringGrid1.Cells := Edit3.Text;//速度
end;
procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: PChar;
BufferLength: Word);
var
ch: char;
name: String;
begin
Timer1.Tag := Timer1.Tag + 1;
//move(Buffer^, ch, 1);
ch := Buffer;
if ch >= ' ' then GPSBuffers := GPSBuffers + ch
else
begin
if ch = #10 then GPSBuffers := ''
else if ch = #13 then
begin
if GPSBuffers = '$' then
begin
if Memo1.Lines.Count >= 88 then
Memo1.Lines.Clear;
Memo1.Lines.Add(GPSBuffers);
name := GetGpsMess(GPSBuffers, 0);
if name = 'GPGGA' then
begin
Edit2.Text := GpsTimeFormat(GetGpsMess(GPSBuffers, 1));//时间
Edit4.Text := GetGpsMess(GPSBuffers, 4);//经度
Edit5.Text := GetGpsMess(GPSBuffers, 2);//纬度
Edit6.Text := GetGpsMess(GPSBuffers, 7);//星数
Edit7.Text := GetGpsMess(GPSBuffers, 6);//状态
Edit8.Text := GetGpsMess(GPSBuffers, 9);//高度
StatusBar1.Panels.Items.Text := '';
end
else if name = 'GPRMC' then
begin
Edit1.Text := GpsDateFormat(GetGpsMess(GPSBuffers, 9));//日期
Edit2.Text := GpsTimeFormat(GetGpsMess(GPSBuffers, 1));//时间
Edit3.Text := GetGpsMess(GPSBuffers, 7);//速度
Edit17.Text := GetGpsMess(GPSBuffers, 8);//方向
Edit4.Text := GetGpsMess(GPSBuffers, 5);//经度
Edit5.Text := GetGpsMess(GPSBuffers, 3);//纬度
StatusBar1.Panels.Items.Text := '';
end
else Exit;
if Edit15.Text = '' then
begin
Edit15.Text := Edit2.Text;//时间
Edit9.Text := Edit4.Text;
Edit10.Text := Edit4.Text;
Edit12.Text := Edit5.Text;
Edit13.Text := Edit5.Text;
end
else
begin
if Edit9.Text < Edit4.Text then Edit9.Text := Edit4.Text;
if Edit10.Text > Edit4.Text then Edit10.Text := Edit4.Text;
if Edit12.Text < Edit5.Text then Edit12.Text := Edit5.Text;
if Edit13.Text > Edit5.Text then Edit13.Text := Edit5.Text;
Edit11.Text := inttostr(strtoint(copy(Edit9.Text, 7, 4)) - strtoint(copy(Edit10.Text, 7, 4)));
Edit14.Text := inttostr(strtoint(copy(Edit12.Text, 6, 4)) - strtoint(copy(Edit13.Text, 6, 4)));
Edit16.Text := FormatFloat('0.00', 0.1805 * sqrt(sqr(strtoint(Edit11.Text)) + sqr(strtoint(Edit14.Text)))) + '米';
end;
end;
end
else
begin
StatusBar1.Panels.Items.Text := '波特率设置错误!!!';
Comm1.PortOpen := false;
if ComboBox2.ItemIndex >= (ComboBox2.Items.Count - 1) then ComboBox2.ItemIndex := 0
else ComboBox2.ItemIndex := ComboBox2.ItemIndex + 1;
Comm1.BaudRate := strtoint(ComboBox2.Items);//波特率4800
Comm1.PortOpen := true;
end;
end;
end;
procedure TForm1.ComboBox2Change(Sender: TObject);
begin
Comm1.PortOpen := false;
Comm1.BaudRate := strtoint(ComboBox2.Items);//波特率4800
Comm1.PortOpen := true;
StatusBar1.Panels.Items.Text := '';
end;
procedure TForm1.BitBtn6Click(Sender: TObject);
var
sum: byte;
i, j: integer;
str: string;
begin
if Comm1.PortOpen then
begin
for i := 1 to 14 do
begin
str := '$PGRMO,' + TCheckBox(GroupBox2.Controls).Caption + ',';
if TCheckBox(GroupBox2.Controls).Checked then str := str + '1'
else str := str + '0';
sum := 0;
for j := 2 to length(str) do
begin
sum := sum xor byte(str);
end;
str := str+ '*' + inttohex(sum, 2) + #13#10;
Comm1.Output := str;
end;
sum := 0;
str := '$PGRMC1,1,,,,,,,N,N';
for i := 2 to length(str) do
begin
sum := sum xor byte(str);
end;
str := str+ '*' + inttohex(sum, 2) + #13#10;
Comm1.Output := str;
end;
end;
procedure TForm1.BitBtn5Click(Sender: TObject);
var
i: integer;
sum: byte;
str: string;
begin
if Comm1.PortOpen then
begin
sum := 0;
str := '$PGRMC,A,,,,,,,,,' + inttostr(ComboBox3.ItemIndex + 1) + ',,,1';
for i := 2 to length(str) do
begin
sum := sum xor byte(str);
end;
str := str+ '*' + inttohex(sum, 2) + #13#10;
Comm1.Output := str;
StatusBar1.Panels.Items.Text := '请关闭GPS电源,在上电后新波特率才有效!!!';
end;
end;
procedure TForm1.BitBtn4Click(Sender: TObject);
var
i: integer;
sum: byte;
str: string;
begin
if Comm1.PortOpen then
begin
sum := 0;
str := '$PGRMIX';
for i := 2 to length(str) do
begin
sum := sum xor byte(str);
end;
str := str+ '*' + inttohex(sum, 2) + #13#10;
Comm1.Output := str;
sum := 0;
str := '$PGRMCX';
for i := 2 to length(str) do
begin
sum := sum xor byte(str);
end;
str := str+ '*' + inttohex(sum, 2) + #13#10;
Comm1.Output := str;
sum := 0;
str := '$PGRMC1X';
for i := 2 to length(str) do
begin
sum := sum xor byte(str);
end;
str := str+ '*' + inttohex(sum, 2) + #13#10;
Comm1.Output := str;
sum := 0;
str := '$PGRMO,GPALM,1';
for i := 2 to length(str) do
begin
sum := sum xor byte(str);
end;
str := str+ '*' + inttohex(sum, 2) + #13#10;
Comm1.Output := str;
end;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
i: integer;
sum: byte;
str: string;
begin
if Comm1.PortOpen then
begin
if Timer1.Tag = 0 then
begin
Comm1.PortOpen := false;
if ComboBox2.ItemIndex >= (ComboBox2.Items.Count - 1) then ComboBox2.ItemIndex := 0
else ComboBox2.ItemIndex := ComboBox2.ItemIndex + 1;
Comm1.BaudRate := strtoint(ComboBox2.Items);//波特率4800
Comm1.PortOpen := true;
sum := 0;
str := '$PGRMIX';
for i := 2 to length(str) do
begin
sum := sum xor byte(str);
end;
str := str+ '*' + inttohex(sum, 2) + #13#10;
Comm1.Output := str;
sum := 0;
str := '$PGRMCX';
for i := 2 to length(str) do
begin
sum := sum xor byte(str);
end;
str := str+ '*' + inttohex(sum, 2) + #13#10;
Comm1.Output := str;
sum := 0;
str := '$PGRMC1X';
for i := 2 to length(str) do
begin
sum := sum xor byte(str);
end;
str := str+ '*' + inttohex(sum, 2) + #13#10;
Comm1.Output := str;
sum := 0;
str := '$PGRMO,GPALM,1';
for i := 2 to length(str) do
begin
sum := sum xor byte(str);
end;
str := str+ '*' + inttohex(sum, 2) + #13#10;
Comm1.Output := str;
end;
//Timer1.Tag := 0;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
str: String;
i, k: integer;
s: byte;
begin
str := Edit18.Text;
i := Pos('*', str);
if (i < 10) or (str <> '$') then
begin
Exit;
end;
s := 0;
for k := 2 to i - 1 do
begin
s := s xor byte(str);
end;
Edit19.Text :=inttohex(s, 2);
end;
end. 老菜有没有用AVR写的GPS程序啊,贴出来分享一下.呵呵! 马上发布用ARM写的,移植到AVR上不用几分钟~~~
/*--------------------------------------------------------------------------
LPCARM之GPS应用及使用状态机解码祥解
本程序在周立功的LPC213x开发板上调试通过,用汽车电子的串口通V3.22进行输出测试。
本程序是在FIFO和RTC例程的基础上追加GPS解码部分构成的。
注:只对常用的GPRMC和GPGGA语句进行了解码。
本程序主要是熟悉NMEA0183语句及使用状态机解码的优缺点,以及与传统解码程序的不同点。
菜地公告:引用本文必须注明出处!!!
菜农HotPower 2007.1.28 20:55 于西安大雁塔菜地 http://HotPower.21ic.org/
---------------------------------------------------------------------------*/
点击下载源代码压缩包: GPS.RAR
http://cache.amobbs.com/bbs_upload782111/files_6/armok01143142.gif
http://cache.amobbs.com/bbs_upload782111/files_6/armok01143144.jpg 图片确实晕 mark mark 好东西
页:
[1]