C# 串口操作系列(4) -- 协议篇,文本协议数据解析
2016-06-27 15:46
429 查看
C# 串口操作系列(4) -- 协议篇,文本协议数据解析
标签: c#uiobjectstringbyte2010-06-09 01:50 19739人阅读 评论(26) 收藏 举报
分类:
通讯类库设计(4)
版权声明:本文为博主原创文章,未经博主允许不得转载。
上一篇已经介绍了协议的组成,一个协议,一般具有 :协议头+长度+数据+校验 , 文本格式可以直观的定义回车换行是协议的结尾,所以我们可以省略数据长度,增加协议尾。即: 协议头 + 数据 + 校验 + 数据尾 。
文本方式的数据比较容易分析。如果数据缓存,可以考虑用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
plain copy
void comm_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
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可以关闭串口了。
}
}
顶
4
踩
相关文章推荐
- C# 串口操作系列(3) -- 协议篇,二进制协议数据解析
- C# MailMessage Attachment 中文名附件发邮件-Firefox中文显示正常,网页打开邮件附件中文名乱码
- 14 C#编程中的逻辑运算
- C#中list用法实例
- C# 串口操作系列(2) -- 入门篇,为什么我的串口程序在关闭串口时候会死锁
- C# 串口操作系列(1) -- 入门篇,一个标准的,简陋的串口例子。
- C#简单读写txt文件的方法
- C#Winfrom设置DataGridView单元格文本格式为钱的格式
- C# Console类
- C#生成验证码
- LeetCode #21 Merge Two Sorted Lists C# Solution
- C# 刷新页面浏览次数(点击量)+1
- C#字符串、字节数组和内存流间的相互转换 - IT浪潮之巅
- c#通用登录模块,简单好用,一贴见效
- csharp: Domain-Driven Design(领域驱动设计)
- C#实现的ZPL条码打印类完整实例
- C#中的委托之操作符(基础二)
- C#实现的xml操作类完整实例
- C#操作Excel总结
- C#控制Excel常见操作(收集整理)