《电子技术应用》
您所在的位置:首页 > 嵌入式技术 > 设计应用 > C#下串口通信编程的开发和扩展
C#下串口通信编程的开发和扩展
来源:微型机与应用2014年第6期
朱英翔,朱福民,刘炎鸣
(上海海事大学 物流工程学院,上海201306)
摘要: 采用C#编程创建窗体应用程序,结合实际应用,实现工业数据的串口的采集处理。利用combobox控件进行串口参数预设。完成串口数据采集,通过实例化graphic类在picturebox控件中实现数据的图样化表达。在数据的阈值报警和Excel数据保存方面进行了研究,较好地解决了生产实践中的关键问题。
Abstract:
Key words :

摘  要: 采用C#编程创建窗体应用程序,结合实际应用,实现工业数据的串口的采集处理。利用combobox控件进行串口参数预设。完成串口数据采集,通过实例化graphic类在picturebox控件中实现数据的图样化表达。在数据的阈值报警和Excel数据保存方面进行了研究,较好地解决了生产实践中的关键问题。
关键词: C#编程;串口;数据处理

    在工业现场进行作业和实验时,需要对一些工业设备的状态进行监测。为了方便快速搭建检测平台、达到灵活操作的目的,可以采用带微控制器的传感器采集所需要的状态信息,通过串口直接把这些信息传送给个人电脑,然后在电脑上编程接收处理数据。
    目前,大多数微控制器芯片(如8051系列单片机)都支持串口的输入输出[1-2],本文研究使用个人电脑外接USB转串口线来接收信息,通过C#编程,运用电脑做上位机来完成采集分析记录工作。近年来,C#编程已经帮助企业解决了很多工业问题,同时在串口通信领域也有很好的应用前景。
1 Visual Studio数据串口通信
    串口是一种比较简单的通信形式。介绍通过Visual Studio 2010的C#进行编程使得PC能接收串口发来的信息。
    C#是一种强劲的编程语言[3],且Visual Studio也封装了串口收发的模块,这易于实现串口数据采集和处理。这里运用C#创建Windows窗体应用程序,首先在窗体加载时触发串口的读取功能,遍历电脑的每一个串口。在窗体应用程序的combobox预设一系列与串口通信有关的参数,根据所连接的单片机来预先选择正确的参数,通过Button的click属性来读取这些参数打开新的串口连接。随后串口数据送入电脑虚拟的缓存区,完成数据读取工作。
private void Form1_Load(object sender, EventArgs e)
//加载窗体
    {
      comport.ReceivedBytesThreshold=1;
//确定了触发DataReceived事件的阈值,
      foreach(string com in System.IO.Ports.SerialPort.Get-
PortNames())
//遍历并识别所有串口,之后添加至combobox供选择
    }

        comport.BaudRate = int.Parse(cmbBaudRate.Text);
//int.Parse()函数将控件中的字符串转化成了整型数
        comport.DataBits = int.Parse(cmbDataBits.Text);
// 设置各种串口参数
        comport.StopBits=(StopBits)Enum.Parse(typeof
(StopBits), cmbStopBits.Text);
        comport.Parity=(Parity)Enum.Parse(typeof(Parity),
cmbParity.Text);
        comport.PortName=cmbPortName.Text;
        comport.Open();//开启串口
        comport.DiscardInBuffer();
        comport.DiscardOutBuffer();
2 数据的图表显示
    在接收到串口数据之后,还要对串口读入的字节串进行分析判断,这里需要运用C#的控制流来分析字节串的内容,分离出自己需要的字节,再对应各种传感器的信号值与实际监测值的关系单位化后得到实际的工业信息。为了能建立操作指导控制系统[4],方便监测人员更加直观地观测工业设备的状态变化,本文通过C#编程实现数据图表的绘制。在Visual Studio中调用其中的graphic类来操作,通过实例化graphic类,采用画直线的方式建立数据实时的折线图和柱状图。
    (1)折线图的画法
    在picturebox控件中,以次数为横坐标,单位化后的数据为纵坐标不断生成点,依次画直线连接前后生成的两点,待画满图框后自动清屏,实现数据的折线图显示。图1为用该方法记录某次加速度数据的效果。
    (2)柱状图的画法
    在picturebox控件中,以采集数据的序号确立横坐标,单位化后的数据为纵坐标,采取在该坐标点至picturebox底部画粗线,该点至picturebox顶部画与picturebox背景色相同的粗线的方式来刷新柱状图数据。这种图像化的显示可以为工业现场进行直观、多维的指导操作。图2为用该方法画某次加速度数据的效果。


3 数据报警
    一般地,采集的数据值都有一个安全范围,超出了安全范围就会不利于设备的正常使用,所以要采取报警机制来提醒现场人员。这里通过Visual Studio自带的控件——声音控件,用if语句判断,如果在数据值设定的阈值范围外就触发报警音乐。使用PC自带的扬声器发出警报声。
System.Media.SoundPlayer startSoundPlayer=new
System.Media.SoundPlayer(@"C:\Windows\Media\tada.wav");
//实例化音乐并选择报警用音乐

    if(ring == 100 && number1 % 5 == 0)
//当超出安全范围时ring置为100,
为了降低分辨率,每5个数据判断一次
        {
          startSoundPlayer.Play();//出声
        }
4 数据采集记录
    数据的采集和记录是分析数据必不可少的过程。通过串口采集来的数据,往往刷新率不会很高,最大的波特率为115 200。正因为这样,使用Visual Studio开发编程,在PC上就能实现串口数据的采集记录。
    一般地,C#开发人员会优先想到使用文件流来导出数据,但是为了数据查看简便,还有利于将来分析,本文采用连接office办公自动化软件中的Excel[5],因为Excel表格直观,且后续有分析计算的功能。在Visual Studio 2010.net框架下C#编程是完全可以来自动化Excel 2007表格。
    首先要在项目中添加引用Microsoft Excel 12.0 object library,这样就可以调出Excel类。
    在程序开启时就加载Excel应用,创建配置Excel选项:
    object missing = Type.Missing;
    Excel.Application oXL = null;//加载Excel应用
    Excel.Workbooks oWBs = null;
    Excel.Workbook oWB = null;
    Excel.Worksheet oSheet = null;
    Excel.Range oCells = null;//确立单元格
    利用C#的try…catch语句预先在读取数据的代码段中设立好向Excel单元格内填数据的语句。当需要记录时通过button控件触发创建新的Excel文档,这样即执行try{}中的语句往单元格记录数据:
    try { oCells[row / 3, index] = stringx; row += 1; }
//在指定的单元格中记录xyz三组数据,
并更改单元格坐标
    catch { }
    更改单元格坐标就不断继续向Excel里填充由串口接收的数据。
    通过简单设置名为excel和save的两个button控件就可实现建立Excel表格填充数据和触发保存Excel文档的功能。图3是某次加速度数据采集时生成的Excel文档。

    利用开发效率高的Visual Studio来编写上位机程序,在串口数据采集处理方面有着很好的优势,它简化了开发负担,简化了设备。便于一般工程系统的数据采集和处理。
参考文献
[1] 童长飞.C8051F系列单片机开发与C语言编程[M].北京:北京航空航天大学出版社,2005.
[2] 张毅刚,彭喜元.单片机原理及接口技术[M].北京:人民邮电出版社,2008.
[3] STELLMAN A,GREENE J.Head First C#中文版[M].林琪,译.北京:中国电力出版社,2010.
[4] 潘新民,王燕芳.微型计算机控制技术[M].北京:人民邮电出版社,1999.
[5] 微软.C# app automates Excel[CP/OL].[2012-3-2].http://  code.msdn.microsoft.com/CSAutomateExcel-7f89a439.

此内容为AET网站原创,未经授权禁止转载。