using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.IO.Ports;
namespace StandardLibrary
{
interface IUART
{
///
/// 获取或设置串口的串口号
///
string PortName { get; set; }
///
/// 获取或设置波特率
///
int BaudRate { get; set; }
///
/// 获取或设置串口的校验位
///
Parity Parity { get; set; }
///
/// 获取或设置串口的数据位
///
int DataBits { get; set; }
///
/// 获取或设置串口的停止位
///
StopBits StopBits { get; set; }
///
/// 获取串口的打开状态
///
bool OpenStatus { get; }
///
/// 打开串口
///
/// true 打开成功,false 打开失败
bool Open();
///
/// 关闭串口
///
/// true 关闭成功,false 关闭异常
bool Close();
///
/// 发送数据
///
/// 字符串数据
/// true 发送成功,false 发送失败
bool Send(string message);
///
/// 发送数据
///
/// 字节数组数据
/// true 发送成功,false 发送失败
bool Send(byte[] message);
///
/// 接收数据解码
///
/// 接收数据字节数组
void ReceiveDataDecode(byte[] data);
}
public class UART : IUART
{
public int UartIndex;
public object obj = null;
#region 字段
///
/// 实例化串口
///
protected SerialPort serialPort = new SerialPort();
///
/// 接收数据事件
///
public Action ReceiveDataDecodeEvent;
#endregion
#region 属性
///
/// 获取或设置串口的串口号
///
public string PortName
{
get { return serialPort.PortName; }
set { serialPort.PortName = value; }
}
///
/// 获取或设置串口的波特率
///
public int BaudRate
{
get { return serialPort.BaudRate; }
set { serialPort.BaudRate = value; }
}
///
/// 获取或设置串口的校验位
///
public Parity Parity
{
get { return serialPort.Parity; }
set { serialPort.Parity = value; }
}
///
/// 获取或设置串口的数据位
///
public int DataBits
{
get { return serialPort.DataBits; }
set { serialPort.DataBits = value; }
}
///
/// 获取或设置串口的停止位
///
public StopBits StopBits
{
get { return serialPort.StopBits; }
set { serialPort.StopBits = value; }
}
///
/// 获取串口的打开状态
///
public bool OpenStatus
{
get { return serialPort.IsOpen; }
}
#endregion
///
/// 构造函数,设置串口属性及订阅接收事件
///
/// 串口号
/// 波特率
/// 校验位
/// 数据位
/// 停止位
public UART(string portName, int baudRate, Parity parity, int dataBits, StopBits stopBits, int uartIndex)
{
this.UartIndex = uartIndex; //编号
this.PortName = portName; //串口号
this.BaudRate = baudRate; //波特率
this.Parity = parity; //校验位
this.DataBits = dataBits; //数据位
this.StopBits = stopBits; //停止位
serialPort.DataReceived += Received;//订阅串口接收事件
}
///
/// 打开串口
///
/// true 打开成功,false 打开失败
public virtual bool Open()
{
string[] str = SerialPort.GetPortNames(); //获取当前计算机的所有串口号
if (str != null && str.Contains(PortName)) //判断当前计算机是否有串口以及是否存在将要打开的串口
{
try
{
serialPort.ReceivedBytesThreshold = 1; //设置接收事件字节数
if (serialPort.IsOpen) serialPort.Close();
serialPort.Open(); //打开串口
serialPort.DiscardInBuffer(); //清空接收缓存区的数据
return true; //串口打开成功
}
catch (Exception) { return false; } //异常,串口打开失败
}
else { return false; } //当前计算机没有串口或将要打开的串口不存在,串口打开失败
}
///
/// 关闭串口
///
/// true 关闭成功,false 关闭失败
public virtual bool Close()
{
try
{
serialPort.Close(); //关闭串口连接
return true; //关闭成功
}
catch { return false; } //异常,关闭失败
}
///
/// 发送数据
///
/// 字符串数据
/// true 发送成功,false 发送失败
public virtual bool Send(string message)
{
try
{
serialPort.Write(message); //发送字符串数据
return true; //发送成功
}
catch { return false; } //异常,发送失败
}
///
/// 发送数据
///
/// 字节数组数据
/// true 发送成功,false 发送失败
public virtual bool Send(byte[] message)
{
try
{
serialPort.Write(message, 0, message.Length); //发送字节数组数据
return true; //发送成功
}
catch { return false; } //异常,发送失败
}
///
/// 接收数据
///
///
///
//protected virtual void Received(object sender, SerialDataReceivedEventArgs e)
//{
// int length = serialPort.BytesToRead;
// byte[] buf = new byte[length]; //创建接收数据存储区
// serialPort.Read(buf, 0, length); //将接收缓存区中的数据读取到数据存储区
// serialPort.DiscardInBuffer(); //清空接收缓存区的数据
// ReceiveDataDecode(buf); //调用接收数据解码函数,处理接收数据
//}
protected virtual void Received(object sender, SerialDataReceivedEventArgs e)
{
List tempBytes = new List();
while(serialPort.BytesToRead > 0)
{
byte[] buffer = new byte[serialPort.BytesToRead];
serialPort.Read(buffer, 0, buffer.Length);
foreach(byte b in buffer)
{
tempBytes.Add(b);
}
Thread.Sleep(20);
}
byte[] dataBuf = tempBytes.ToArray();
ReceiveDataDecode(dataBuf); //调用接收数据解码函数,处理接收数据
}
///
/// 接收数据解码
///
/// 接收到的数据
public virtual void ReceiveDataDecode(byte[] data)
{
if (ReceiveDataDecodeEvent != null) //判断事件是否被订阅
ReceiveDataDecodeEvent(this.UartIndex,data); //如果被订阅,就发布事件
}
}
}