串口对象
using System;
using System.Collections.Generic;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace help
{
#region 全局
//====1定义委托============================================
public delegate void WT_串口发送事件(string data);
public delegate void WT_串口接收事件(string data);
#endregion
/// <summary>
/// Help_SerialPort comx = new Help_SerialPort();//串口对象
/// </summary>
public class Help_SerialPort //:SerialPort //继承串口
{// Help_SerialPort comx = new Help_SerialPort();//串口对象
#region 字段
Help_String help_string = new Help_String();// 文本处理
//Timer timer=new Timer();// DateTime.Now.Year
#endregion
#region 属性
//====2生成属性=========================================
//public WT_串口发送事件 wt_串口发送事件=> Help_BaseData.Wt_串口发送事件;
//public WT_串口接收事件 wt_串口接收事件=> Help_BaseData.Wt_串口接收事件;//委托
public static event WT_串口发送事件 wt_串口发送事件;
public static event WT_串口接收事件 wt_串口接收事件;//委托 public delegate void WT_串口接收事件(string data);
public SerialPort serialPort { set; get; }//串口(属性是引用类型)
public static uint read_帧计数 { get; set; }
public string read_下位机数据 { get; set; }
/// <summary>
/// 触发接收事件的字节数
/// </summary>
public int 帧长字节 { get => serialPort.ReceivedBytesThreshold; set => serialPort.ReceivedBytesThreshold = value; }
//public int 帧字节 => serialPort.ReceivedBytesThreshold;
#region get参数
//===get==================================================
public bool isopen { get { return serialPort.IsOpen; } }
public string[] get可用串口 { get { return SerialPort.GetPortNames(); } }
/// <summary>
/// "110","300","600","1200","2400","4800","9600","14400","28800","19200",
/// "38400","56000","57600","115200","230400","460800","921600"
/// </summary>
public string[] get波特率 => new string[]{
"110","300","600","1200","2400","4800","9600","14400","28800","19200",
"38400","56000","57600","115200","230400","460800","921600"};
/// <summary>
/// "5", "6", "7", "8"
/// 数据位的值 5至8。默认8
/// </summary>
public string[] get数据位 { get { return new string[] { "5", "6", "7", "8" }; } }
/// <summary>
/// None Odd Even Mark Space ,
/// None 不发生奇偶校验检查。
/// Odd 设置奇偶校验位,使位数等于奇数。
/// Even 设置奇偶校验位,使位数等于偶数。
/// Mark 将奇偶校验位保留为 1。
/// Space将奇偶校验位保留为 0。
/// </summary>
public string[] get校验位 { get { return Enum.GetNames(typeof(Parity)); } } // 校验位
/// <summary>
/// None One Two OnePointFive 。
/// 0 1 2 1.5
/// </summary>
public string[] get停止位 { get { return Enum.GetNames(typeof(StopBits)); } } //
#endregion
#region set参数
//===set=================================================
/// <summary>
/// serialPort1.PortName = name;
/// </summary>
/// <param name="name"></param>
public void set串口名(string name)
{
try
{
serialPort.PortName = name;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);//显示错误
}
}
/// <summary>
/// serialPort1.BaudRate = Convert.ToInt32(BaudRate, 10);//十进制的
/// </summary>
/// <param name="BaudRate"></param>
public void set波特率(string BaudRate)
{
try
{
serialPort.BaudRate = Convert.ToInt32(BaudRate, 10);//十进制的
}
catch (Exception ex) { MessageBox.Show(ex.Message); }//显示错误
}
/// <summary>
/// serialPort1.DataBits = Convert.ToInt32(DataBits, 10);//十进制的
/// </summary>
/// <param name="DataBits"></param>
public void set数据位(string DataBits)
{
try
{
serialPort.DataBits = Convert.ToInt32(DataBits, 10);//十进制的
}
catch (Exception ex) { MessageBox.Show(ex.Message); }//显示错误
}
/// <summary>
/// serialPort1.Parity = (Parity)Enum.Parse(typeof(Parity), Parity, true);//true 为忽略大小写
/// </summary>
/// <param name="Parity"></param>
public void set校验位(string Parity)
{
try
{
serialPort.Parity = (Parity)Enum.Parse(typeof(Parity), Parity, true);//true 为忽略大小写
//return Enum.GetNames(typeof(Parity));
}
catch (Exception ex) { MessageBox.Show(ex.Message); }//显示错误
}
/// <summary>
/// serialPort1.StopBits = (StopBits)Enum.Parse(typeof(StopBits), StopBits, true);
/// "None" "One" "Two" "OnePointFive"
/// </summary>
/// <param name="StopBits"></param>
public void set停止位(string StopBits)
{
try
{
serialPort.StopBits = (StopBits)Enum.Parse(typeof(StopBits), StopBits, true);
//return Enum.GetNames(typeof(StopBits));
}
catch (Exception ex) { MessageBox.Show(ex.Message); }//显示错误
}
#endregion
#endregion
#region 构造
/// <summary>
/// =Help_BaseData.COMX;//静态 绑定全局变量 串口
/// </summary>
public Help_SerialPort()
{
//serialPort1=cnc.Program.COMX;// 绑定全局变量 串口
serialPort = Help_BaseData.COMX;//静态
serialPort.DataReceived += SerialPort1_DataReceived;//绑定一个委托 接收事件
}
/// <summary>
/// 串口帮助类
/// </summary>
/// <param name="comx">SerialPort 串口 </param>
public Help_SerialPort(SerialPort comx)//类是引用类型
{
serialPort = comx;
serialPort.DataReceived += SerialPort1_DataReceived;//绑定一个委托 接收事件
}
#endregion
#region 自定义方法
/// <summary>
/// 串口接收事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void SerialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{ //throw new NotImplementedException();
int length = serialPort.BytesToRead;//字节长度
if (length == 0) return;//空数据
byte[] buffer = new byte[length];//匹配的数据包
serialPort.Read(buffer, 0, length);//加载数据
//wt_rx(help_string.BytesToHexStrings(buffer));//显示接收数据
//string data= Encoding.UTF8.GetString(buffer);//显示接收数据
string data = help_string.BytesToHexStrings(buffer);
if (data.Length > 0)
{
read_帧计数 += 1;//接收到数据帧
read_下位机数据 = data;//保存下位机接收的数据
//wt_串口接收事件(data);//接收的数据呼叫上层ui
wt_数据呼叫上层(data);
}
}
public void TX_发送数据(byte[] data)//发送
{
try
{
serialPort.Write(data, 0, data.Length);
}
catch (Exception ex) { MessageBox.Show(ex.Message); }//显示错误
}
public void TX_发送数据(string data)//发送
{
try
{
byte[] buffer = Encoding.Default.GetBytes(data);//以计算机的编码发送
serialPort.Write(buffer, 0, buffer.Length);// 开始发送
}
catch (Exception ex) { MessageBox.Show(ex.Message); }//显示错误
}
public void TX_发送命令(byte[] buffer)//发送
{//RS485专用
try
{//显示发送的命令
wt_串口发送事件(help_string.BytesToHexStrings(buffer));//待发送的命令
//Help_SerialPort.serialPort1.Write(buffer, 0, buffer.Length);
serialPort.Write(buffer, 0, buffer.Length);
}
catch (Exception ex) { MessageBox.Show(ex.Message); }//显示错误
}
#endregion
#region WT_委托
//呼叫委托
public void wt_数据呼叫上层(string data)
{
//====3呼叫委托===========================
wt_串口接收事件(data);
}
#endregion
}
#region 串口日志
class C_串口日志
{
#region 字段
//public DateTime sj_数据时间;
public int ff_数据时间;//当前时间的 毫秒
#endregion
#region 属性
public string ff_最后数据内容 { get; set; }
public int 错误帧数 { get; set; }
#endregion
#region 构造
public C_串口日志()
{
ff_数据时间 = DateTime.Now.Millisecond;//当前时间 毫秒
}
#endregion
#region 方法
#endregion
#region 委托
#endregion
}
#endregion
class Help_BaseData //全局
{
public static SerialPort COMX = new SerialPort();// 字段,全局变量,串口
public static event WT_串口发送事件 Wt_串口发送事件;
public static event WT_串口接收事件 Wt_串口接收事件;//委托
//public static WT_串口发送事件 Wt_串口发送事件;
//public static WT_串口接收事件 Wt_串口接收事件;//委托
}
}