【实验室笔记】关于数据帧头的搜寻的一点想法

  在上下位机的串口通讯中,数据传送协议是十分重要的。能不能准确找到一帧数据的帧头数据是保证能否正确建立数据传送的根本保证。

实验总结了一个相对简单的办法,没有复杂的搜寻办法,但是很实用。

  大概的思想是假设数据帧的长度是30个字节(包含了帧头帧尾),那么上位机端放进来的缓存数据长度就设置成为60字节,两倍的关系。然后要做的工作是在前30个字节中搜寻数据帧头的位置,采用循环搜寻的办法。当找到帧头的首字节位置后,另外经判断帧头数据正确无误,那么就可以记住帧头首字节的地址了,然后相对于既定的位置关系确定每一位的具体含义。

  

 1         void checkFrame(Byte[] Rev)
 2         {
 3             int header = 0;
 4             int headerFlag = 0;
 5             for (int i = 0; i < 50; i++)
 6             {
 7                 if (Rev[i] == ‘$‘ && Rev[i + 1] == ‘G‘ && Rev[i + 2] == ‘P‘ && Rev[i + 3] == ‘R‘ && Rev[i + 4] == ‘M‘ && Rev[i+5] == ‘C‘)
 8                 {
 9                     if (Rev[i + 17] == ‘A‘ && Rev[i + 30] == ‘N‘ && Rev[i + 44] == ‘E‘)
10                     {
11                         header = i;
12                         headerFlag = 1;
13                         break;
14                     }
15                 }
16             }
17             if (headerFlag == 1)
18             {
19                 try
20                 {
21                     string str = Encoding.ASCII.GetString(Rev);
22
23                     string UTC = str.Substring(header + 7, 9);
24                     string Latitude = str.Substring(header + 19, 10);
25                     string Longitude = str.Substring(header + 32, 11);
26
27                     Double UTC_Value = Convert.ToDouble(UTC);
28                     Double Latitude_Value = Convert.ToDouble(Latitude);
29                     Double Longitude_Value = Convert.ToDouble(Longitude);
30
31                     //处理UTC时间信息
32                     int UTC_HH = (int)(UTC_Value / 10000) + 8;
33                     int UTC_MM = (int)(UTC_Value % 10000 / 100);
34                     int UTC_SS = (int)(UTC_Value % 100);
35
36                     textBox1.Text = UTC_HH.ToString() + "时" + UTC_MM.ToString() + "分" + UTC_SS + "秒";
37                     toolStripLabel1.Text = UTC_HH.ToString() + "时" + UTC_MM.ToString() + "分" + UTC_SS + "秒";
38
39                     //处理纬度信息
40                     int LatDu = (int)(Latitude_Value / 100);
41                     int LatFen = (int)(Latitude_Value % 100);
42                     int LatInt = (int)(Latitude_Value);
43                     Double LatMiao = (Double)((Latitude_Value - LatInt) * 60);
44                     string LatMiaoStr = LatMiao.ToString();
45                     LatMiaoStr = LatMiaoStr.Substring(0, 5);
46
47                     //实际的纬度信息值
48                     Double LatActVal = (Double)(LatDu + (Double)((double)LatFen / 60) + (Double)((double)LatMiao / 3600));
49
50                     //处理经度信息
51                     int LongDu = (int)(Longitude_Value / 100);
52                     int LongFen = (int)(Longitude_Value % 100);
53                     int LongInt = (int)(Longitude_Value);
54                     Double LongMiao = (Double)((Longitude_Value - LongInt) * 60);
55                     string LongMiaoStr = LongMiao.ToString();
56                     LongMiaoStr = LongMiaoStr.Substring(0, 5);
57
58                     //实际的经度信息值
59                     Double LongActVal = (Double)(LongDu + (Double)((double)LongFen / 60) + (Double)((double)LongMiao / 3600));
60
61                     textBox2.Text = LongDu.ToString() + "度" + LongFen.ToString() + "分" + LongMiaoStr + "秒";
62                     textBox3.Text = LatDu.ToString() + "度" + LatFen.ToString() + "分" + LatMiaoStr + "秒";
63
64                     this.BeginInvoke(new UpdateStatusDelegate(UpdateStatus), new object[] { LongActVal.ToString(), LatActVal.ToString() });
65                 }
66                 catch
67                 {
68
69                 }
70              }
71         }
时间: 2024-10-13 22:54:28

【实验室笔记】关于数据帧头的搜寻的一点想法的相关文章

PE笔记之DOS头

IMAGE_DOS_HEADER STRUCT { +0h WORD e_magic    // Magic DOS signature MZ(4Dh 5Ah)     DOS可执行文件标记 +2h   WORD e_cblp    // Bytes on last page of file +4h WORD e_cp    // Pages in file +6h WORD e_crlc    // Relocations +8h WORD e_cparhdr   // Size of hea

C语言学习笔记(2):引用头文件所使用的符号区别

C语言引用头文件使用的符号有两种,以头文件stdio.h为例: (1)#include <stdio.h> (2)#include “stdio.h” 这两种引用方式是存在不同的. 第一种引用方式,编译器仅在标准库头文件中进行匹配: 第二种引用方式,编译器先在工程目录下进行匹配,如果没有,再到标准库头文件中查找. 这里进行了测试,应用VC++6.0,新建文件,首先是主文件Test.c: #include <child.h> void main() { Test(); } 然后,为了

【实验室笔记】C#以本地时间创建txt文件

前段时间做的一个小项目,要求上位机在打开时候,以打开软件的系统时间的建立一个txt文件来存储下位机发送来的数据. 在第一版上位机上,取名的办法太弱了,先是读取系统时间,然后截取字符串,太笨拙.昨天,查了查资料,发现了C#自身 就可以清楚地读出时间. 1 System.DateTime.Now.Year 2 System.DateTime.Now.Month 3 System.DateTime.Now.Day 4 System.DateTime.Now.Hour 5 System.DateTime

【实验室笔记】serialport的readline()方法

在最近的小项目中,单片机中断优先级的问题,串口发送到上位机的数据有时会出现发送的数据被中断打断的问题. 于是,在上位机机上就容易出现错误,原来读取的方法是read()的方法,反复修改发送数据的格式依然没有好转. 后来讲将上位机的读取方式换成readline()问题得到了解决,且百发百中,问题可能归结于readline方法自身的特性吧. readline会一直在那里等候,知道接收到换行符"\r\n",所以在没有接收到完整数据时,会一直在那里等候数据的到来,不离不弃. 即便下位机的数据发送

emacs 新手笔记(三) —— 为 emacs 做一点简单的定制

ilocker:关注 Android 安全(新入行,0基础) QQ: 2597294287 在 emacs 启动时,会加载 ~/.emacs 文件.在该文件中编辑一些 lisp 代码,是一种最为简单的定制 emacs 的方式. 下面的 lisp 代码主要实现几个按键绑定和窗口最大化等简单的配置: 1 ;; 窗口最大化 2 (defun my-maximized () 3 (interactive) 4 (x-send-client-message 5 nil 0 nil "_NET_WM_STA

马哥学习笔记

第一章.操作系统基础 01_03_操作系统基础 计算机体系结构包括以下几部分: 运算器 控制器 存储器,内存,编址 输出设备 输入设备 北桥 - 高速总线控制器 南桥 - 低速总线总线控制器 硬件架构: ARM x86 x64 安腾 alpha UltraSparc Power M68000, M68K PowerPC OS: Windows Linux Unix HP-UX Solaris AIX SCO UNIX Unixware OS/2 内核功能: 进程管理 内存管理 文件系统 网络功能

【linux_笔记】Linux软件包管理

学习资源来自:www.magedu.com 学习记录过程中难免出现错误,示例仅供参考,大神请无视.. 软件包管理 =========== 前导 =============应用程序:(程序的运行与底层的平台架构(Architecture)有着莫大的关系) 不同方式编写的程序生产二进制可执行格式的方式不同:        C语言(需要编译):源代码-->(编译)二进制格式        脚本(不需要编译):解释器(二进制程序)        高级语言与汇编语言开发程序的区别:        汇编语言

Vlan学习笔记终极整理

1.为什么需要VLAN 什么是VLAN? VLAN(Virtual LAN),翻译成中文是"虚拟局域网".LAN可以是由少数几台家用计算机构成的网络,也可以是数以百计的计算机构成的企业网络.VLAN所指的LAN特指使用路由器分割的网络--也就是广播域. 在此让我们先复习一下广播域的概念.广播域,指的是广播帧(目标MAC地址全部为1)所能传递到的范围,亦即能够直接通信的范围.严格地说,并不仅仅是广播帧,多播帧(Multicast Frame)和目标不明的单播帧(Unknown Unica

ubuntu: qemu+gdb 调试linux kernel 学习笔记

声明: 本笔记内容并非本人原创,90%来自网络资料的整合.同时,由于自己是刚刚接触qemu & gdbserver remote debug,本文也就算不得教程,仅供有缘人参考而已. ------------------------------------------------------------------------------------------------分割线-----------------------------------------------------------