基于C#的串口通信系统的设计和实现
2019-07-29刘马飞
刘马飞
摘 要:物联网应用技术专业学生在学习完C#.NET程序设计课程后,虽然掌握了一定的C#软件编程知识,但在如何编写软件程序驱动物联网底层传感设备,构建物联网实际应用时仍然束手无策。物联网底层传感设备大都为RS 232串口通信设备,文中给出一个有实用价值的简单设计—基于C#的串口通信系统的设计和实现,练习使用所学的C#编程知识完成与物联网底层设备的交互,加强物联网专业学生构建应用系统的编程能力。
关键词:C#;RS 232;串口通信;程序设计;软件编程;物联网
中图分类号:TP393 文献标识码:A 文章编号:2095-1302(2019)06-00-04
0 引 言
高职院校普遍将《C++程序设计》课程定为计算机大类专业的基础主干课程,同时也是物联网应用技术、电子信息技术等专业的专业基础课。在物联网应用技术专业的教学安排中,大都在学习完C++,对程序控制、类和对象等概念有了基础了解后,方才进一步学习C#程序设计。C#程序设计授课教师,尤其是来自软件方向的教师,在课程教学中一般会把窗体程序界面设计等可视化程序设计作为授课主要内容,常常忽略了与硬件设备交互的部分。因此物联网应用技术专业学生在进行综合项目开发时,常常无从下手。物联网底层传感设备大都为单片机控制设备,其与外界通信的接口常采用RS 232串口[1]。在构建物联网应用系统时,需要计算机应用程序与物联网底层传感设备进行通信交互,實现价值应用。
为促进物联网应用技术专业人才的培养,无锡职业技术学院物联网学院经过精心设计,开设了《物联设备编程与实施》课程,该课程的目的在于突出基于物联网设备进行C#软件开发,旨在提升物联网专业学生的软件开发能力和系统构建能力,并将其打造成为职业教育物联网应用技术专业教学资源库的主干核心课程[1-2]。该课程的核心教学内容之一便是C#串口编程。物联网应用技术专业学生中普遍存在因课外缺少串口硬件设备而无法练习串口编程内容的问题。
为了让学生能在课外学习C#串口编程知识,提高对课程内容的掌握程度,本文介绍了一个基于C#的串口数据收发系统的设计和实现案例,通过案例的介绍,指导物联网应用技术专业学生使用所学的C#编程知识完成与物联网底层设备的交互,提升构建物联网应用系统的编程能力。
1 系统设计原理及知识
1.1 系统功能设计
C#串口数据收发系统具有串口发送和串口接收功能。串口发送:通过点击发送按钮将发送文本框内的字符串数据通过串口发送出去;串口接收:从串口接收数据并转成字符串显示到接收文本框中。为了便于学生在课后缺少串口设备的情况下也能进行程序调试,可通过虚拟串口软件Virtual Serial Port Driver添加一对虚拟串口,该串口的数据收发系统和常规串口调试助手可分别连接到这一对虚拟串口上,便于通过串口收发数据。
1.2 串口通信基础
串口通信是指外设和计算机间通过数据信号线、地线、控制线等,按位进行传输数据的一种通信方式[3]。其中最常用的一种串行通信接口为RS 232C,其全名是“数据终端设备(DTE)和数据通信设备(DCE)之间串行二进制数据交换接口技术标准”。RS 232串行口物理接口示意如图1所示,其中2脚表示输入引脚RXD,3脚表示输出引脚TXD,5脚表示接地。RS 232C全双工的两端只需要如图2所示连接三个引脚,便可进行全双工通信。
传感层设备常用的核心芯片是单片机,80C51单片机的P3口有两个复用接口,分别为RXD和TXD,而这也是单片机进行串行通信的收发口,但单片机采用的是TTL电平标准,+5 V表示逻辑1,0 V表示逻辑0;而RS 232电平标准要求+15 V或+13 V表示逻辑1,-15 V或-13 V表示逻辑0,所以需要通过MAX232芯片实现TTL电平与RS 232电平之间的转换。
RS 232串口以字符帧为单位传送数据,字符帧由起始位、数据位、校验位以及停止位构成,如图3所示。起始位固定为1位,逻辑0表明字符帧开始;数据位的位数可选值为
5位、7位和8位,通常8意为8位对应一个字节的8个比特。校验位可选,进行校验时,可以在偶、奇、高和低四种校验方式中任选一种。停止位表示字符帧结束,一般取1,1.5和2位(逻辑1)。每个位的持续时间由波特率表示,典型取值为1 200 bps,2 400 bps,4 800 bps,9 600 bps,19 200 bps。对于两个串口通信的设备而言,只有两端的波特率、数据位、校验位以及停止位保持一致,才能保证发送的每个数据包都能够被对方正确接收。串口通信系统界面如图4所示。
1.3 C#串口控件
在C#.NET中提供SerialPort类用于完成串口通信操作,其属于System.IO.Ports命名空间,在C#Windows窗体应用程序中经SerialPort类封装成可视化控件SerialPort,使用可视化方式完成编程。SerialPort类的常用属性和常用方法见表1和表2所列[1,4]。
SerialPort串口操作延续文件操作思想,在进行串口操作之前首先需要调用Open()方法对打开串口;串口打开后,调用Write()函数等将数据通过串口发送出去,再调用Read()函数从串口接收对端发送的数据,串口操作完成后,需调用Close()方法关闭串口。
应用程序从串口读取数据时,由于不知串口对端发送过来的数据何时到达接收缓冲区,因而面临着“不知何时读”的困境,其解决方式通常有两种,其一是开启一个新的线程,不断读取串口数据;其二是采用事件触发方式。SerialPort封装了自动触发事件,设定有串口缓冲区接收到的字符个数(属性ReceivedBytesThreshold值),当接收缓冲区的字节数大于等于该值时,系统将自动触发DataReceive事件。因此可以添加DataReceive事件的响应函数,在该响应函数中读取数据。需要注意的是,事件触发方式通过创建线程来实现,但监听线程的创建由C#内部系统来完成,因此在代码实现上更加简便。
2 功能设计和程序实现
2.1 窗体设计
在Visual Studio开发环境中创建如图4所示的应用程序窗体。程序运行时,首先选择相应的串口和波特率打开串口,串口打开后便可通过发送按钮将发送文本框内的字符串数据发送到串口对端,而串口接收到的数据将自动转换成字符串显示在接收文本框中。
2.2 逻辑实现及关键代码
2.2.1 程序初始化
计算机存在多个串行口,因此程序运行时首先需要列出计算机所有可用串口供用户选择,同时进行程序逻辑初始化,确保串口未打开时无法点击发送按钮进行发送操作。因此添加窗口Load事件响应函数,在Load事件响应函数中完成上述初始化操作。
序使用SerialPort类而非SerialPort控件或编写非Windows窗体应用程序的C#程序时,需要定义SerialPort类对象作为成员对象,并进行SerialPort对象初始化和DataReceived事件响应回调函数关联操作,初始化通常在窗体构造函数中进行。
2.2.4 串口接收数据
串口数据接收采用事件触发方式,添加串口控件的DataReceived事件响应函数,在该响应函数中进行数据接收操作。接收时首先调用BytesToRead属性,获得串口字符个数;其次定义与字符个数相对应的字节数组;最后调用Read方法,把串口数据读入字节数组,并将字节数组按指定编码格式转换回字符串进行显示[5]。
由于事件触发方式系统创建了监听线程进行串口接收缓冲区监听,当接收缓冲区字节数超过串口控件属性ReceivedBytesThreshold值时,将产生DataReceived事件。当DataReceived事件被处理时,才会调用DataReceived事件相应函数,即spdemo_DataReceived。通常串口对端发送数据包的大小非固定,因此ReceivedBytesThreshold通常采用默认值1。当串口接收缓冲区收到数据包第一个字节时,便辅助线程产生DataReceived事件。当该DataReceived事件被处理时,有可能数据包还未接收完毕,因此可采用一个简单但低效、不可靠的办法执行Thread.Sleep(10)操作使线程休眠100 ms,使得在执行读取操作时,数据包接收完毕[6]。
由于事件触发方式中,DataReceived事件的响应函数spdemo_DataReceived()是在系统创建的辅助监听线程上执行的,而窗体界面的控件则是在主线上创建的,因此为避免线程竞争,C#窗体编程只能创建控件的线程来操作控件数据,禁止跨线程访问控件资源。因此需要使用Invoke或BeginInvoke方法,通过委托调用封送到主线程上执行,具体实现:this.Invoke((EventHandler)(delegate{界面控件使用}))。
2.3 系统改进及扩展
本系统设计本着可用、简单的原则,设计了字符串文本的发送和接收显示,方便学生实现。一旦学生掌握了基本的实现方法,就可以在该基础上完善功能,扩展应用。例如设计温湿度监控应用程序时通过RS 232串口连接传感层单片机设备,接收传感层设备通过串口上传的温度湿度等传感数据并展示。设计硬件设备控制程序时,通过串口发送操作指令数据到底层执行器设备,如控制LED灯进行相应开关操作。以上每个改進都可以比较方便的实现,但要求学生有耐心并能自主学习,激发学生学习兴趣和成就感。
系统在接收数据时,使用简单的线程休眠等待数据包接收完成的办法,在实际串口通信系统收发过程中将会造成数据包接收不完整以及接收处理速度慢等问题,因此需要考虑串口数据可靠、高效接收的解决方案。
3 结 语
本文通过基于C#的串口数据收发系统的设计和实现案例,对《物联网设备编程与实施》课程中的核心知识内容—C#串口编程进行了详细阐述。通过介绍该项目,使得物联网应用技术专业的学生深入了解应用程序如何与硬件设备交互,加深了对C#串口编程知识的理解和运用,加强了构建物联网应用系统的编程能力。
参 考 文 献
[1]陈天娥.物联网设备编程与实施[M].北京:高等教育出版社,2014.
[2]邱晓荣.《物联网设备编程与实施》课程的构建与实施[J].物联网技术,2015,5(7):96-97.
[3]王静霞,杨宏丽,刘俐.单片机应用技术(C语言版)[M].3版.北京:电子工业出版社,2015.
[4] NAGEL C,GLYNN J,SKINNER M. C#高级编程[M].9版. 李铭译.北京:清华大学出版社,2015.
[5]于国防,李剑.C#语言Windows程序设计[M].北京:清华大学出版社,2010.
[6] WATSON K,HAMMER J V,REID J D. C#入门经典[M].7版.齐立波,黄俊伟,译.北京:清华大学出版社,2016.
[7]胥飞燕,郑华荣,周宦银,等.基于FPGA的多串口控制器的设计与实现[J].物联网技术,2017,7(10):31-32.
[8]周阳,周美娇,黄波,等.基于C#的串口通信系统的设计与研究[J].电子测量技术,2015,38(7):135-140.
[9]李越,童耀南,朱凯,等.基于ZigBee和STC单片机的无线数据采集系统[J].物联网技术,2017,7(3):19-21.
[10]吴卓葵,谢晓玲.基于单片机和C#的电压监测系统设计[J].自动化与仪器仪表,2014(4):71-73.