net2.0下实现串口接收GPS数据读写(-)

原创 2006年06月08日 15:00:00
最近写了个简单的串口接收GPS数据的程序,下面主程序中的代码,主要利用BackGroundWork组件来实现数据的接收。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using Microsoft.Practices.EnterpriseLibrary.Data;
using Microsoft.Practices.EnterpriseLibrary.Data.Sql;
using System.Data.Common;
using System.Collections;

namespace GPSSerialPortData
...
{
    
public partial class MainFrom : Form
    ...
{
        
private System.IO.Ports.SerialPort[] ports = null;
        
private bool IsShowData = false;
        StringBuilder f_SB 
= new StringBuilder();    

        
public MainFrom()
        ...
{            
            InitializeComponent(); 
        }


        
private string newline()
        ...
{
           
return " ";
        }


        
/**//// <summary>
        
/// 打开串口并开始数据接收
        
/// </summary>

        private void OpenPort()
        ...
{
            
for (int i = 0; i < SerialPortConfig.Ports.Count; i++)
            ...
{
                
try
                ...
{
                    ports[i].Open();
                    ports[i].DataReceived 
+= new System.IO.Ports.SerialDataReceivedEventHandler(SPort_DataReceived);
                    tbPortState.Text 
+= "串口" + ports[i].PortName + "已经打开" + newline();
                }

                
catch
                ...
{
                    tbPortState.Text 
+= "串口" + ports[i].PortName + "不存在或已占用" + newline();
                }

            }

        }


        
/**//// <summary>
        
/// 停止数据接收并关闭串口
        
/// </summary>

        private void ClosePort()
        ...
{
            
for (int i = 0; i < SerialPortConfig.Ports.Count; i++)
            ...
{
                
try
                ...
{
                    
if (ports[i].IsOpen)
                    ...
{
                        ports[i].DataReceived 
-= new System.IO.Ports.SerialDataReceivedEventHandler(SPort_DataReceived);
                        ports[i].Close();                        
                    }

                    tbPortState.Text 
+= "串口" + ports[i].PortName + "已经关闭" + newline();
                }

                
catch
                ...
{
                    tbPortState.Text 
+= "串口" + ports[i].PortName + "不存在或已占用" + newline();
                }

            }

        }

       
          
        
private void AddReceiveData(byte[] bytes)
        ...
{
            
lock (f_SB)
            ...
{
                
foreach (byte b in bytes)
                ...
{
                    
if (b < 16)
                    ...
{
                        f_SB.Append( 
"0"+Convert.ToString(b, 16).ToUpper());
                    }

                    
else
                    ...
{
                        f_SB.Append(Convert.ToString(b, 
16).ToUpper());
                    }

                }

            }

        }

        BackgroundWorker f_BG 
= new BackgroundWorker();
        
private void bgWorkerAnalyze_DoWork(object sender, DoWorkEventArgs e)
        ...
{
            
while (true)
            ...
{
                
if (f_SB.Length < 58)
                ...
{
                    System.Threading.Thread.Sleep(
200);
                }

                
else
                ...
{
                    
lock (f_SB)
                    ...
{
                        
while (f_SB.Length>=58)
                        ...
{
                            
if (f_SB.ToString().Substring(0,4).ToUpper() == "ACAC")
                            ...
{
                                SaveGPSData(f_SB.ToString().Substring(
058));
                                f_SB.Remove(
058);
                            }

                            
else
                            ...
{
                                f_SB.Remove(
04);
                            }

                        }
                  
                    }

                }

            }

        }

        
void SPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        ...
{
            System.IO.Ports.SerialPort serialPort 
= (System.IO.Ports.SerialPort)sender;
            
            
//此处 在测试时不能够确定出发的次数 故做了长度判断当长度为0时 不予考虑
            int len = serialPort.BytesToRead;
            
byte[] bs = new byte[len];
            serialPort.Read(bs, 
0, len);
            
if (len == 0)
            ...
{
                
return;
            }

            
else
            ...
{
                BackgroundWorker bgWorker 
= new BackgroundWorker();
                bgWorker.DoWork 
+= new DoWorkEventHandler(bgWorker_DoWork);
                bgWorker.RunWorkerAsync(bs);
                
return;
            }

        }


        
private void bgWorker_DoWork(object sender, DoWorkEventArgs e)
        ...
{
            
byte[] bs = (byte[])e.Argument;
            AddReceiveData(bs);
        }


        
delegate void ShowGPSDataCallback(string text);

        
private void ShowGPSData(string message)
        ...
{
            
if (tbView.InvokeRequired == true)
            ...
{
                ShowGPSDataCallback callback 
= new ShowGPSDataCallback(ShowGPSData);
                tbView.Invoke(callback, message);
            }

            
else
            ...
{
                tbView.Text 
+= message;
            }

        }


        
private void SaveGPSData(string data)
        ...
{
            GPSData gpsData 
= new GPSData();

            设置数据
设置数据

            
switch (data.Substring(182))
            ...
{
                
case "89":
                    
if (IsShowData)
                    ...
{
                        ShowGPSData(
                            
"终端" + gpsData.Terminal_Id +
                            
" 北纬" + gpsData.Latitude +
                            
" 东经" + gpsData.Longitude+
                            
" 海拔" + gpsData.Height.ToString() +
                            
" 时间" + gpsData.AddTime.ToString("hh:mm:ss" + newline())
                            );
                    }

                    
break;
                
case "4B":
                    ShowGPSData(gpsData.Terminal_Id 
+ "时间设置成功" + newline());
                    
return;
                
case "50":
                    ShowGPSData(gpsData.Terminal_Id 
+ "已停止回送数据" + newline());
                    
return;
                
default:
                    
return;
            }


            SaveData(gpsData);
        }



        
/**//// <summary>
        
/// 保存接收到的GPS数据
        
/// </summary>
        
/// <param name="bs"></param>

        private void SaveGPSData(byte[] bs)
        ...
{
            GPSData gpsData 
= new GPSData();
           
            设置数据
设置数据

            
switch (Convert.ToString(bs[9], 16).ToUpper())
            ...
{
                
case "89":
                    
if (IsShowData)
                    ...
{
                        ShowGPSData(
                            
"终端" + Convert.ToInt32(Convert.ToString(bs[5], 16+ Convert.ToString(bs[6], 16+ Convert.ToString(bs[7], 16+ Convert.ToString(bs[8], 16)).ToString() +
                            
" 北纬" + gpsData.Latitude +
                            
" 东经" + gpsData.Longitude +
                            
" 海拔" + gpsData.Height.ToString() +
                            
" 时间" + gpsData.AddTime.ToString("hh:mm:ss" + newline())
                            );
                    }

                    
break;
                
case "4B":
                    ShowGPSData(Convert.ToInt32(
                 Convert.ToString(bs[
5], 16+ Convert.ToString(bs[6], 16+
                 Convert.ToString(bs[
7], 16+ Convert.ToString(bs[8], 16)).ToString() + "时间设置成功" + newline());
                    
return;
                
case "50":
                    ShowGPSData(Convert.ToInt32(
                 Convert.ToString(bs[
5], 16+ Convert.ToString(bs[6], 16+
                 Convert.ToString(bs[
7], 16+ Convert.ToString(bs[8], 16)).ToString() + "已停止回送数据" + newline());
                    
return;
                
default:
                    
return;
            }


            SaveData(gpsData);
        }


        
private void SaveData(GPSData data)
        ...
{
            Database db 
= DatabaseFactory.CreateDatabase();
            StringBuilder sb 
= new StringBuilder();
            sb.Append(
"INSERT INTO [soft_sailingservice].[dbo].[NS_GPS_Data]");
            sb.Append(
"([TerminalNumber],[Latitude],[OriginalLatitude],[Longitude],[OriginalLongitude],[Height],[AddTime])");
            sb.Append(
"VALUES (");
            sb.Append(data.Terminal_Id 
+ ",'");
            sb.Append(data.Latitude 
+ "',");
            sb.Append(data.OriginalLatitude 
+ ",'");
            sb.Append(data.Longitude 
+ "',");
            sb.Append(data.OriginalLongitude 
+ ",");
            sb.Append(data.Height 
+ ",'");
            sb.Append(data.AddTime 
+ "')");
            db.ExecuteNonQuery(CommandType.Text, sb.ToString());
        }


        按钮事件处理
按钮事件处理
    }

}

 

源码下载路径:http://download.csdn.net/source/161373

<script type="text/javascript"><!-- google_ad_client = "pub-8490214103805077"; google_ad_width = 468; google_ad_height = 60; google_ad_format = "468x60_as"; google_ad_type = "text_image"; google_ad_channel = ""; //--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>

串口接收gps多组数据并解析

最近做一个关于交通灯的项目,利用stm32串口接收gps数据并解析显示。刚开始用的原子的例程解析一条数据没啥问题,但同时解析多条数据就不行了,可能我说的不太清楚,直接上例子!    因为用到的一般都...
  • qq_27330321
  • qq_27330321
  • 2018年01月24日 16:39
  • 42

GPS串口数据接收程序实例

GPS串口数据接收程序实例摘 要:目前GPS(全球定位系统)定位应用市场日趋成熟,正在进入应用的高速发展时期。本文以一款EverMore公司的GM-X205GPS接受模块为例,介绍了其数据格式,以及应...
  • haoxingfeng
  • haoxingfeng
  • 2008年02月21日 21:56
  • 1411

GPS和PDA 的串口通信程序

最近搞了PDA 和GPS相结合的一个项目,在写串口程序的时候遇到了一点问题,困饶了好几天都没有解决.最后是因为测试的方法不对引起的.我测试的时候是现在一台机器上面写一个字符串,然后读取他,结果啥都没读...
  • zhiyuzhe
  • zhiyuzhe
  • 2006年12月15日 16:02
  • 3640

GPS数据读取与处理

GPS数据读取与处理 GPS模块简介 SiRF芯片在2004年发布的最新的第三代芯片SiRFstar III(GSW 3.0/3.1),使得民用GPS芯片在性能方面登上了一个顶峰,灵敏度比以前的产...
  • ywb201314
  • ywb201314
  • 2016年02月19日 17:54
  • 958

Linux下用C实现串口读写(转)

  http://hi.baidu.com/%CD%FE%B5%C4%C9%FA%BB%EE/blog/item/0110068308c5fb9cf603a6be.html 之前要做一个和串口相...
  • fengyunjh
  • fengyunjh
  • 2010年12月16日 18:28
  • 4571

c# 串口读取GPS信息

NMEA 0183是美国国家海洋电子协会(National Marine Electronics Association)为海用电子设备制定的标准格式。现在已经成为GPS导航设备统一的RTCM(Rad...
  • yal179
  • yal179
  • 2014年05月05日 15:28
  • 1350

读取串口过来的GPS信息并分析其中内容

考察C程序员是否合格的一个重要标准就是看他操作字符串的能力,一个合格的C程序员应该可以熟练的对字符串进行拆分、组合、格式转换以及搜索定位,从一堆数据中提取出有效信息。 比如说我们要做一个GPS导航的...
  • jiangjiankang
  • jiangjiankang
  • 2011年09月02日 13:43
  • 3261

串口的读写,文件读写

串口操作(下) 以下是我写的一些程序,主要就是实现给串口发送命令,接收串口反馈给PC机的信息,并且把信息保存在文件中。...
  • flowers_wikey
  • flowers_wikey
  • 2017年03月15日 14:51
  • 436

读写串口的实现(一)

* Windows自动识别串口的实现,以下是基于MFC开发的,以下所说都是建立在串口注册表上说的 *实现Windows系统下自动识别串口需要调用三个Windows API函数,它们是: //主要用于打...
  • wzc18743083828
  • wzc18743083828
  • 2014年12月18日 18:35
  • 1760

linux环境下C语言实现非阻塞方式读取字符串数据的串口测试程序,即串口工具的编写

本文提供了设置串口通讯的接口,方便大家对程序的复用,感觉还是面向对象的语言更方便呀;在给模块发送指令后需要读取模块返回的数据时,保险起见采用阻塞式读取,且串口一次只能读取8位byte数据,注意读取数据...
  • psy6653
  • psy6653
  • 2016年08月01日 12:54
  • 3569
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:net2.0下实现串口接收GPS数据读写(-)
举报原因:
原因补充:

(最多只允许输入30个字)