首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

怎么通过serialport读取GPS 数据

2012-01-15 
如何通过serialport读取GPS 数据!如何通过serialport读取GPS 数据!由于需要考虑信号问题,所以希望在1分钟

如何通过serialport读取GPS 数据!
如何通过serialport读取GPS 数据!

由于需要考虑信号问题,所以希望在1分钟之类进行不断刷新,直到读到数据位置。否则提示无法接受GPS信号

[解决办法]
你是要每一分钟检测一下有没有数据,还是要接收1分钟数据呀
[解决办法]
应该是收到数据就 显示吧.这样才能保证数据不丢失.
[解决办法]
不知道你想要干什么...下面就是个接收事件,有数据来了就收...自己看着改

C# code
SerialPort SPCom = new SerialPort("COM1",9600);SPCom.Open(); private void SPCom_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)        {            //定义变量            byte[] BufferBytes,ReceivedBuff;                        int Count;            Count = SPCom.BytesToRead;            //得到数据              BufferBytes = new Byte[Count];            SPCom.Read(BufferBytes, 0, Count);            for (int i = 0; i < Count; i++)            {                ReceivedBuff[i]= BufferBytes[i];            }        }
[解决办法]
C# code
1using System; 
2using System.IO.Ports;
3using System.Collections;
4using System.Collections.Generic;
5using System.Windows.Forms;
6using System.Runtime.InteropServices;
7
8namespace Lordeo.AssetMan.PPC.App
9{
10  public class GpsMonitor
11  {
12    private SerialPort m_serialPort;
13
14    private System.Windows.Forms.Timer m_timer;
15    private const int defaultTimerInterval = 800; //越快越容易出错
16    //读取到事件
17    public event EventHandler OnDataRecieved;
18    //临时存储读取的信息
19    private string m_dataReaded = string.Empty;
20
21    /**//// <summary>
22    /// 构造
23    /// </summary>
24    public GpsMonitor()
25    {
26      //timer
27      m_timer = new System.Windows.Forms.Timer();
28      m_timer.Interval = defaultTimerInterval;
29      m_timer.Tick += new EventHandler(Timer_Tick);
30
31      //设置端口的默认值
32      m_serialPort = new SerialPort();
33      m_serialPort.ReadBufferSize = 2048;
34      m_serialPort.BaudRate = 4800; //P800默认的速率,过高的速率容易产生误码
35      m_serialPort.DataBits = 8;
36      m_serialPort.Parity = Parity.None;
37      m_serialPort.StopBits = StopBits.One;
38      m_serialPort.ReadTimeout = 2000;//超时
39      m_serialPort.PortName = "COM4"; //多数GPS都用COM4
40
41      m_serialPort.ErrorReceived += new SerialErrorReceivedEventHandler(SerialPort_ErrorReceived);
42    }
43
44    private void SerialPort_ErrorReceived(object sender, SerialErrorReceivedEventArgs e)
45    {
46      this.Message = e.ToString();
47    }
48
49    timer#region timer
50    /**//// <summary>
51    /// 计时器工作
52    /// </summary>
53    /// <param name="sender"> </param>
54    /// <param name="e"> </param>
55    private void Timer_Tick(object sender, EventArgs e)
56    {
57      try
58      {
59        if (!string.IsNullOrEmpty(m_serialPort.ReadLine()))
60        {


61          this.Message = m_serialPort.ReadLine();
62
63
64        }
65      }
66      catch (Exception ex)
67      {
68        if (ex.GetType() == typeof(System.TimeoutException))
69        {
70          //this.StopWatch();
71          this.Message = "操作超时,请确认设备是否已经打开或尝试其他端口。";
72        }
73      }
74    }
75    #endregion
76
77    OpenSerialPort#region OpenSerialPort
78    /**//// <summary>
79    /// 打开端口
80    /// </summary>
81    private void OpenSerialPort()
82    {
83      if (!m_serialPort.IsOpen)
84      {
85        try
86        {
87          m_serialPort.Open();
88        }
89        catch (Exception x)
90        {
91          this.Message = x.Message;
92          this.StopWatch();
93        }
94      }
95    }
96    #endregion
97
98    CloseSerialPort#region CloseSerialPort
99    /**//// <summary>
100    /// 关闭端口
101    /// </summary>
102    private void CloseSerialPort()
103    {
104      m_serialPort.Close();
105    }
106    #endregion
107
108    properties#region properties
109    /**//// <summary>
110    ///设置读取的时间间隔,单位毫秒
111    /// </summary>
112    public int Interval
113    {
114      set
115      {
116        this.m_timer.Interval = value;
117      }
118    }
119
120
121    /**//// <summary>
122    /// 执行读取
123    /// </summary>
124    public void BeginWatch()
125    {
126      OpenSerialPort();
127      m_timer.Enabled = true;
128    }
129    /**//// <summary>
130    /// 停止读取
131    /// </summary>
132    public void StopWatch()
133    {
134      m_timer.Enabled = false;
135      CloseSerialPort();
136    }
137
138    /**//// <summary>
139    /// 读取到的信息
140    /// </summary>
141    public string Message
142    {
143      set
144      {
145        m_dataReaded = value;
146        OnDataRecieved(this, null);
147      }
148      get
149      {
150        return m_dataReaded;
151      }
152    }
153
154    /**//// <summary>
155    /// 设置波特率
156    /// </summary>
157    public int BaudRate
158    {
159      get { return m_serialPort.BaudRate; }
160      set { m_serialPort.BaudRate = value; }


161    }
162
163    /**//// <summary>
164    /// 数据位
165    /// </summary>
166    public int DataBits
167    {
168      get { return m_serialPort.DataBits; }
169      set { m_serialPort.DataBits = value; }
170    }
171    /**//// <summary>
172    /// 校验协议
173    /// </summary>
174    public Parity ParityType
175    {
176      get { return m_serialPort.Parity; }
177      set { m_serialPort.Parity = value; }
178    }
179    /**//// <summary>
180    /// 停止位
181    /// </summary>
182    public StopBits StopBitsType
183    {
184      get { return m_serialPort.StopBits; }
185      set { m_serialPort.StopBits = value; }
186    }
187    /**//// <summary>
188    /// 端口号
189    /// </summary>
190    public string PortName
191    {
192      get { return m_serialPort.PortName; }
193      set { m_serialPort.PortName = value; }
194    }
195    #endregion
196
197    获取可用端口#region 获取可用端口
198    /**//// <summary>
199    /// 获取本机可用端口名称
200    /// </summary>
201    /// <returns> </returns>
202    public string[] GetPortNames()
203    {
204      ArrayList ports = new ArrayList();
205
206      uint hPort = INVALID_FILE_HANDLE;
207
208      string port = string.Empty;
209
210      for (int i = 0; i < 10; i++)
211      {
212        port = "COM" + i.ToString() + ":";
213
214        hPort = CreateFile(port, GENERIC_READ, 0, 0, OPEN_EXISTING, 0, IntPtr.Zero);
215        if (hPort != INVALID_FILE_HANDLE)
216        {
217          ports.Add(port);
218          Console.WriteLine(port);
219          CloseHandle(hPort);
220        }
221      }
222
223      return (string[])ports.ToArray(typeof(string));
224    }
225
226    wince defination#region wince defination
227    private const uint GENERIC_READ = 0x80000000;
228    private const uint OPEN_EXISTING = 3;
229    private const uint INVALID_FILE_HANDLE = 0xFFFFFFFF;
230
231    [DllImport("coredll.dll")]
232    static extern uint CreateFile(string lpFileName, uint dwDesiredAccess, uint dwShareMode, uint lpSecurityAttributes, uint dwCreationDisposition, uint dwFlagsAndAttributes, IntPtr notUsedPassZero);
233
234    [DllImport("coredll.dll")]
235    static extern int CloseHandle(uint hObject);
236    #endregion
237
238    #endregion
239  }
240}
241


[解决办法]
这里有个源程序,不知道对阁下有用没。 
http://freshmeat.net/projects/gpsd/
[解决办法]
顶3楼,mark一下
------解决方案--------------------


这里是2个问题。我懒,没兴趣写代码给你。你自己找找帮助。
1.处理gps数据,如果你用的是通用gps板,考虑要分析的格式,例如GPGGA,GPGSV之类的。分析方法可以就在串口的DataReceived事件里写,分析过程分为2部分,数据缓存和数据分析。首先,你要了解,串口是一个流设备,每次串口数据线变化状态都会通知并调用DataReceived事件,所以你的这个事件会很频繁的被调用,不过还好。这个事件和你的ui界面并非在同一个线程上。serialport类已经创建了单独的监听线程,你的方法也运行在这个线程上。
所以,你要先吧每次收到的数据缓存起来,保证不丢数据是第一的。然后检查标志位,比如看是否存在连续的$GPGGA的字符,并且在之后出现过*[A-F]{2}。如果都复合,数据接受完整,分析并尝试用事件方式通知你的ui界面。还有,此时要记得吧分析后的,不要的内容从缓存里清除掉。
以上就是数据的缓存和分析。
2.要保证连续1分钟没数据就认为没数据,这个好说。你可以设置一个变量,bool bNew = false;
在DataReceived方法里,第一行就设置bNew = true。并创建一个定时器,定时1分钟检测一次,检测代码如下
void timerevent(....)
{
if(bNew == false) MsgBox "Err read gps data , no data above 1 minute.";
else bNew = false;
}


你的问题,我想我说明白了。希望你不要继续的再说希望有人贴代码给你了。关键部分和思路都有了。再要代码就太懒了。

热点排行