Posted on 2007-03-20 16:22
笑缘 阅读(5143)
评论(20) 编辑 收藏 网摘
最近写了个简单的串口接收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(0, 58));
f_SB.Remove(0, 58);
}
else

......{
f_SB.Remove(0, 4);
}
}
}
}
}
}
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();


设置数据设置数据#region 设置数据


/**//**//**//*获取编号*/
gpsData.Terminal_Id = Convert.ToInt32(data.Substring(10,2)+ data.Substring(12,2) +
data.Substring(14,2) + data.Substring(16,2));


/**//**//**//*获取时间*/
gpsData.AddTime = Convert.ToDateTime(
data.Substring(20, 2) + ":"
+ data.Substring(22, 2) + ":"
+ data.Substring(24, 2));


/**//**//**//*获取纬度*/
gpsData.OriginalLatitude = Convert.ToDouble(
data.Substring(26, 2) + data.Substring(28, 2)
+ "."
+ data.Substring(30, 2) + data.Substring(32, 2)
);


/**//**//**//*获取纬度*/
gpsData.Latitude = Convert.ToString(Math.Truncate(gpsData.OriginalLatitude / 100)) + "°" +
Convert.ToString(Math.Truncate(Math.IEEERemainder(gpsData.OriginalLatitude, 100))) + "′" +
Convert.ToString(
Math.Round(
(Math.IEEERemainder(gpsData.OriginalLatitude, 100) - Math.Truncate(Math.IEEERemainder(gpsData.OriginalLatitude, 100))) * 60, 0, MidpointRounding.AwayFromZero)
) + "″";



/**//**//**//*获取经度*/
gpsData.OriginalLongitude = Convert.ToDouble(
data.Substring(34, 2) + data.Substring(36, 2) + data.Substring(38, 2)
+ "." + data.Substring(40, 2)
+ data.Substring(42, 2)
);
gpsData.Longitude = Convert.ToString(Math.Truncate(gpsData.OriginalLongitude / 100)) + "°" +
Convert.ToString(Math.Truncate(Math.IEEERemainder(gpsData.OriginalLongitude, 100))) + "′" +
Convert.ToString(
Math.Round(
(Math.IEEERemainder(gpsData.OriginalLongitude, 100) - Math.Truncate(Math.IEEERemainder(gpsData.OriginalLongitude, 100)))&n