DauxiKS107Controller.cs
3.8 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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
using OnlineStore;
using OnlineStore.Common;
using System;
using System.Collections.Generic;
using System.Diagnostics;
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 int Distance;
public DauxiKS107Controller()
{
timer = new System.Timers.Timer(5*1000);
timer.Elapsed += Timer_Elapsed;
timer.AutoReset = true;
}
~DauxiKS107Controller() {
LogUtil.info($"液位传感器退出");
timer.Enabled = false;
if (_serialPort != null) {
_serialPort.Close();
}
}
private void Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
bool readok = true;
for (int i = 0; i < 5; i++)
{
if (Quary(out int value, out string errmsg))
{
Debug.WriteLine($"读取到液位:{value}mm,err:{errmsg}");
readok = true;
if (value > 0)
{
Distance = value;
return;
}
}
else {
readok = false;
}
}
if (!readok)
{
LogUtil.info($"液位传感器读取失败,重新打开");
if (!OpenPort(comPortName, out string errmsg)) {
LogUtil.info($"液位传感器打开失败:"+ errmsg);
}
}
}
/// <summary>
/// 打开串口资源
/// <returns>返回bool类型</returns>
/// </summary>
public bool OpenPort(string _comport,out string errmsg)
{
comPortName = _comport;
//如果串口是打开的,先关闭
if (_serialPort == null)
{
_serialPort = new SerialPort(comPortName, baudRate, parity, dataBits, stopBits);
_serialPort.RtsEnable = true; //自动请求
_serialPort.ReadTimeout = 100;//超时
}
if (_serialPort.IsOpen)
_serialPort.Close();
errmsg = "";
bool ok = false;
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[8];
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
{
errmsg = crc.GetString("Res0170.6832e9a0","返回数据不正确:")+BitConverter.ToString(buf);
return false;
}
}
catch (Exception ex){
errmsg = ex.ToString();
return false;
}
return true;
}
}