源:NMEA协议 上位机 c#

前些时间写做了两款用NMEA协议的上位机,在这里做一个总结和记录。和大家分享,也为了以后不会忘记。

NMEA协议总体来说,相对简单,是气象上比较成熟的协议。

主要有以下几个参数及其格式:

  1. 风速和风向;

  2. 空气温度;

  3. 土壤温度;

  4. 湿度;

  5. 大气压;

注:

其中效验部分主要采用的 异或效验:即从$后第一个字符到’*’前一个字符进行异或。所得到的数据高4位,低4位的ASCII码。

<CR>: ‘\r’

<LF>: ‘\n’

波特率:4800

刷新频率:1Hz

在上位机的设计中,所有的接收方式都是被动的。所以处理上非常好做,只需要读取特定的数据位就可以,将其转为数据即可。

由于每一段数据都是以’\n’结尾,所以串口中断serialPortX_DataReceived()中直接采用serialPortX.ReadLine()读取数据就可以了。读取后根据协议分析其数据就可以了。以下是我的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace 气象监控_NMEA
{
class NMEA
{
#region 变量
public float speed = 0f;
public float direction = 0f;
public float airTemp = 0f;
public float soilTemp = 0f;
public float humidity = 0f;
public float barometer = 0f;
public bool speedStatus = false; private const int MAX_LENGTH = ;
private readonly byte SUM_END = Convert.ToByte('*');
private readonly byte SUM_START = Convert.ToByte('$');
private readonly byte NUM_0_ASCII = Convert.ToByte('');
private readonly byte NUM_A_ASCII = Convert.ToByte('A' - );
#endregion #region 属性
public float GetSpeed
{
get
{
return speed;
}
set
{
speed = value;
}
} public float GetDirection
{
get
{
return direction;
}
set
{
direction = value;
}
} public bool GetStatus
{
get
{
return speedStatus;
}
set
{
speedStatus = value;
}
} public float GetAirTemp
{
get
{
return airTemp;
}
set
{
airTemp = value;
}
} public float GetSoilTemp
{
get
{
return soilTemp;
}
set
{
soilTemp = value;
}
} public float GetHumidity
{
get
{
return humidity;
}
set
{
humidity = value;
}
} public float GetBarometer
{
get
{
return barometer;
}
set
{
barometer = value;
}
}
#endregion #region 子函数
/// <summary>
/// 数字转ASCII
/// </summary>
/// <param name="Integer">单个位整数</param>
/// <returns>ASCII</returns>
public byte Integer2Char(int Integer)
{
byte lcv_ch = ;
if (Integer <= )
{
lcv_ch = Convert.ToByte(Integer + NUM_0_ASCII);
}
else if ((Integer >= 0x0A) && (Integer <= 0x0F))
{
lcv_ch = Convert.ToByte(Integer + NUM_A_ASCII);
}
return lcv_ch;
} #endregion /// <summary>
/// sum效验
/// </summary>
/// <param name="array">效验数组</param>
/// <returns>效验值,字符被拆分为两个ASCII码整和为一个Int,高位在int高8位,低后</returns>
public int CheckSum(byte[] array)
{
byte sum = ;
int res = ;
int i;
for (i = ; (array[i] != SUM_END) && (i < MAX_LENGTH); i++ )
{
sum ^= array[i];
} if (i != MAX_LENGTH)
res = (Integer2Char((sum >> )) << ) | Integer2Char(sum & 0xF);
return res;
} /// <summary>
/// 从接收到的字符串中,取出有用数据
/// </summary>
/// <param name="str">接收到的字符串</param>
public void DataProcess(string str)
{
char[] chSplit = {',',};
string[] strArray = str.Split(chSplit);
switch (strArray[])
{
case "$WIMWV" :
direction = float.Parse(strArray[]);
speed = float.Parse(strArray[]);
char[] chArray = strArray[].ToCharArray();
speedStatus = (chArray[] == 'A' ? true : false);
break; case "$WIMTA" :
airTemp = float.Parse(strArray[]);
break; case "$WIMTS" :
soilTemp = float.Parse(strArray[]);
break; case "$WIMHU" :
humidity = float.Parse(strArray[]);
break; case "$WIMMB" :
barometer = float.Parse(strArray[]);
break; default: break;
}
} /// <summary>
/// 接收到的数据正确性判断
/// </summary>
/// <param name="str">接收到的字符串</param>
/// <returns>效验正常返回true</returns>
public bool ReceiveCheck(string str)
{
bool res = false;
char[] chSplit = {'*',};
string[] strArray = str.Split(chSplit);
if (strArray.Length == )
{
if (strArray[].Length == ) //长度正常
{
byte[] array = Encoding.Default.GetBytes(strArray[]);
int check = CheckSum(Encoding.Default.GetBytes(str));
if (check != )
{
if (check == ((array[] << ) | array[]))
{
res = true;
}
}
}
}
return res;
}
}
}

NMEA协议 上位机 C# (转)的更多相关文章

  1. C# MODBUS协议 上位机(转)

    源:C# MODBUS协议 上位机 C#写了一款上位机监控软件,基于MODBUS_RTU协议. 软件的基本结构: 采用定时器(Timer控件)为时间片. 串口采用serialPort1_DataRec ...

  2. LPC1768IAP(详解,有上位机)

    之前说了stm32的iap编程,今天天气真好,顺手就来说说lpc1788的iap编程(没看前面的请查看stm笔记下的内容) 首先是flash的算法,lpc1768并没有寄存器来让我们操作flash,他 ...

  3. STM32_IAP详解(有代码,有上位机)

    Iap,全名为in applacation programming,即在应用编程,与之相对应的叫做isp,in system programming,在系统编程,两者的不同是isp需要依靠烧写器在单片 ...

  4. C#上位机串口控制12864显示

    实现的效果 上面是用Proteus仿真的,,对了如果自己想用proteus仿真需要安装下面这个软件 再看一下实物显示效果 先做上位机部分........... 为了程序一启动就把电脑上能用的串口号显示 ...

  5. 医疗器械c#上位机开发指引教程

    此教程面向的读者:对医疗器械上位机编程有兴趣,或者急需了解医疗器械(尿常规.血液分析.生化.心电.B超等医疗下位仪器)的编程流程.编程细节的程序员. 1.得到仪器协议 当我们需要与医疗器械等下位机数据 ...

  6. c#上位机与三菱PLC(FX3U)串口通讯

    项目中会经常用到上位机与PLC之间的串口通信,本文介绍一下C#如何编写上位机代码 与三菱FX3U进行通讯 1. 第一种方法是自己写代码实现,主要代码如下: //对PLC的Y7进行置1 byte[] Y ...

  7. 物联网框架ServerSuperIO.Core(.netcore)跨平台,一套设备驱动通吃嵌入式、上位机、云服务

    1.      概述... 2 2.      ServerSuperIO.Core跨平台开发环境... 2 3.      ServerSuperIO.Core特点... 2 4.      Ser ...

  8. CY7C68013 USB接口相机开发记录 - 第四天:上位机编写1

    前面学习了USB相机硬件固件.设备驱动,可以实现USB设备识别.数据发送的功能.然后,非常重要的一部分,USB设备发出的数据,我要怎么接受,怎么查看发送的数据是否是正确的.网上百度了下,大部分人都使用 ...

  9. 基于uFUN开发板的心率计(三)Qt上位机的实现

    前言 上两周利用周末的时间,分别写了基于uFUN开发板的心率计(一)DMA方式获取传感器数据和基于uFUN开发板的心率计(二)动态阈值算法获取心率值,介绍了AD采集传感器数据和数据的滤波处理获取心率值 ...

随机推荐

  1. Android OpenGL ES(十二):三维坐标系及坐标变换初步 .

    OpenGL ES图形库最终的结果是在二维平面上显示3D物体(常称作模型Model)这是因为目前的打部分显示器还只能显示二维图形.但我们在构造3D模型时必须要有空间现象能力,所有对模型的描述还是使用三 ...

  2. eclipse背景颜色修改插件color theme

    对于长时间编码的程序猿来说,这个插件可以说是福音了. 安装方式有两种: 1.可以直接在eclipse的eclipse marketplace 那里搜索安装 2.可以在Help->Install ...

  3. FZU 1894 志愿者选拔(优化循环)

    我并没有多想,他们是用的数组模拟队列,然而我就是优化循环次数过得 #include<iostream> #include<cstdio> #include<cstring ...

  4. 更方便的函数回调——Lambda

    auto callbackFunc = [&](){ backHome(); }; []符号,表示要开始一个lambda函数: ()符号,里面填写函数的参数: 当想在lambda函数里使用外部 ...

  5. JavaScript的异步机制

    我们经常说JS是单线程的,比如node.js研讨会上大家都说JS的特色之一是单线程的,这样使JS更简单明了,可是大家真的理解所谓JS的单线程机制吗?单线程时,基于事件的异步机制又该当如何 1 先看下两 ...

  6. location对象的属性和方法应用(解析URL)

    本文将与大家分享下location对象使用属性和方法来解析URL的实例,感兴趣的朋友可以参考下,希望对你有所帮助   location对象提供了很多属性和方法用来解析URL. 复制代码代码如下: &l ...

  7. 干货分享:MySQL之化险为夷的【钻石】抢购风暴【转载】

    转自: 干货分享:MySQL之化险为夷的[钻石]抢购风暴 - Vanos_韩尛哲 - 博客园http://www.cnblogs.com/Vanos-lcp/p/5642097.html 抢购钻石不稀 ...

  8. zf-关于公司框架的时间字段的格式转换问题。。

    <ww:date value="" format="yyyy-MM-dd">

  9. 关于Ubuntu下apt的一些用法及和yum的比较

    Fedora和Red Hat有yum安装软件,Ubuntu有apt工具. apt简单的来说,就是给Ubuntu安装软件的一种命令方式. 一.apt的相关文件 /etc/apt/sources.list ...

  10. linux系统下c程序分多文件实现

    对于一个整数数组排序,按从小到大排序,数组元素个数不定.要求多文件实现 1,排序的函数作为一个文件 输出结果作为一个程序 主函数作为一个文件 运行程序 gcc -o main main.c paixu ...