上一篇已经介绍了协议的组成,一个协议,一般具有 :协议头+长度+数据+校验 , 文本格式可以直观的定义回车换行是协议的结尾,所以我们可以省略数据长度,增加协议尾。即: 协议头 + 数据 + 校验 + 数据尾 。

文本方式的数据比较容易分析。如果数据缓存,可以考虑用StringBuilder。或是不缓存也可以。文本格式数据大多有换行结尾。稍微修改即可。例如分析常见的NMEA 0183格式的卫星坐标数据GGA。

$GPGGA,121252.000,3937.3032,N,11611.6046,E,1,05,2.0,45.9,M,-5.7,M,,0000*77

$              开始

GPGGA     命令字

*              结尾

77            校验

对上一篇代码稍作修改就可以了。例子不贴了。文本格式比较简单,只是为了内容完整。贴来做参考。只有分析的地方简化很多。

[c-sharp] view plaincopyprint?
  1. void comm_DataReceived(object sender, SerialDataReceivedEventArgs e)
  2. {
  3. if (Closing) return;//如果正在关闭,忽略操作,直接返回,尽快的完成串口监听线程的一次循环
  • try
  • {
  • Listening = true;//设置标记,说明我已经开始处理数据,一会儿要使用系统UI的。
  • //文本格式比较简单,你可以死等。
  • string line = comm.ReadLine();//这就得到回车换行结尾的了。但是不是从头开始的就要检查了
  • /
  • //<协议解析>
  • //因为恢复的代码在finally中。你可以直接的return
  • if(line[0] != '$') return;//虽然可能有点垃圾,但是数据不重要。直接丢弃就可以了。后续的都是对的
  • int star = line.IndexOf("*",1);
  • if(star == -1) return;
  • //根据$后面数据计算异或校验,并和*后面的数字对比。如果不同,也不进行分析。因为校验错误
  • //当确定头尾存在,校验正确。就可以分析数据了。
  • //分析数据
  • //略
  • //因为要访问ui资源,所以需要使用invoke方式同步ui。
  • this.Invoke((EventHandler)(delegate
  • {
  • //判断是否是显示为16禁止
  • if (checkBoxHexView.Checked)
  • {
  • //依次的拼接出16进制字符串
  • foreach (byte b in buf)
  • {
  • builder.Append(b.ToString("X2") + " ");
  • }
  • }
  • else
  • {
  • //直接按ASCII规则转换成字符串
  • builder.Append(Encoding.ASCII.GetString(buf));
  • }
  • //追加的形式添加到文本框末端,并滚动到最后。
  • this.txGet.AppendText(builder.ToString());
  • //修改接收计数
  • labelGetCount.Text = "Get:" + received_count.ToString();
  • }));
  • }
  • finally
  • {
  • Listening = false;//我用完了,ui可以关闭串口了。
  • }
  • }

ps:转自http://blog.csdn.net/wuyazhe/article/details/5657188

C# 串口操作系列(4) -- 协议篇,文本协议数据解析 .相关推荐

  1. C# 串口操作系列(1) -- 入门篇,一个标准的,简陋的串口例子。

    我假设读者已经了解了c#的语法,本文是针对刚打算解除串口编程的朋友阅读的,作为串口编程的入门范例,也是我这个系列的基础. 我们的开发环境假定为vs2005(虽然我在用vs2010,但避免有些网友用20 ...

  2. C# 串口操作系列(1) -- 入门篇,一个标准的,简陋的串口例子

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/wuyazhe/archive/2010/05/17/5598945.aspx 我假设读者已经了解了c#的语法,本文是针 ...

  3. C# 串口操作系列(1) -- 入门篇,一个标准的,简陋的串口例子。 ——兔子党逍遥原创,转来分享学习

    我假设读者已经了解了c#的语法,本文是针对刚打算解除串口编程的朋友阅读的,作为串口编程的入门范例,也是我这个系列的基础. 我们的开发环境假定为vs2005(虽然我在用vs2010,但避免有些网友用20 ...

  4. C# 串口操作系列(2) -- 入门篇,为什么我的串口程序在关闭串口时候会死锁 ?

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/wuyazhe/archive/2010/05/19/5606276.aspx 第一篇文章我相信很多人不看都能做的出来, ...

  5. (一)JAVA基于OPENXML的word文档插入、合并、替换操作系列之基础篇

    (一)JAVA基于OPENXML的word文档插入.合并.替换操作系列之基础篇 前言 什么是Open Xml? Open XML SDK 这系列笔记要做点什么? 涉及技术点 关于word.openxm ...

  6. C# 串口操作系列(4) -- 协议篇,文本协议数据解析

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/wuyazhe/archive/2010/06/09/5657188.aspx 上一篇已经介绍了协议的组成,一个协议,一 ...

  7. C# 串口操作系列(3) -- 协议篇,二进制协议数据解析

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/wuyazhe/archive/2010/05/27/5627253.aspx 我们的串口程序,除了通用的,进行串口监听 ...

  8. C# 串口操作系列(5)--通讯库雏形

    串口是很简单的,编写基于串口的程序也很容易.新手们除了要面对一堆的生僻概念,以及跨线程访问的细节,还有一个需要跨越的难题,就是协议解析,上一篇已经说明了: 一个二进制格式的协议一般包含: 协议头 + ...

  9. 【Unity3D 教程系列第 15 篇】本地数据持久化之 Playerprefs 类

    这是[Unity3D 教程系列第 15 篇],如果觉得有用的话,欢迎关注专栏. 文章目录 一:什么是 PlayerPrefs 类 二:PlayerPrefs 类中的静态方法 1:写入数据 2:读取数据 ...

最新文章

  1. C++/C++11中头文件numeric的使用
  2. 2020年趋势一览:AutoML、联邦学习、云寡头时代的终结
  3. Micropython 红外防坠落小车实验教程
  4. python教程:有参装饰器
  5. 【机器视觉】 measure_pos算子
  6. Spark GraphX
  7. ABP入门系列(6)——定义导航菜单
  8. js java post提交_如何从Express.js发送Post请求到另一个服务器(Java)?
  9. Python网络编程之socket编程
  10. 360集团或将推出数字安全免费新品
  11. windows之解决VMware虚拟机经常性卡死
  12. qt 串口助手_新手如何从零开发ROS小车 (ros串口通讯、PID运动控制、双轮差速模型解算...
  13. ecshop源码开发 ticket(电子票)
  14. java+widthstep,OpenCV 中结构体IplImage 成员width,widthStep使用注意事项
  15. eclipse断点调试(方立勋老师)
  16. 在设计四人抢答器中灯全亮_EDA课程设计—四人抢答器设计
  17. PO、VO、POJO、DTO、DAO、Service包等常见包的理解
  18. 测试工程之测试计划之里程碑计划
  19. IPython使用Matplotlib画图时无法显示图片
  20. 《北京市自动驾驶车辆道路测试报告(2021年)》正式发布

热门文章

  1. 首个教育部印发的人工智能行动计划出炉:规划三步走,大学有三任务
  2. 王炸!Waymo正式官宣无人车出行平台,瑟瑟发抖的不止Uber
  3. 老司机和驾驶辅助系统相处得如何?MIT研究人员做了个科学研究
  4. 十一项全球最具权威的大数据资质认证
  5. Linux命令行工具使用小贴士及技巧(四)
  6. 【DP】【单调队列】【NOI2005】瑰丽华尔兹
  7. mongoDB 3.0以前版本 - 入门指南、示例
  8. bash编程初体验之if
  9. 可以参考《SpringMVC接口测试异常:Can not deserialize instance
  10. Mozilla Firefox,去广告插件