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))) * 60, 0, MidpointRounding.AwayFromZero)
) + "″";
/**//**//**//*獲取高度*/
gpsData.Height = Convert.ToDouble(
data.Substring(44, 2) + data.Substring(46, 2)
+ "." + data.Substring(49, 1));
#endregion
switch (data.Substring(18, 2))
......{
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();
設置數據設置數據#region 設置數據
/**//**//**//*獲取編號*/
gpsData.Terminal_Id = Convert.ToInt32(
Convert.ToString(bs[5], 16) + Convert.ToString(bs[6], 16) +
Convert.ToString(bs[7], 16) + Convert.ToString(bs[8], 16));
/**//**//**//*獲取時間*/
gpsData.AddTime = Convert.ToDateTime(
Convert.ToString(bs[10], 16) + ":"
+ Convert.ToString(bs[11], 16) + ":"
+ Convert.ToString(bs[12], 16));
gpsData.OriginalLatitude = Convert.ToDouble(
Convert.ToInt32(Convert.ToString(bs[13], 16)).ToString("00") + Convert.ToInt32(Convert.ToString(bs[14], 16)).ToString("00")
+ "."
+ Convert.ToInt32(Convert.ToString(bs[15], 16)).ToString("00") + Convert.ToInt32(Convert.ToString(bs[16], 16)).ToString("00")
);
/**//**//**//*獲取緯度*/
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(
Convert.ToInt32(Convert.ToString(bs[17], 16)).ToString("00") + Convert.ToInt32(Convert.ToString(bs[18], 16)).ToString("00") + Convert.ToInt32(Convert.ToString(bs[19], 16)).ToString("00")
+ "." + Convert.ToInt32(Convert.ToString(bs[20], 16)).ToString("00")
+ Convert.ToInt32(Convert.ToString(bs[21], 16)).ToString("00")
);
/**//**//**//*獲取經度*/
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))) * 60, 0, MidpointRounding.AwayFromZero)
) + "″";
;//Math.IEEERemainder(gpsData.Latitude, 100) / 60;
/**//**//**//*獲取高度*/
gpsData.Height = Convert.ToDouble(
Convert.ToInt32(Convert.ToString(bs[22], 16)).ToString("00") + Convert.ToInt32(Convert.ToString(bs[23], 16)).ToString("00")
+ "." + Convert.ToString(bs[24], 16));
#endregion
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());
}
按鈕事件處理按鈕事件處理#region 按鈕事件處理
private void MainFrom_Load(object sender, EventArgs e)
......{
f_BG.DoWork += new DoWorkEventHandler(bgWorkerAnalyze_DoWork);
f_BG.RunWorkerAsync();
toolStripButtonOpenPort.Enabled = true;
toolStripButtonClosePort.Enabled = false;
}
private void toolStripButtonConfig_Click(object sender, EventArgs e)
......{
if (toolStripButtonClosePort.Enabled != false)
......{
MessageBox.Show("請先關閉串口更改配置前先關閉串口", "提示");
return;
}
ConfigForm form = new ConfigForm();
if (form.ShowDialog() == DialogResult.OK)
......{
ports = new System.IO.Ports.SerialPort[SerialPortConfig.Ports.Count];
for (int i = 0; i < SerialPortConfig.Ports.Count; i++)
......{
ports[i] = new System.IO.Ports.SerialPort(SerialPortConfig.Ports[i].ToString());
ports[i].BaudRate = SerialPortConfig.BaudRate;
ports[i].Parity = SerialPortConfig.Parity;
ports[i].StopBits = SerialPortConfig.StopBits;
ports[i].DataBits = SerialPortConfig.DataBits;
ports[i].ReceivedBytesThreshold = 29;
//ports[i].ReadTimeout = 50;
}
}
}
private void toolStripButtonOpenPort_Click(object sender, EventArgs e)
......{
if (SerialPortConfig.Ports.Count == 0)
......{
MessageBox.Show("當前沒有已選擇串口請配置串口","提示");
return;
}
OpenPort();
tbPortState.Text += "已啓動接收數據……" + newline();
toolStripButtonOpenPort.Enabled = false;
toolStripButtonClosePort.Enabled = true;
}
private void toolStripButtonClosePort_Click(object sender, EventArgs e)
......{
tbPortState.Text += "已停止接收數據" + newline();
ClosePort();
toolStripButtonOpenPort.Enabled = true;
toolStripButtonClosePort.Enabled = false;
}
private void btnReceiveEnd_Click(object sender, EventArgs e)
......{
//btnReceiveEnd.Enabled = false;
//btnRecevieStart.Enabled = true;
tbPortState.Text += "已停止接收數據" + newline();
for (int i = 0; i < SerialPortConfig.Ports.Count; i++)
......{
ports[i].DataReceived -= new System.IO.Ports.SerialDataReceivedEventHandler(SPort_DataReceived);
}
}
private void btnSave_Click(object sender, EventArgs e)
......{
//btnSave.Enabled = false;
//StreamWriter sw = File.AppendText("ReceiveData.txt");
//sw.Write(tbView.Text);
//sw.Flush();
//sw.Close();
//MessageBox.Show("狀態信息保存成功","提示");
//btnSave.Enabled = true;
}
private void toolStripButtonSetTime_Click(object sender, EventArgs e)
......{
SetTimeForm form = new SetTimeForm(ports);
form.ShowDialog();
}
private void toolStripButtonEchoplex_Click(object sender, EventArgs e)
......{
EchoplexOperationForm form = new EchoplexOperationForm(ports);
form.ShowDialog();
}
private void toolStripButtonDBConfig_Click(object sender, EventArgs e)
......{
DBConfigForm form = new DBConfigForm();
form.ShowDialog();
}
private void btnClear_Click(object sender, EventArgs e)
......{
tbPortState.Text = "";
tbView.Text = "";
}
private void chkShowData_CheckedChanged(object sender, EventArgs e)
......{
if (chkShowData.Checked)
......{
IsShowData = true;
}
else
......{
IsShowData = false;
}
}
#endregion
}
}
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>