DauxiKS107Controller.cs
3.0 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
using OnlineStore.Common;
using System;
using System.Collections.Generic;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
public class DauxiKS107Controller
{
private static int baudRate =9600;//波特率
private static Parity parity = Parity.None;//校验位
private static int dataBits = 8;//数据位
private static StopBits stopBits = StopBits.One; //停止位
private SerialPort _serialPort = null;
string comPortName;
System.Timers.Timer timer;
public bool IsAlarm;
public DauxiKS107Controller()
{
timer = new System.Timers.Timer(5*60*1000);
timer.Elapsed += Timer_Elapsed;
timer.AutoReset = true;
IsAlarm = false;
}
~DauxiKS107Controller() {
LogUtil.info($"液位传感器退出");
timer.Enabled = false;
if (_serialPort != null) {
_serialPort.Close();
}
}
private void Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
Quary(out int value, out string errmsg);
LogUtil.info($"读取到液位:{value}mm,err:{errmsg}");
if (value > 0)
{
IsAlarm = value < 180;
}
}
/// <summary>
/// 打开串口资源
/// <returns>返回bool类型</returns>
/// </summary>
public bool OpenPort(string _comport,out string errmsg)
{
comPortName = _comport;
_serialPort = new SerialPort(comPortName, baudRate, parity, dataBits, stopBits);
_serialPort.RtsEnable = true; //自动请求
_serialPort.ReadTimeout = 100;//超时
errmsg = "";
bool ok = false;
//如果串口是打开的,先关闭
if (_serialPort.IsOpen)
_serialPort.Close();
try
{
//打开串口
_serialPort.Open();
for (int i = 1; i < 10; i++) {
Thread.Sleep(100);
Quary(out int value, out _);
if (value > 0)
{
timer.Enabled = true;
ok = true;
break;
}
}
}
catch (Exception Ex)
{
errmsg = Ex.ToString();
//throw Ex;
}
return ok;
}
static byte[] quarycommand = new byte[] { 0xe8, 0x02, 0xb0 };
public bool Quary(out int value, out string errmsg) {
errmsg = "";
byte[] buf = new byte[50];
value = 0;
try
{
_serialPort.Write(quarycommand, 0, quarycommand.Length);
Thread.Sleep(10);
var readlen = _serialPort.Read(buf, 0, buf.Length);
if (readlen >= 2)
{
var c = new byte[] { buf[1], buf[0] };
value = (int)BitConverter.ToUInt16(c, 0);
}
else
{
return false;
}
}
catch (Exception ex){
errmsg = ex.ToString();
return false;
}
return true;
}
}