C#串口编程遇到的问题以及解决方法
来源:互联网 发布:淘宝开店法律条款 编辑:程序博客网 时间:2024/06/05 06:58
本文来自: http://www.cnblogs.com/royenhome/archive/2010/03/23/1692440.html
最近在做的项目中涉及到串口通信编程,队友在做这一模块的时候遇到了一个相信很多人都可能遇到的问题,那就是接受数据的冲突或者丢失。队友让我帮他调试的时候,足足花了近两个小时才把问题给解决了,现觉得有必要总结一下以给遇到类似问题的朋友一个思路吧~
问题是这样的,从相应的硬件设备每隔2秒便发送一个大小为15的字节数据,存的是16进制数据,每条数据以7E开头以7E结尾。例如:7E 09 01 1A ... 7E。但是PC端在接受显示的时候却出现了问题,如前五个数据接受正常,接下来的都是以00填充,而剩下的10个数据却出现在下条数据显示的位置。如下所示:
7E 09 01 1A 5C 00 00 00 00 00 00 00 00 00 00 /////// 03 06 1A 2C 3D 09 6C 32 12 7E 00 00 00 00 00 00/////// ........
总之感觉错位了,对了,先把PC端代码贴一下吧:
在调试的过程中,当我spReceive_DataReceived函数中的byte[] recevied = new byte[15]; 后面在加上个初始化,如下:
for( int i=0; i<recevied.Lengthl;i++)
recevied[i]=11;
这个时候界面显示的时候,凡是以00显示的地方都被11替换了。这肯定了这些00是由于传送的15个字节数组未被完全填充到我们定义的字节数组中,即Read(byte [] bytes,int offset,int size)函数未一次性将字节数组填充完,而是分了两次。但是在此过程中我使用的是SerialPort类的DataReceived事件,即没收到一条数据便会触发,而这儿的现象仿佛是事件被触发了多次。后来自己在SerialPort类的属性里面找了下,突然发现了有个ReceivedBytesThreshold属性,从这个属性可以看出我们可以控制接受多少个字节触发一次DataReceived事件。于是,我便将阀值设为15个字节,满以为问题解决了,可是结果却~
囧啊,可是这个属性也给了我们一些提示,也找到了问题的症结所在。那就是,DataRecevied事件触发的阀值,即接受到多少个字节数触发一次偏小,结果导致了我们一条大小为15个字节的数据触发了两次DataReceived事件。要解决这个问题,我们可以沿着这个思路走下去,那就是延迟DataRecevied事件的触发直到我们一条数据接受完毕。
所以在spReceive_DataReceived事件函数中,我们做如下修改:
byte[] receiveBuffer=new byte[15];
public void spReceive_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
int bytesRead = 0;
spReceive.ReceivedBytesThreshold = 100000; //延迟DataRecevied事件的再次触发
while (true)
{
if (bytesRead >= 15) //这儿的15是我一条数据的大小
{
byte[] bytes = new byte[bytesRead];
Array.Copy(receiveBuffer, 0, bytes, 0, bytesRead);
Array.Clear(receiveBuffer, 0, bytesRead);
UpdateReceiveToUI(bytes);
bytesRead = 0;
break;
}
try
{
receiveBuffer[bytesRead] = (byte)spReceive.ReadByte();
++bytesRead;
}
catch (Exception ex1)
{
MessageBox.Show(ex1.Message);
break;
}
bytesRead = 0;
spReceive.ReceivedBytesThreshold = 1; //将延迟改回正常
}
}
经过上述的改动,便可以解决读取串口数据冲突与丢失的问题了~不周之处,还望各位斧正~
- C#串口编程遇到的问题以及解决方法
- C# 串口编程遇到的问题以及解决方法
- Linux 串口编程中遇到的问题
- Linux 串口编程中遇到的问题
- wince串口通信编程遇到的问题
- 学习中遇到的问题以及解决方法
- 记录遇到的问题以及解决方法
- 总结今天遇到的问题以及解决方法
- 项目开发遇到的问题以及解决方法
- ebuy遇到的问题以及解决方法
- 学习Mysql遇到的问题以及解决方法
- UITextField遇到的一些问题以及解决方法
- Debian 8.5 遇到的问题以及解决方法
- .Net遇到的问题以及解决方法
- .Net遇到的问题以及解决方法
- (QT)QT遇到的问题以及解决方法
- 安装Paramiko遇到的问题以及解决方法
- Https 调用遇到的问题以及解决方法
- 从头学习Drupal--基本概念
- 不知CSDN怎么搞的,别人编辑的文章恢复到我这里来了
- zoj 2704 Brackets
- Android系统简单研究后的缺陷总结
- SamSun R508 Geforce9200 GM for Windows2003驱动程序安装方法
- C#串口编程遇到的问题以及解决方法
- maven基础一
- 搜索 dfs
- 打开文件夹,遍历文件夹中的所有文件及子文件夹中的文件
- 试着、、遗忘
- 花生壳+tomcat+javaweb项目的部署问题
- 加拿大政府正式为IT项目管理的成本估计作出规定
- Shell 的语法学习笔记二
- .net中使用反射的简单例子