|
|
@@ -8,6 +8,7 @@ using System.Text;
|
|
|
using static YSAI.Core.data.OperateResult;
|
|
|
using YSAI.Core.@enum;
|
|
|
using YSAI.Core.@interface;
|
|
|
+using System;
|
|
|
|
|
|
namespace YSAI.Core.serialport
|
|
|
{
|
|
|
@@ -68,11 +69,6 @@ namespace YSAI.Core.serialport
|
|
|
/// </summary>
|
|
|
private SerialPort serialPort;
|
|
|
|
|
|
- /// <summary>
|
|
|
- /// 定时器
|
|
|
- /// </summary>
|
|
|
- private System.Timers.Timer ComResponseDataTimer = new System.Timers.Timer();
|
|
|
-
|
|
|
/// <summary>
|
|
|
/// 响应状态
|
|
|
/// </summary>
|
|
|
@@ -222,7 +218,7 @@ namespace YSAI.Core.serialport
|
|
|
/// <summary>
|
|
|
/// 线程安全字典
|
|
|
/// </summary>
|
|
|
- private ConcurrentQueue<byte> Data_buffer = new ConcurrentQueue<byte>();
|
|
|
+ private ConcurrentQueue<byte[]> Data_buffer = new ConcurrentQueue<byte[]>();
|
|
|
|
|
|
/// <summary>
|
|
|
/// 响应数据
|
|
|
@@ -240,11 +236,8 @@ namespace YSAI.Core.serialport
|
|
|
{
|
|
|
byte[] Byte = new byte[BufSize];
|
|
|
serialPort.Read(Byte, 0, BufSize);
|
|
|
- //沾包处理
|
|
|
- foreach (var item in Byte)
|
|
|
- {
|
|
|
- Data_buffer.Enqueue(item);
|
|
|
- }
|
|
|
+ OnEventHandler?.Invoke(this, new EventResult(true, $"接收数据成功", ByteTool.ByteTrimEnd(Byte), ResultType.Bytes));
|
|
|
+
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
@@ -259,41 +252,6 @@ namespace YSAI.Core.serialport
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- /// <summary>
|
|
|
- /// 用于判断 是否还在处理
|
|
|
- /// </summary>
|
|
|
- bool Busy = false;
|
|
|
- //数据粘包处理定时器
|
|
|
- private void ResponseDataTimer_ElapsedEventHandler(object sender, EventArgs e)
|
|
|
- {
|
|
|
- try
|
|
|
- {
|
|
|
- if (Busy)
|
|
|
- {
|
|
|
- return;
|
|
|
- }
|
|
|
- Busy = true;
|
|
|
- List<byte> buffer = new List<byte>();
|
|
|
- if (Data_buffer.Count > 0)
|
|
|
- {
|
|
|
- foreach (var item in Data_buffer)
|
|
|
- {
|
|
|
- buffer.Add(item);
|
|
|
- }
|
|
|
-
|
|
|
- OnEventHandler?.Invoke(this, new EventResult(true, $"[ {SerialPortData.Steps.粘包处理} ]成功", buffer.ToArray(), ResultType.Bytes));
|
|
|
-
|
|
|
- byte result;
|
|
|
- while (Data_buffer.TryDequeue(out result)) { }
|
|
|
- }
|
|
|
- Busy = false;
|
|
|
- }
|
|
|
- catch (Exception ex)
|
|
|
- {
|
|
|
- OnEventHandler?.Invoke(this, new EventResult(false, $"[ {SerialPortData.Steps.粘包处理} ]异常:{ex.Message}"));
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
/// <summary>
|
|
|
/// 获取可用的串口集合
|
|
|
/// </summary>
|
|
|
@@ -336,11 +294,6 @@ namespace YSAI.Core.serialport
|
|
|
//起线程,获取数据
|
|
|
Task.Factory.StartNew(()=> ResponseData());
|
|
|
|
|
|
- //启动定时器,解决数据粘包问题
|
|
|
- ComResponseDataTimer.Interval = 100; //设置毫秒间隔
|
|
|
- ComResponseDataTimer.Start(); //启动
|
|
|
- ComResponseDataTimer.Elapsed += ResponseDataTimer_ElapsedEventHandler; //绑定事件
|
|
|
-
|
|
|
return Break("On", true);
|
|
|
}
|
|
|
catch (Exception ex)
|
|
|
@@ -364,7 +317,6 @@ namespace YSAI.Core.serialport
|
|
|
serialPort.Close();
|
|
|
serialPort.Dispose();
|
|
|
ResponseState = false;
|
|
|
- ComResponseDataTimer.Stop();
|
|
|
return Break("Off", true);
|
|
|
}
|
|
|
}
|