在.net下使用serialPort做串口通信开发,在环境状态比较好的情况下还是比较容易的。我们可是使用serialPort.write(),将组织好的byte数组写入到串口中。也可以通过serialPort的DataReceived 事件来触发读取。

但是,如果通信情况不好,或者比特率较低的情况下,在接受的时候会出现很多情况,当触发一次Datareceived的事件,可能是收到了全部数据帧,也可能只收到了半个帧,第二次触发的时候,也许就是完整的一个帧了,这样就给写程序带来的N多问题。无法通过DataReceived事件来触发读取了。

最后,没办法,想出一个变通的手法,因为我们可以知道serialPort中当前输入缓冲区的内容的大小,BytesToRead,我们可以在一段时间间隔内,获取这个值,如果它不改变了,说明后面没有数据了,也就是下位机发送完成。这个时间是和serialPort的波特率有关的。

波特率的单位是 bps 就是 bit 每秒,所以换成字节的话,得除以8,在考虑上完成字节的头尾等,完成的一个字节是11bit,所以,我们就可以换算出 (波特率/11) 得到一秒可以发送的字节数,然后我们在拿 1000ms除以这个值,就可以得到 一个字节需要多少毫秒来发送: 1000/(波特率/11) 。

理论上,我们等待这个时间,就可以获取到下一个字节了,但是考虑到实际情况,可能需要适当的延长时间,所以,我们可是适当的增加等待时间。

我们可以使用timer来实现;

timer1.Interval = (1000 / (serialPort1.BaudRate / 11)) + 20;

 

int timer2Bytes = -1;
private void timer2_Tick(object sender, EventArgs e)
{
int newBytes = serialPort1.BytesToRead;
if (timer2Bytes == newBytes && newBytes != 0)
{
byte[] data = new byte[newBytes];
serialPort1.Read(data, 0, data.Length);
if (data != null)
{
textBoxResult.Text += BitConverter.ToString(data) + "\r\n";
Application.DoEvents();
}
timer2Bytes = -1;

}
else
{
timer2Bytes = newBytes;
}
}

OK,这样就基本完成了,但是依然还是有可能出现接受的帧不完整的情况,这个时候可以尝试在发送一次命令读取一次。这个好处是可以读取到通信时间,只需要在里面添加一个计时器,比如在 else下 添加 time += timer2.Interval ;  但是这个时间很不准确,不知道为什么。

最后一个比较好的方法就是:通过bytesToRead的长度来确定是否接受完成,并指定超时时限,这样的好处是,能保证接受到的就是长度符合的,否则就继续等,知道超时,可是,问题是必须事先知道,我读取的长度将会是多少,这对程序的扩展性等,都引来很多问题。纠结中。

继续研究如何比较好的实现,并精确的记录下通信时间;

转载于:https://www.cnblogs.com/lingfengchencn/archive/2010/07/01/serialPort.html

C# + .net下使用serialPort做串口开发 1相关推荐

  1. vs2010串口开发(mscomm控件)_未在此计算机上注册ActiveX控件

    1.简介 在vs2010做串口开发时,当使用mscomm控件时,如果没有注册MSCOMM32.OCX,在运行工程时会弹出"未在此计算机上注册ActiveX控件"这个警告,解决方法如 ...

  2. Android下的串口开发

    一.前言 由于安卓的开源性以及可拓展性,近些年,Android在各种智能设备上的使用越来越多,如电视机.机顶盒.车载系统以及公交刷卡系统等等.在我们的认识中Android系统是手机系统,它的物理接口一 ...

  3. Linux下使用WPS做office的二次开发

    Linux下使用WPS做office的二次开发 序 上个版本WPS在Linux上就已经支持二次开发了,可以直接去看官网相关的介绍.https://open.wps.cn/ 我们选择WPS的客户端进行二 ...

  4. 迅为linux下串口,迅为iMX6UL开发板多路串口开发平台接口详解

    原标题:迅为iMX6UL开发板多路串口开发平台接口详解 iMX6UL开发板 核心板参数 尺寸:38mm*42mm CPU:iMX6UL 主频528MHz ARM Cortex-A7架构 单核 内存:5 ...

  5. android 串口开发第二篇:利用jni实现android和串口通信

    一:串口通信简介 由于串口开发涉及到jni,所以开发环境需要支持ndk开发,如果未配置ndk配置的朋友,或者对jni不熟悉的朋友,请查看上一篇文章,android 串口开发第一篇:搭建ndk开发环境以 ...

  6. Android开发板之串口开发

    Android开发板之串口开发 简介 首先描述一下我的应用项目,它是一个简单的智能盒子,主要内容:是通过Android开发板上的串口进行数据的读取操作,一块android开发板外接一个Arduino, ...

  7. Android USB串口开发

    因为第一次接触Android下的串口开发,在网上找了很多例子都不能满足自己的需要以及不能正常使用,于是结合网上的资源以及查阅资料,终于完成了关于这个串口的开发,在此记录下usb转串口通信开发的过程. ...

  8. 如何用QT做串口调试助手Qseriaport类的使用

    首先新建工程界面设计 在这里我就不做详述了,注意的一点就是接收框是QPlainTextEdit,我把我的整体放上来,有点丑,你们可以自由发挥. 在写之前我先把我创建的一些全局变量什么的写出来,免得下面 ...

  9. Android程序调用串口开发硬件

    Android程序调用串口开发硬件 Android的串口程序 工程编辑 Android的串口程序   Adnroid开发串口程序与linux一致,本质也是对文件进行读写操作,不过为了能用java操作, ...

最新文章

  1. ftime()函数的用法----算函数运行时间
  2. 爬取词库,使用jieba分词库,自定义dict.txt文件+将搜狗词库.scel文件为.txt文件
  3. jQuery.position()其实不可靠!
  4. 最全机器学习种类讲解:监督、无监督、在线和批量学习都讲明白了
  5. ArcSDE NetWork I/O Error 错误处理(待完善)
  6. HDU-2161 Primes
  7. Typora入门(中文版)
  8. 光线的方向:顺光、逆光、侧光、侧顺光、侧逆光、顶光、底光
  9. python爬知识星球付费数据_Python 爬取知识星球数据
  10. Web端高保真动态交互Axure元件库
  11. Johnson 算法 洛谷P5905
  12. for linux shell 菜鸟_Linux 命令大全 | 菜鸟教程
  13. eNSP华为模拟器使用——(11)eNSP模拟无线AC和AP
  14. 微波工程学习1-电磁理论
  15. 计算机主机号是什么意思,在一台计算机的IP地址中,网络号和主机号指的是什么?...
  16. TrueType字体变成宋体的方法
  17. Mathematica基础
  18. numpy之histogram
  19. vue.jsv-html,关于vue.js v-bind 的一些理解和思考,vue.jsv-bind
  20. JAVA的循环结构以及简单操作

热门文章

  1. js返回上一页并刷新
  2. 关于int.Parse()的异常
  3. 单元测试Struts2Spring项目的Action和Service(包含源码)
  4. c#中事件注册多个委托并获取委托列表
  5. Qt 之 消息机制和事件讲解
  6. C++中vector作为参数的三种传参方式
  7. kotlin 和java 混编
  8. java调用go接口_go语言调用API实线分词
  9. python向钉钉发送本地文件_Python实现向钉钉群发送消息通知
  10. 外观模式和代理模式的联系和区别_java23种设计模式-结构型模式之外观模式