快捷搜索:  as  2018  FtCWSyGV  С˵  test  xxx  Ψһ  w3viyKQx

手机下载澳门新葡亰官网_龟发之家论坛



1、基础观点

MS在 .NET FrameWork2.0中对串口通讯进行了封装,我们可以在.net2.0及以上版本开拓时直接应用SerialPort类对串口进行读写操作。

SerialPort类的属性主要包括:

串口名称(PortName)

波特率(BaudRate)

数据位 DataBits

竣事位 StopBits

奇偶校验 Parity

握手协议 Handshake

SerialPort类的事故主要包括:

DataReceived:用于异步接管串口数据

SerialPort类的措檀越要包括:

Open();Close();Read();Write()等。

相关内容可以参考MSDN或者博文

http://www.fengfly.com/plus/view-170971-1.html

http://www.fengfly.com/plus/view-170970-1.html

2、需乞降场景先容

本文是基于之前开拓的一个油站项目,主要功能是实现对加油机数据的采集和对加油机的一手机下载澳门新葡亰官网些节制,例如停开机、设置单价、定量定额加油等操作。

系统经由过程PC机串口,与下位机进行通讯,下位机和加油机进行通讯,认真采集加油机数据和节制加油机的操作。

3手机下载澳门新葡亰官网、设计思惟

(1)在界面设计上,因为系统启动后要始终实时监控加油数据,采纳了SDI展示要领。

截图如下:

(2)在系统设计方面,加油机监控软件具有必然的实时性、稳定性和数据并发的非功能性需求。以是在对加油数据采集时,应用事故DataReceived,用于异步接管串口数据。应用watchdog要领监控系统消息,经由过程缓存池对数据进行过滤,减轻数据库的压力,前进系统机能。

串口通讯数据类:PortData手机下载澳门新葡亰官网ReciveEventArgs

4、代码演示

系统采纳CS布局,应用SerialPort类进行串口通讯。对SerialPort类进行了封装,以包管多个窗体间对串口实例的调用。

封装的串口通讯类参考:http://blog.csdn.net/yefanqiu/archive/2007/03/27/1543187.aspx

串口通讯类:SerialPortDao.cs

/*----------------------------------------------------------------

// Copyright (C) 北京奸淫*科技有限公司

// 版权所有。

//

// 文件名:SerialPortDao

// 文件功能描述:封装串口组件,实现对串口的统一造访和操作

//

//

// 创建标识:** 2009-5-23

//

// 改动标识:**

// 改动描述:

//----------------------------------------------------------------*/

using System;

using System.Collections.Generic;

using System.Text;

using System.IO.Ports;

namespace LY.FuelStationPOS.Protocol

{

///

/// 供给对串口的统一造访

///

public sealed class SerialPortDao

{

#region 事故和字段定义

public event PortDataReceivedEventHandle Received;

public SerialPort serialPort = null;

public bool ReceiveEventFlag = false;//接管事故是否有效 false表示有效

private static readonly SerialPortDao instance = new SerialPortDao();

#endregion

#region 属性定义

private string protName;

public string PortName

{

get { return serialPort.PortName; }

set

{

serialPort.PortName = value;

protName = value;

}

}

#endregion

#region 构造函数

private SerialPortDao()

{

LoadSerialPort();

}

private void LoadSerialPort()

{

serialPort = new Seri手机下载澳门新葡亰官网alPort();

serialPort.BaudRate = 9600;

serialPort.Parity = Parity.Even;

serialPort.DataBits = 8;

serialPort.StopBits = StopBits.One;

serialPort.Handshake = Handshake.None;

serialPort.RtsEnable = true;

serialPort.ReadTimeout = 2000;

serialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceived);

}

#endregion

#region 串口操作聚拢

///

/// 返回串口工具的单个实例

///

///

public static SerialPortDao GetSerialPortDao()

{

return instance;

}

///

/// 开释串口资本

///

~SerialPortDao()

{

Close();

}

///

/// 打开串口

///

public void Open()

{

try

{

if (!serialPort.IsOpen)

{

serialPort.Open();

}

}

catch (Exception ex)

{

throw ex;

}

}

///

/// 关闭串口

///

public void Close()

{

if (serialPort.IsOpen)

{

serialPort.Close();

}

}

///

/// 串口是否打开

///

///

public bool IsOpen()

{

return serialPort.IsOpen;

}

///

/// 数据发送

///

///

要发送的数据字节

public void SendData(byte[] data)

{

try

{

serialPort.DiscardInBuffer();

serialPort.Write(data, 0, data.Length);

}

catch (Exception ex)

{

throw ex;

}

}

///

/// 发送敕令

///

///

发送数据

///

接管数据

///

超韶光阴

///

public int SendCommand(byte[] SendData, ref byte[] ReceiveData, int Overtime)

{

if (serialPort.IsOpen)

{

try

{

ReceiveEventFlag = true;//关闭接管事故

serialPort.DiscardInBuffer();//清空接管缓冲区

serialPort.Write(SendData, 0, SendData.Length);

System.Threading.Thread.Sleep(50);

int num = 0, ret = 0;

while (num++Overtime)

{

if (serialPort.BytesToRead >= ReceiveData.Length)

{

break;

}

System.Threading.Thread.Sleep(50);

}

if (serialPort.BytesToRead >= ReceiveData.Length)

{

ret = serialPort.Read(ReceiveData, 0, ReceiveData.Length);

}

else

{

ret = serialPort.Read(ReceiveData, 0, serialPort.BytesToRead);

}

ReceiveEventFlag = false;//打开事故

return ret;

}

catch (Exception ex)

{

ReceiveEventFlag = false;

throw ex;

}

}

return -1;

}

///

///数据发送

///

///

要手机下载澳门新葡亰官网发送的数据字符串

public void SendData(string data)

{

//禁止接管事故时直接退出

if (ReceiveEventFlag)

{

return;

}

if (serialPort.IsOpen)

{

serialPort.Write(data);

}

}

///

///将指定命量的字节写入输出缓冲区中的指定偏移量处。

///

///

发送的字节数据

///

写入偏移量

///

写入的字节数

public void SendData(byte[] data, int offset, int count)

{

//禁止接管事故时直接退出

if (ReceiveEventFlag)

{

return;

}

if (serialPort.IsOpen)

{

serialPort.Write(data, offset, count);

}

}

///

/// 数据接管

///

///

///

public void DataReceived(object sender, SerialDataReceivedEventArgs e)

{

//禁止接管事故时直接退出

if (ReceiveEventFlag)

{

return;

}

try

{

byte[] data = new byte[serialPort.BytesToRead];

serialPort.Read(data, 0, data.Length);

if (Received != null)

{

Received(sender, new PortDataReciveEventArgs(data));

}

}

catch (Exception ex)

{

//throw ex;

}

}

}

}

您可能还会对下面的文章感兴趣: