基于C#的 串口数据完整性接收-KC07010304-a04_第1页
基于C#的 串口数据完整性接收-KC07010304-a04_第2页
基于C#的 串口数据完整性接收-KC07010304-a04_第3页
基于C#的 串口数据完整性接收-KC07010304-a04_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、物联网应用技术专业教学资源库文档文档来源院校开发文档编号KC07010101-a22基于C#的 串口数据完整性接收(微课脚本)无锡职业技术学院星期六, 一月 29, 2022基于C#的 串口数据完整性接收序号台词1同学们,大家好。今天我们开始学习“学习模块一 基于WSN的环境监控系统设备编程与实施”,本堂课的内容是“基于C#的串口数据完整性接收”。2数据接收不完整是串口编程中的常见问题,例如这个应用中使用SerialPort的Read和Write方法进行数据收、发,点击应用的打开按钮,成功打开串口后,在发送文本框中输入“aaaassss!#$”信息,点击发送后,在接收文本框中仅仅接收到 “$”

2、字符,可以看到数据接收是完整的,为了解决这个问题,今天我们以任务的形式来介绍C#的串口数据完整性接收技巧。 3任务主要包括以下四个方面:原因分析、解决方法、任务说明、任务实现。4首先来分析一下C#下串口数据接收不完整的原因5C#下通过SerialPort类来实现串口数据接收有两个特征:一是数据源自输入缓存区;二是DataReceived事件是间歇性的,需要用户自定义处理函数;以PC的串行自收自发为例,当PC通过串行线路发出0x110x120x130x14时,这些信息在进入串口缓存区时有先有后,有可能在第一个字节0x11进入输入缓存区时刚好触发DataReceived事件,这时会转到用户自定义的

3、接收处理函数,假若这时通过Read直接去读取输入缓存区内容,那么读到的数据只有0x11。造成数据接收不完整的主要原因是: DataReceived事件是间歇性的,一个完整的信息顺次进入输入缓存区时可能会多次触发DataReceived事件对应的自定义处理函数,若只处理一次数据的接收,自然会造成数据的丢失。6接下来介绍解决方法。7解决办法有两种,先来看第一种:延迟读取缓存区,若对输入缓存区的数据只进行一次接收处理,且要保证读取内容是完整的,那么只需保证读取时缓存区的内容是完整的即可。现在的问题就变成了延迟读取的时间是多少才能保证缓存区的内容是完整的,要说明这个问题,我们需要解决两个疑问:一是如何

4、计算一定时间间隔内串口接收信息的能力;二是输入缓存区能否存储这些发送过来的信息;其中第一问题跟串口的波特率相关,若串口波特率为9600bps,延迟(间隔)0.1秒,串口接收到的信息字节数计算公式是9600*0.1/8 ,结果是 120个字节;第二个问题跟SerialPort类的输入缓存区大小有关,也就是延迟0.1秒后,串口能接收到120个字节,输入缓存区是否能存储下这些字节呢? SerialPort类通过ReadBufferSize属性定义了默认的输入缓存区大小为4096个字节,也就是默认情况下输入缓存区最大的存储能力是4096个字节,超出部分会被丢弃,这里可看出在串口波特率为9600bps的

5、情况下,延迟0.1秒是合理的,输入缓存区有能力存储传输过来的信息;在使用延迟读取方式须注意时长的合理性及是否超出输入缓存区存储能力。 8第二种办法是设置全局变量来存储DataReceived事件处理函数读取到的数据,一个完整信息可能会多次触发DataReceived事件,使用全局变量可以不断的来累加存储每次发送过来的信息直至全局变量接收到一次完整的信息,在实际应用中要确保接收数据的完整性需要用户对全局变量的内容进行检测并作相应处理,在每次发送、接收完毕后须及时清空全局变量,否者会造成全局变量中的信息的堆积,影响信息显示的正确性。9接下来明确下本次任务,即任务说明10任务的硬件环境与“基于C#

6、的RS232接口初始化编程”环境一致,包含一台PC、一条串行导线、一个跳线帽,功能是PC实现串行数据的自发自收,本次任务中要求能够传输英文字符、数字及标点符号,且采用ASCII进行信息发送和接收,能完整性接收显示发送的信息。11最后使用Visual Studio来进行任务实现12(视频)打开前面课程中的串口读写项目,为方便较长字符信息的显示,对界面进行修改,点击收发文本框右上方的箭头标志勾选MultiLine属性,允许文本框多行显示,并适当调整收发文本框和发送按钮的位置,同时使用SerialPort的Read和Write替换ReadLine和WriteLine方法进行数据收、发,点击运行按钮运

7、行程序,打开串口,在发送文本框中输入20个测试字符串aaaabbbbcccc$!,点击发送按钮,发现在接收文本中仅仅显示接收到!,表明数据接收不完整;首先使用延迟读取缓存区方法修改程序,在串口接收事件处理函数sp_DataReceived中添加System.Threading.Thread.Sleep(100);语句,其单位为毫秒,在串口波特率为9600bps的情况下,让串口接收事件处理函数延迟0.1秒后再读取输入缓存区数据,可以确保串口输入缓存区的数据至少可缓存至120个字节,可读取字节数远远大于发送的20个字符,修改程序后,点击运行按钮运行程序,打开串口,在发送文本框中输入相同的测试字符串

8、信息,点击发送按钮,可以看到接收文本能够显示完整信息,说明通过延迟接收,确保了串口输入缓存区中的数据是完整;注释System.Threading.Thread.Sleep(100)语句,之后使用第二种方式,全局变量形式来进行数据的完整性接收,使用 List<byte> recvlist = new List<byte>();语句定义全局变量,之所以使用List<byte>类型,主要是两个原因,一是串行通信本身传输就是二进制,其次本应用中串行数据发送采用了Write方法,传输的就是byte类型;之后在在串口接收事件处理函数sp_DataReceived中把通过Read方法读取到数据都通过AddRange方法添加到全局变量recvlist中,最后采用ASCII解码方式对接收到的二进制数组进行解码并通过委托显示到界面接收文本框,在使用全局变量时,须接收完数据后及时对全局变量进行清空,否则会影响数据的接收,在本应用,串行数据传输是由点击发送按钮发起的,所以在发送按钮点击事件处理函数中,添加recvlist.Clear();代码实现对全局变量的清空操作,之后点击运行按钮运行程序,打开串口,在发送文本框中输入相同的测试字符串,点击发送按钮,可以看到接收文本能够显示完整信息,说明两种方式都能实现串口数据的完整性接

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论