项目应用场景:
提示:项目里需要将杂乱的GPS代码解析并显示出来,并且实现自动保存成excel形式的文档,方便查看
问题描述:
串口接收: GPRMC格式的GPS信息,包含推荐最小定位信息。
消息格式为:
$GPRMC,HHMMSS.SS,A,DDMM.MMM,N,DDDMM.MMM,W,Z.Z,Y.Y,DDMMYY,D.D,V *CC:
上位机开发:
上位机界面
开发思路与源码:
第一部分:串口的基本设置
基础设置,包括串口号,波特率等等,打开串口设置
1.初始设计和打开串口按钮点击事件
private string saveFileName = null;
private string FilePath = null; // 打开文件路径
private string gpsinformation;
private object thisLock = new object(); // 锁住线程
public event SerialPortEventHandler comReceiveDataEvent = null; // 定义串口接收数据响应事件
// 数据状态
private static int receCount = 0; // 接收数据量
public SerialDebug()
{
InitializeComponent();
InitializeSerialSet(); // 初始化串口设置
}
/// <summary>
/// 串口初始化设置
/// </summary>
public void InitializeSerialSet()
{
InitializePorts(); // 初始化串口号
// 初始化波特率
comboBox_BandRate.Text = comboBox_BandRate.Items[3].ToString();
// 初始化校验位
comboBox_Check.Text = comboBox_Check.Items[0].ToString();
// 初始化数据位
comboBox_Data.Text = comboBox_Data.Items[0].ToString();
// 初始化停止位
comboBox_Stop.Text = comboBox_Stop.Items[0].ToString();
}
/// <summary>
/// 可用串口扫描,并且显示可用串口
/// </summary>
public void InitializePorts()
{
comboBox_Serial.Items.Clear(); // 清空原来的信息
// 返回可用串口号,形式:COM3
string[] arraysPostsNames = SerialPort.GetPortNames(); // 获取所有可用的串口号
if (arraysPostsNames.Length > 0)
// 检查串口号是否正确
{
Array.Sort(arraysPostsNames); // 使用默认进行排序,从小到大肾虚
for (int i = 0; i < arraysPostsNames.Length; i++)
{
comboBox_Serial.Items.Add(arraysPostsNames[i]); // 将所有可用串口加载到串口显示框当中
}
comboBox_Serial.Text = arraysPostsNames[0]; // 默认选择第一个串口
comboBox_Serial.Enabled = true; // 打开选择框
// 设置状态栏属性
toolStripStatus_Port.Text = "串口号:" + comboBox_Serial.Text; // 设置状态栏的情况
toolStripStatus_Port.ForeColor = Color.Black; // 设置为红色
}
else
{
toolStripStatus_Port.Text = "没有可用串口"; // 设置状态栏的情况
toolStripStatus_Port.ForeColor = Color.Red; // 设置为红色
comboBox_Serial.Text = "None"; // 提示没有可用串口
comboBox_Serial.Enabled = false; // 禁止打开串口选择框
}
}
/// <summary>
/// 串口读取数据响应方法
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void serialPortMonitor_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
ReceiveData();
//Thread.Sleep(60000);//线程挂起,单位为毫秒,延时一分钟接收数据
// delay(10000);
}
private void button_OK_Click(object sender, EventArgs e)
{
if (serialPort1 =