C# + .net下使用serialPort做串口开发 1
在.net下使用serialPort做串口通信开发,在环境状态比较好的情况下还是比较容易的。我们可是使用serialPort.write(),将组织好的byte数组写入到串口中。也可以通过serialPort的DataReceived 事件来触发读取。
但是,如果通信情况不好,或者比特率较低的情况下,在接受的时候会出现很多情况,当触发一次Datareceived的事件,可能是收到了全部数据帧,也可能只收到了半个帧,第二次触发的时候,也许就是完整的一个帧了,这样就给写程序带来的N多问题。无法通过DataReceived事件来触发读取了。
最后,没办法,想出一个变通的手法,因为我们可以知道serialPort中当前输入缓冲区的内容的大小,BytesToRead,我们可以在一段时间间隔内,获取这个值,如果它不改变了,说明后面没有数据了,也就是下位机发送完成。这个时间是和serialPort的波特率有关的。
波特率的单位是 bps 就是 bit 每秒,所以换成字节的话,得除以8,在考虑上完成字节的头尾等,完成的一个字节是11bit,所以,我们就可以换算出 (波特率/11) 得到一秒可以发送的字节数,然后我们在拿 1000ms除以这个值,就可以得到 一个字节需要多少毫秒来发送: 1000/(波特率/11) 。
理论上,我们等待这个时间,就可以获取到下一个字节了,但是考虑到实际情况,可能需要适当的延长时间,所以,我们可是适当的增加等待时间。
我们可以使用timer来实现;
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相关推荐
- vs2010串口开发(mscomm控件)_未在此计算机上注册ActiveX控件
1.简介 在vs2010做串口开发时,当使用mscomm控件时,如果没有注册MSCOMM32.OCX,在运行工程时会弹出"未在此计算机上注册ActiveX控件"这个警告,解决方法如 ...
- Android下的串口开发
一.前言 由于安卓的开源性以及可拓展性,近些年,Android在各种智能设备上的使用越来越多,如电视机.机顶盒.车载系统以及公交刷卡系统等等.在我们的认识中Android系统是手机系统,它的物理接口一 ...
- Linux下使用WPS做office的二次开发
Linux下使用WPS做office的二次开发 序 上个版本WPS在Linux上就已经支持二次开发了,可以直接去看官网相关的介绍.https://open.wps.cn/ 我们选择WPS的客户端进行二 ...
- 迅为linux下串口,迅为iMX6UL开发板多路串口开发平台接口详解
原标题:迅为iMX6UL开发板多路串口开发平台接口详解 iMX6UL开发板 核心板参数 尺寸:38mm*42mm CPU:iMX6UL 主频528MHz ARM Cortex-A7架构 单核 内存:5 ...
- android 串口开发第二篇:利用jni实现android和串口通信
一:串口通信简介 由于串口开发涉及到jni,所以开发环境需要支持ndk开发,如果未配置ndk配置的朋友,或者对jni不熟悉的朋友,请查看上一篇文章,android 串口开发第一篇:搭建ndk开发环境以 ...
- Android开发板之串口开发
Android开发板之串口开发 简介 首先描述一下我的应用项目,它是一个简单的智能盒子,主要内容:是通过Android开发板上的串口进行数据的读取操作,一块android开发板外接一个Arduino, ...
- Android USB串口开发
因为第一次接触Android下的串口开发,在网上找了很多例子都不能满足自己的需要以及不能正常使用,于是结合网上的资源以及查阅资料,终于完成了关于这个串口的开发,在此记录下usb转串口通信开发的过程. ...
- 如何用QT做串口调试助手Qseriaport类的使用
首先新建工程界面设计 在这里我就不做详述了,注意的一点就是接收框是QPlainTextEdit,我把我的整体放上来,有点丑,你们可以自由发挥. 在写之前我先把我创建的一些全局变量什么的写出来,免得下面 ...
- Android程序调用串口开发硬件
Android程序调用串口开发硬件 Android的串口程序 工程编辑 Android的串口程序 Adnroid开发串口程序与linux一致,本质也是对文件进行读写操作,不过为了能用java操作, ...
最新文章
- ftime()函数的用法----算函数运行时间
- 爬取词库,使用jieba分词库,自定义dict.txt文件+将搜狗词库.scel文件为.txt文件
- jQuery.position()其实不可靠!
- 最全机器学习种类讲解:监督、无监督、在线和批量学习都讲明白了
- ArcSDE NetWork I/O Error 错误处理(待完善)
- HDU-2161 Primes
- Typora入门(中文版)
- 光线的方向:顺光、逆光、侧光、侧顺光、侧逆光、顶光、底光
- python爬知识星球付费数据_Python 爬取知识星球数据
- Web端高保真动态交互Axure元件库
- Johnson 算法 洛谷P5905
- for linux shell 菜鸟_Linux 命令大全 | 菜鸟教程
- eNSP华为模拟器使用——(11)eNSP模拟无线AC和AP
- 微波工程学习1-电磁理论
- 计算机主机号是什么意思,在一台计算机的IP地址中,网络号和主机号指的是什么?...
- TrueType字体变成宋体的方法
- Mathematica基础
- numpy之histogram
- vue.jsv-html,关于vue.js v-bind 的一些理解和思考,vue.jsv-bind
- JAVA的循环结构以及简单操作